【发布时间】:2020-12-16 17:24:41
【问题描述】:
我的~/.sbclrc 看起来像这样:
(sb-ext:restrict-compiler-policy 'debug 3)
(setf *debugger-hook* #'(lambda (condition original-hook)
(declare (ignore original-hook))
(print-backtrace)
(format *error-output* "~%~A~%" condition)
(finish-output *error-output*)
(abort)))
假设我有一个程序 my-program.lisp 包含一个错误的函数:
;; ...
(defun calculate (x)
(/ x 0))
;; ...
如果我跑步:
$ sbcl --load my-program.lisp
* (calculate 100)
我收到此错误:
Backtrace for: #<SB-THREAD:THREAD "main thread" RUNNING {10005E85B3}>
0: (SB-KERNEL::INTEGER-/-INTEGER 100 0)
1: (CALCULATE 100)
2: (SB-INT:SIMPLE-EVAL-IN-LEXENV (CALCULATE 100) #<NULL-LEXENV>)
3: (EVAL (CALCULATE 100))
4: (INTERACTIVE-EVAL (CALCULATE 100) :EVAL NIL)
5: (SB-IMPL::REPL-FUN NIL)
6: ((LAMBDA NIL :IN SB-IMPL::TOPLEVEL-REPL))
7: (SB-IMPL::%WITH-REBOUND-IO-SYNTAX #<CLOSURE (LAMBDA NIL :IN SB-IMPL::TOPLEVEL-REPL) {10046268FB}>)
8: (SB-IMPL::TOPLEVEL-REPL NIL)
9: (SB-IMPL::TOPLEVEL-INIT)
10: ((FLET SB-UNIX::BODY :IN SAVE-LISP-AND-DIE))
11: ((FLET "WITHOUT-INTERRUPTS-BODY-36" :IN SAVE-LISP-AND-DIE))
12: ((LABELS SB-IMPL::RESTART-LISP :IN SAVE-LISP-AND-DIE))
arithmetic error DIVISION-BY-ZERO signalled
Operation was (/ 100 0).
但是运行时错误的行号和源文件在哪里呢?想象一下,如果我有数百个文件和数千个函数。知道错误的文件、行号和列号会不会有帮助?如何显示错误的行号和源文件?
我很惊讶这种编程语言在默认情况下没有这个功能,而几乎所有其他解释器和编译器都能够轻松做到这一点。
【问题讨论】:
-
一个 new discussion 带有指向 bissect 的指针,“如果由实现提供,可以为您提供行号信息。”
标签: common-lisp sbcl