5

我正在寻找一种更好的技术来做到这一点。我的一般斗争是调试器进入太晚或太早而无法捕捉变量值的事实。

我首先尝试的是:

(loop for i from 0 to 10 do
  (break))

当调试器进入中断时,我无法访问i:(所以这是一种浪费的努力。我已经尝试过e调试器的选项(框架中的eval),但SLIME通常只是出错,我必须重新连接到SWANK。v或者t不要' t 帮助,因为变量只是“不存在”。

我最终做了什么:

(loop for i from 0 to 10 do
  (signal i))

这很愚蠢,但很有效,因为它放在i了我可以在调试器中检查的帧的堆栈上。但这只是……好吧,从最糟糕的意义上来说,这是骇人听闻的。是不是有某种方法可以“观察”一个变量,或者有一种更有意义的方式来放置断点,这样我就可以在输入断点的地方看到更多的变量?

4

1 回答 1

4

你的第一个片段对我来说很好用 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)))

于 2012-12-11T21:28:11.607 回答