从调试器中进入sbcl

时间:2015-01-11 17:29:49

标签: debugging lisp common-lisp sbcl slime

我试图弄清楚如何在调用类似break的调试器后逐步执行sbcl和Slime中的代码。我不想从头开始踩踏。例如,如果我有以下代码:

(defun fib (n)
  (when (eql n 2)
    (break))
  (if (<= 0 n 1)
      n
      (+ (fib (- n 1))
         (fib (- n 2)))))

在达到断点后,我希望能够开始逐步完成代码。我发现这样做的唯一方法是在Slime中查看框架,使用&#34;从框架返回&#34; (R)特征,并输入(步骤(fib 2))。

当我尝试使用&#34; Step&#34; (s)功能,而不是实际踩踏,我得到了这个:

Evaluating call:
  (CONTINUE)
With arguments:
   [Condition of type STEP-FORM-CONDITION]

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: [ABORT] Return to sldb level 1.
 5: [CONTINUE] Return from BREAK.
 --more--

Backtrace:
  0: (SWANK:SLDB-STEP 0)
  1: (SB-INT:SIMPLE-EVAL-IN-LEXENV (SWANK:SLDB-STEP 0) #<NULL-LEXENV>)
  2: (EVAL (SWANK:SLDB-STEP 0))
  3: (SWANK:EVAL-FOR-EMACS (SWANK:SLDB-STEP 0) "COMMON-LISP-USER" 122)
  4: ((FLET #:FORM-FUN-7055 :IN SWANK::SLDB-LOOP))
  5: (SWANK::SLDB-LOOP 1)
  6: ((LAMBDA NIL :IN SWANK::DEBUG-IN-EMACS))
  7: ((FLET SWANK/BACKEND:CALL-WITH-DEBUGGING-ENVIRONMENT :IN "/home/michael/slime/swank/sbcl.lisp") #<FUNCTION (LAMBDA NIL :IN SWANK::DEBUG-IN-EMACS) {1003DB44CB}>)

我正在寻找的应该是可能的。从sbcl手动步骤

  

可以通过step宏调用,也可以通过调试器调用

我正在使用Slime 2.12运行sbcl 1.2.5并且我的优化质量都是1,除了安全和调试都是3。

2 个答案:

答案 0 :(得分:2)

自从我开始学习常见的lisp以来,我一直在努力尝试进行步骤调试工作。在阅读了这篇精美的教程debugging with slime后,我想给步调试器一个机会...... 这就是我重新编译swank所做的事情(直到最后才尝试自己):

在终端中开始新的sbcl会话:

rlwrap sbcl
ran the following
(declaim (optimize (debug 0)))
(asdf:load-system :swank :force t)
; then i noticed in the messages that it doesn't compile all the files
; compiling file "/home/smokeink/quicklisp/dists/quicklisp/software/slime-2.14/swank-loader.lisp"
; /home/smokeink/.cache/common-lisp/sbcl-1.3.0-linux-x64/home/smokeink/quicklisp/dists/quicklisp/software/slime-2.14/swank-loader-TMP.fasl written
; then i tried:
(compile-file "~/.emacs.d/elpa/slime-20150623.821/swank.lisp")
; compiling...
; ~/.emacs.d/elpa/slime-20150623.821/swank.fasl written

那不行,所以我采取了另一种方法,我把它添加到swank.lisp:

; ...
(in-package :swank)
; added the following line
(declaim (optimize (debug 0)))
; ...

重新启动粘液,它重新编译了一些文件,然后按预期工作了。

(请注意,在执行上述操作之前,我还更改了

(declaim (optimize (debug 2)
                   (sb-c::insert-step-conditions 0)
                   (sb-c::insert-debug-catch 0)))
to
(declaim (optimize (debug 0)
                   (sb-c::insert-step-conditions 0)
                   (sb-c::insert-debug-catch 0)))

在swank / sbcl.lisp中, 但是这个改变对步骤调试问题没有影响) (我还尝试在.sbclrc中设置(declaim (optimize (debug 0))),然后重新启动粘液,但据我记忆,这不起作用。)

更新

  

&#34;在破发点被击中后,我希望能够开始踩踏   通过代码。我发现这样做的唯一方法就是过去   在Slime中的框架,使用&#34;从框架返回&#34; (R)功能和类型   in(step(fib 2))。&#34;

你可以按s直接进行!无需返回框架,只需在休息后按s即可。请注意,要使其工作,您的初始化文件中必须有(proclaim (optimize (debug 3)))(例如.sbclrc)

答案 1 :(得分:1)

我编译了swank,调试设置为3.因此,当我在休息后继续步骤时,它将进入swank,给出了描述的奇怪行为。