Debugging 从调试器内单步输入sbcl

Debugging 从调试器内单步输入sbcl,debugging,lisp,common-lisp,sbcl,slime,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))))) (定义fib(n) (当(eql n 2) (休息) (如果(我编译了swank,调试设置为3。正因为如此,当我在

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

(defun fib (n)
  (when (eql n 2)
    (break))
  (if (<= 0 n 1)
      n
      (+ (fib (- n 1))
         (fib (- n 2)))))
(定义fib(n)
(当(eql n 2)
(休息)

(如果(我编译了swank,调试设置为3。正因为如此,当我在中断后进行单步调试时,它会进入swank,给出所描述的奇怪行为。

自从我开始学习common lisp以来,我一直在努力使单步调试工作正常。在阅读了这篇漂亮的教程后,我想到进行单步调试再给我一次机会。。。 这就是我为重新编译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)))
; ...
重新启动slime后,它重新编译了一些文件,然后按预期工作

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

(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)))
,然后重新启动slime,但据我记忆所及,这不起作用。)

更新: “在达到断点后,我希望能够开始迈步 通过代码。我找到的唯一方法是 在Slime中的帧,使用“从帧返回”(R)功能,然后键入 在(步骤(fib 2))中。”


实际上,您可以直接按s键继续操作!无需从帧返回,只需在中断发生后按s键即可。请注意,要使其正常工作,您必须在初始化文件(例如.sbclrc)中包含
(宣告(优化(调试3)))

这真是断章取义,听起来像是一个bug或是一个支持请求。你试过在freenode或SLIME邮件列表的IRC#lisp频道提问吗?这似乎与SBCL没有直接关系,因为你似乎没有尝试在没有SLIME的情况下介入。
(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)))