我正在寻找一种更好的技术来做到这一点。我的普遍问题是调试器进入太晚或太早而无法捕获变量的值。
我首先尝试的是:
(loop for i from 0 to 10 do
(break))
当调试器进入中断时,我无法访问
i
:( 所以这是白费力气。我试过 e
调试器选项(框架中的 eval),但 SLIME 通常只是出问题,我必须重新连接到 SWANK。v
或 t
没有帮助,因为变量只是“不存在”。我最终做了什么:
(loop for i from 0 to 10 do
(signal i))
这是愚蠢的,但有效,因为它把
i
在帧的堆栈上,我可以在调试器中检查。但这只是......好吧,从最糟糕的意义上说,这是一种骇人听闻的做法。有没有办法“观察”一个变量,或者有一种更有意义的方式来放置断点,这样我就可以在输入断点的地方看到更多的变量?
最佳答案
你的第一个片段对我来说很好用 CCL(默认 optimize
设置)、Emacs 24 和最近拉出的 Slime:
Break
[Condition of type SIMPLE-CONDITION]
Restarts:
0: [CONTINUE] Return from BREAK.
1: [RETRY] Retry SLIME REPL evaluation request.
2: [*ABORT] Return to SLIME's top level.
3: [ABORT-BREAK] Reset this thread
4: [ABORT] Kill this thread
Backtrace:
0: (#<Anonymous Function #x186F9B7E>)
Locals:
I = 0
1: (CCL::CHEAP-EVAL (LOOP FOR I FROM 0 TO 10 DO (BREAK)))
⋮
sldb-eval-in-frame
对我来说也很好用。也许您应该尝试不同的 Lisp 实现或不同版本的 Slime。另外,请注意不同的
optimize
设置在这里可能很重要,并且一些实现为解释代码提供了更好的调试结果(如果解释器可用,那就是)。尝试类似 (declaim (optimize (debug 3) (speed 0) (space 0)))
.
关于emacs - 在 Slime 调试器中检查局部变量的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13772246/