【问题标题】:Stepping in sbcl from within the debugger从调试器中单步执行 sbcl
【发布时间】:2015-03-09 12:15:52
【问题描述】:

在使用诸如 break 之类的调用调试器后,我试图弄清楚如何单步执行 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”(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。

【问题讨论】:

  • 这真的是断章取义,听起来像是一个错误或支持请求。您是否尝试过在 freenode 的 IRC #lisp 频道或 SLIME 的邮件列表中提问?它似乎与 SBCL 没有直接关系,因为您似乎没有尝试在没有 SLIME 的情况下踏入它。

标签: debugging lisp common-lisp sbcl slime


【解决方案1】:

自从我开始学习 common lisp 以来,我一直在努力尝试使 step 调试工作。在阅读了这篇漂亮的教程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)))
; ...

重新启动 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。请注意,要使其正常工作,您的初始化文件中必须有 (proclaim (optimize (debug 3)))(例如 .sbclrc)

【讨论】:

    【解决方案2】:

    我已经编译了 swank,并将 debug 设置为 3。因此,当我在 break 之后单步执行时,它会进入 swank,给出所描述的奇怪行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-21
      • 2014-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多