如何观看Emacs的局部变量内置的Common Lisp的调试器?

问题描述 投票:1回答:2

我正在写与SBCL和泥在我的iMac电脑的Common Lisp代码。我可以调用的Emacs内置的调试器通过插入之间的代码行(断裂)或用(步骤)函数调用。下面是调试程序的步骤。

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: [RETRY] Retry SLIME REPL evaluation request.
 5: [*ABORT] Return to SLIME's top level.
 --more--

Backtrace:
  0: ((LABELS RECURSE :IN PARTIAL-EVAL) X)
      Locals:
        BINDINGS = ((A . 3) (X . 0) (Y . 2))
        EXP = X
        #:G0 = X
  1: (SB-KERNEL:%MAP-TO-LIST-ARITY-1 #<CLOSURE (LABELS RECURSE :IN PARTIAL-EVAL) {1002A9614B}> (A X (- C C) (- 9 9) (+ Z (/ A 3 #) (- Y # Z))))
  2: ((LABELS RECURSE :IN PARTIAL-EVAL) (- A X (- C C) (- 9 9) (+ Z (/ A 3 #) (- Y # Z))))
      Locals:
        ARGS#1 = (A X (- C C) (- 9 9) (+ Z (/ A 3 (/ B)) (- Y (* A 1) Z)))
        BINDINGS = ((A . 3) (X . 0) (Y . 2))
        EXP = (- A X (- C C) (- 9 9) (+ Z (/ A 3 (/ B)) (- Y (* A 1) Z)))
        #:G0 = (- A X (- C C) (- 9 9) (+ Z (/ A 3 (/ B)) (- Y (* A 1) Z)))
        #:G5 = (A X (- C C) (- 9 9) (+ Z (/ A 3 (/ B)) (- Y (* A 1) Z)))
        OP = -
  3: (SB-KERNEL:%MAP-TO-LIST-ARITY-1 #<CLOSURE (LABELS RECURSE :IN PARTIAL-EVAL) {1002A9614B}> (1 (- A X (- C C) (- 9 9) (+ Z # #))))
  4: ((LABELS RECURSE :IN PARTIAL-EVAL) (/ 1 (- A X (- C C) (- 9 9) (+ Z # #))))
      Locals:
        ARGS#1 = (1 (- A X (- C C) (- 9 9) (+ Z (/ A 3 #) (- Y # Z))))
        BINDINGS = ((A . 3) (X . 0) (Y . 2))
        EXP = (/ 1 (- A X (- C C) (- 9 9) (+ Z (/ A 3 #) (- Y # Z))))
        #:G0 = (/ 1 (- A X (- C C) (- 9 9) (+ Z (/ A 3 #) (- Y # Z))))
        #:G5 = (1 (- A X (- C C) (- 9 9) (+ Z (/ A 3 #) (- Y # Z))))
        OP = /
  5: (PARTIAL-EVAL (/ 1 (- A X (- C C) (- 9 9) (+ Z # #))) ((A . 3) (X . 0) (Y . 2)))
  6: ((LAMBDA (&REST SB-DI::ARGS) :IN SB-DI::HANDLE-SINGLE-STEP-AROUND-TRAP) (/ 1 (- A X (- C C) (- 9 9) (+ Z # #))) ((A . 3) (X . 0) (Y . 2)))
  7: ((LAMBDA ()))
  8: (SB-INT:SIMPLE-EVAL-IN-LEXENV (LET ((SB-IMPL::*STEP-OUT* :MAYBE)) (UNWIND-PROTECT (SB-IMPL::WITH-STEPPING-ENABLED #))) #S(SB-KERNEL:LEXENV :FUNS NIL :VARS NIL :BLOCKS NIL :TAGS NIL :TYPE-RESTRICTIONS ..
  9: (SB-INT:SIMPLE-EVAL-IN-LEXENV (STEP (PARTIAL-EVAL (QUOTE #) (QUOTE #))) #<NULL-LEXENV>)
 10: (EVAL (STEP (PARTIAL-EVAL (QUOTE #) (QUOTE #))))
 --more--

当我展开每个堆栈,我可以跟踪和看到一些局部变量,但不是所有的局部变量。我怎样才能添加这些缺少的局部变量来观察名单?当我使用其他IDE,观察变量是超级简单,但使用Emacs,我没有找到如何做到这一点。

debugging common-lisp sbcl slime backtrace
2个回答
2
投票

可能的是,编译器优化的东西出来并且因此隐藏了中间变量。你可以试试

(declaim (optimize (speed 0) (space 0) (debug 3)))

(和重新编译代码)

https://lispcookbook.github.io/cl-cookbook/debugging.html#the-interactive-debugger

你还谈到了“看”在线调试功能:它不是在SBCL有,但它在其它实现(如LispWorks)。 https://lispcookbook.github.io/cl-cookbook/debugging.html#advise-and-watch


2
投票

正如我在评论说,一个可能性是,没有出现在调试器中的变量尚未约束。例如,内部构造像LET,当几个词法变量进行了介绍和界定为某个值,如果只有他们几个在调试器中显示,这可能意味着,在第一次的初始化形式的评价发生了错误可变未示出。

当然,这也取决于运行时系统(编译器或解释),因此它是遵循Evhince的意见,并设置适当的优化选项是个好主意。

© www.soinside.com 2019 - 2024. All rights reserved.