我正在我的iMac上用sbcl和slime编写Common LISP代码。我可以通过在代码行之间插入(break)或使用(step)函数调用Emacs内置调试器。下面是调试过程的步骤。
Restarts:
0: [STEP-CONTINUE] Resume normal execution
1: [STEP-OUT] Resume stepping after returning from this function
2: [STEP-NEXT] Step over call
3: [STEP-INTO] Step into call
4: [RETRY] Retry SLIME REPL evaluation request.
5: [*ABORT] Return to SLIME's top level.
--more--
Backtrace:
0: ((LABELS RECURSE :IN PARTIAL-EVAL) X)
Locals:
BINDINGS = ((A . 3) (X . 0) (Y . 2))
EXP = X
#:G0 = X
1: (SB-KERNEL:%MAP-TO-LIST-ARITY-1 #<CLOSURE (LABELS RECURSE :IN PARTIAL-EVAL) {1002A9614B}> (A X (- C C) (- 9 9) (+ Z (/ A 3 #) (- Y # Z))))
2: ((LABELS RECURSE :IN PARTIAL-EVAL) (- A X (- C C) (- 9 9) (+ Z (/ A 3 #) (- Y # Z))))
Locals:
ARGS#1 = (A X (- C C) (- 9 9) (+ Z (/ A 3 (/ B)) (- Y (* A 1) Z)))
BINDINGS = ((A . 3) (X . 0) (Y . 2))
EXP = (- A X (- C C) (- 9 9) (+ Z (/ A 3 (/ B)) (- Y (* A 1) Z)))
#:G0 = (- A X (- C C) (- 9 9) (+ Z (/ A 3 (/ B)) (- Y (* A 1) Z)))
#:G5 = (A X (- C C) (- 9 9) (+ Z (/ A 3 (/ B)) (- Y (* A 1) Z)))
OP = -
3: (SB-KERNEL:%MAP-TO-LIST-ARITY-1 #<CLOSURE (LABELS RECURSE :IN PARTIAL-EVAL) {1002A9614B}> (1 (- A X (- C C) (- 9 9) (+ Z # #))))
4: ((LABELS RECURSE :IN PARTIAL-EVAL) (/ 1 (- A X (- C C) (- 9 9) (+ Z # #))))
Locals:
ARGS#1 = (1 (- A X (- C C) (- 9 9) (+ Z (/ A 3 #) (- Y # Z))))
BINDINGS = ((A . 3) (X . 0) (Y . 2))
EXP = (/ 1 (- A X (- C C) (- 9 9) (+ Z (/ A 3 #) (- Y # Z))))
#:G0 = (/ 1 (- A X (- C C) (- 9 9) (+ Z (/ A 3 #) (- Y # Z))))
#:G5 = (1 (- A X (- C C) (- 9 9) (+ Z (/ A 3 #) (- Y # Z))))
OP = /
5: (PARTIAL-EVAL (/ 1 (- A X (- C C) (- 9 9) (+ Z # #))) ((A . 3) (X . 0) (Y . 2)))
6: ((LAMBDA (&REST SB-DI::ARGS) :IN SB-DI::HANDLE-SINGLE-STEP-AROUND-TRAP) (/ 1 (- A X (- C C) (- 9 9) (+ Z # #))) ((A . 3) (X . 0) (Y . 2)))
7: ((LAMBDA ()))
8: (SB-INT:SIMPLE-EVAL-IN-LEXENV (LET ((SB-IMPL::*STEP-OUT* :MAYBE)) (UNWIND-PROTECT (SB-IMPL::WITH-STEPPING-ENABLED #))) #S(SB-KERNEL:LEXENV :FUNS NIL :VARS NIL :BLOCKS NIL :TAGS NIL :TYPE-RESTRICTIONS ..
9: (SB-INT:SIMPLE-EVAL-IN-LEXENV (STEP (PARTIAL-EVAL (QUOTE #) (QUOTE #))) #<NULL-LEXENV>)
10: (EVAL (STEP (PARTIAL-EVAL (QUOTE #) (QUOTE #))))
--more--当我展开每个堆栈时,我可以跟踪和查看一些局部变量,但不能跟踪和查看所有局部变量。如何将这些缺失的局部变量添加到监视列表中?当我使用其他IDE时,监视变量非常容易,但是使用Emacs时,我找不到如何做到这一点。
发布于 2019-02-11 21:07:37
有可能是编译器优化了一些东西,从而隐藏了中间变量。你可以试一试
(declaim (optimize (speed 0) (space 0) (debug 3)))(并重新编译您的代码)
https://lispcookbook.github.io/cl-cookbook/debugging.html#the-interactive-debugger
您还谈到了“监视”调试器函数:它在SBCL中不可用,但在其他实现(如LispWorks)中可用。https://lispcookbook.github.io/cl-cookbook/debugging.html#advise-and-watch
发布于 2019-02-11 23:22:53
正如我在评论中所说的,一种可能是调试器中没有出现的变量还没有被绑定。例如,在像LET这样的内部构造中,当引入几个词法变量并将其绑定到某个值时,如果调试器中只显示了其中的几个变量,这可能意味着在计算第一个变量的初始化形式时发生了错误,没有显示。
当然,这也取决于运行时系统(编译器或解释器),因此遵循Evhince的建议并适当地设置优化选项是一个好主意。
https://stackoverflow.com/questions/54613964
复制相似问题