Using errortrace with repl-driven-development?

57 views
Skip to first unread message

Anthony Quizon

unread,
Jul 23, 2019, 9:45:47 PM7/23/19
to Racket Users
I've been trying to find a way to get better error messages in the racket repl via the command line.
Specifically, better stack traces. At the moment, if you load a file in the repl via ',enter' it doesn't give you any information about the line number for errors.

I've looked around in the users group but could only find:
racket -l errortrace -t <filename>.rkt

This is pretty much what I'm looking for except that it only lets me use this once and non-interactively.

Is there an option in the (x)repl that lets me use errortrace interactively for each input?

Anthony Quizon

unread,
Jul 23, 2019, 10:08:45 PM7/23/19
to Racket Users
Would using 'racket/trace' be a valid way to do this?

(require racket/trace)

(define (foo) ...)

(trace foo)

;; in repl (foo) then ,bt


Would it be correct to say that the error traces functionality has been delegated to libraries in order to make things more flexible? (Rather than baked into the repl)

Alex Harsanyi

unread,
Jul 23, 2019, 10:43:27 PM7/23/19
to Racket Users
If you are using DrRacket, you can go to the "Language/Choose Language..." menu, click on "Show Details", than make sure the "Preserve Stack Trace" checkbox is ticked.

If you are using racket-mode in Emacs, you can evaluate the current buffer using "C-u F5" which will do the same thing.

If you use racket from the command line, I think you can run it as:

    racket -l errortrace -l racket -i

Hope this helps,
Alex.

Robby Findler

unread,
Jul 23, 2019, 10:48:42 PM7/23/19
to Alex Harsanyi, Racket Users
In DrRacket, the "preserve stack trace" button actually corresponds to a mode in the compiler that disables some optimizations [*]. The radio buttons at the top (specifically the debugging one) control errortrace. 

Robby


--
You received this message because you are subscribed to the Google Groups "Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to racket-users...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/racket-users/4cd2db48-0520-4d4b-b144-83b1e7badc1c%40googlegroups.com.

Anthony Quizon

unread,
Jul 24, 2019, 6:36:27 AM7/24/19
to Racket Users

Thanks! This one was what is needed.

    racket -l errortrace -l racket -i

Actually, I tried this on my own before but I kept on getting "(no backtrace)" when I would run my file.
Turns out, you can only get the stacktrace if you run the code via the repl input rather than running code within the file (ie. using ",en")

Shu-Hung You

unread,
Jul 24, 2019, 1:38:35 PM7/24/19
to Anthony Quizon, Racket Users
errortrace with ,en should work as normal, as long as you ensure that
there are no pre-compiled bytecode files (compiled/*.zo):

$ ls
myfile.rkt
$ racket -l errortrace -i
Welcome to Racket v7.2.
> ,en "myfile.rkt"
"myfile.rkt"> (f 123)
; g: 123 [,bt for context]
"myfile.rkt"> ,bt
; g: 123
; errortrace...:
; /tmp/ram2/debug/myfile.rkt:6:2: (error (quote g) "~a" n)
; /tmp/ram2/debug/myfile.rkt:3:2: (+ (g x) (g (+ 2 x)))
......

If myfile.rkt is precompiled then errortrace wouldn't have the chance
to instrument it with backtrace information:

$ raco make myfile.rkt && ls *
myfile.rkt

compiled:
myfile_rkt.dep myfile_rkt.zo
$ racket -l errortrace -i
Welcome to Racket v7.2.
> ,en "myfile.rkt"
"myfile.rkt"> (f 456)
; g: 456 [,bt for context]
"myfile.rkt"> ,bt
; g: 456
; errortrace...:
; readline-input:2:0: (f 456)
......
> --
> You received this message because you are subscribed to the Google Groups "Racket Users" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to racket-users...@googlegroups.com.
> To view this discussion on the web visit https://groups.google.com/d/msgid/racket-users/650ddb71-44ca-4758-bd08-a2b606a2f5b0%40googlegroups.com.

Anthony Quizon

unread,
Jul 24, 2019, 6:47:51 PM7/24/19
to Racket Users
Thanks, but actually I think my problem was that I wasn't invoking the function in the repl itself.

;; myfile.rkt
...

(f 123) ;; top-level invocation doesnt produce proper stacktraces in repl


but when I typed it in the repl it was ok
> ,en "myfile.rkt"
"myfile.rkt"> (f 456)
; ...stacktrace...
> To unsubscribe from this group and stop receiving emails from it, send an email to racket...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages