我试图弄清楚在使用诸如break之类的调试器调用调试器后,如何单步执行sbcl和Slime中的代码。我不想从头开始。例如,如果我有以下代码:
(defun fib (n)
(when (eql n 2)
(break))
(if (<= 0 n 1)
n
(+ (fib (- n 1))
(fib (- n 2)))))
到达断点后,我希望能够开始逐步执行代码。我发现做到这一点的唯一方法是,在“Slime”中移过帧,使用“从帧返回”(R)功能,然后输入(步骤(图2))。
当我尝试使用“步进”功能而不是实际步进时,得到以下提示:
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手动步进
我正在使用Slime 2.12运行sbcl 1.2.5,除安全性和调试均为3之外,我的优化质量均为1。
最佳答案
自从我开始学习通用Lisp以来,我一直在努力尝试逐步调试工作。看完这个漂亮的教程debugging with slime之后,我想到了给步进调试器再一次机会...
这是我重新编译swank的方法(尝试之前请仔细阅读直至最后):
在终端中启动了一个新的sbcl session :
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
该DID不起作用,所以我尝试了另一种方法,将其添加到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)))
,然后重新启动史莱姆,但据我所知,这没有用。)更新:
实际上,您可以直接按s继续!无需从框架返回,只需在中断发生后按s即可。请注意,要执行此操作,您必须在初始化文件(例如.sbclrc)中包含
(proclaim (optimize (debug 3)))
关于debugging - 从调试器中进入sbcl,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27889989/