我试图弄清楚如何在调用类似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。
答案 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,给出了描述的奇怪行为。