【发布时间】:2019-02-10 06:33:09
【问题描述】:
我正在 iMac 上使用 sbcl 和 slime 编写 Common LISP 代码。 我可以通过在代码行之间插入(中断)或使用(步骤)函数调用来调用 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 时,我找不到如何做到这一点。
【问题讨论】:
-
这不是 Emacs 的内置调试器。它是 GNU Emacs 中的 SLIME 调试器。如果您能提出一个可重现的代码示例以及您在回溯中看不到的变量,那将会很有用。
-
不知道SBCL是不是也这样,但是当我调试一个CCL程序时,通常调试器中没有出现的变量还没有绑定,所以又是一个提示发生错误的位置(就在绑定第一个缺失变量之前)。
-
这个代码在这个星期二之前应该是私有的,很抱歉现在不能上传,但我会在下周上传,以显示哪个变量现在在调试器中显示在哪个代码中。
-
@Renzo 因为绑定的所有变量都会显示在调试器中,所以 slime 调试器不提供“监视”功能。我理解对了吗?
-
@imgnpoints,我想是的。以let中的有界变量为例,如果只显示一部分,则说明错误出在后面的变量初始化中。
标签: debugging common-lisp sbcl slime backtrace