在调用调试器之后,我试图弄清楚如何在sbcl和Slime中逐步执行代码,比如中断。我不想从一开始就开始。例如,如果我有以下代码:
(defun fib (n)
(when (eql n 2)
(break))
(if (<= 0 n 1)
n
(+ (fib (- n 1))
(fib (- n 2)))))在命中断点后,我希望能够开始执行代码。我发现这样做的唯一方法是在Slime中检查框架,使用“从框架返回”(R)功能,并输入(步骤(fib 2))。
当我尝试使用"Step“特性而不是实际的步进时,我会得到以下信息:
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宏或调试器中的调用。
我正在使用SLAM2.12运行sbcl1.2.5,除了安全性和调试之外,我的优化质量都是1,这两者都是3。
发布于 2015-01-21 17:07:07
我编译了swank,并将调试设置为3。因此,当我在中断后执行步骤时,它将进入swank,给出描述的奇怪行为。
发布于 2016-02-19 13:22:46
自从我开始学习普通的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中,但此更改对步骤调试问题没有影响)(我还尝试在(declaim (optimize (debug 0)))中设置.sbclrc,然后重新启动slime,但据我所知,这是行不通的)。
更新:
“在中断点被击中后,我希望能够开始逐步完成代码。我找到这样做的唯一方法是检查Slime的框架,使用”从框架返回“(R)功能,并输入(步骤(fib 2))。”
您实际上可以直接按s!不需要从框架返回,只需在休息后按s。请注意,要使其工作,您必须在初始化文件中包含(proclaim (optimize (debug 3))) (例如。.sbclrc)
https://stackoverflow.com/questions/27889989
复制相似问题