gpt4 book ai didi

debugging - 从调试器中进入 sbcl

转载 作者:太空宇宙 更新时间:2023-11-03 18:38:31 24 4
gpt4 key购买 nike

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

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

遇到断点后,我希望能够开始单步执行代码。我发现这样做的唯一方法是遍历 Slime 中的框架,使用“从框架返回”(R) 功能,然后输入 (step (fib 2))。

当我尝试使用“步进”(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 手动步进

can be invoked via the step macro, or from within the debugger.

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

最佳答案

自从我开始学习 common 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

那没有用,所以我采用了另一种方法,我将其添加到 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 但据我所知,这没有用。)

更新:

"After the break point is hit, I want to be able to start stepping through the code. The only way I have found to do this, is to go over the frame in Slime, use the "Return From Frame" (R) feature, and type in (step (fib 2))."

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

关于debugging - 从调试器中进入 sbcl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27889989/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com