emacs – 检查SLIME调试器中局部变量的值?

我正在寻找一种更好的技术来做到这一点.我的一般困难是调试器进入太晚或太早以至于无法捕获变量的值.

我先尝试了什么:

(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))).

点赞