我正在寻找一种更好的技术来做到这一点.我的一般困难是调试器进入太晚或太早以至于无法捕获变量的值.
我先尝试了什么:
(loop for i from 0 to 10 do
(break))
当调试器进入休息时,我无法访问i :(所以这是一个浪费的努力.我已经尝试了调试器的选项(eval in frame),但是SLIME通常只是错误,我必须重新连接到SWANK.或者没有帮助,因为变量只是“不存在”.
我最终做了什么:
(loop for i from 0 to 10 do
(signal 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))).