【问题标题】:Help using Lisp debugger帮助使用 Lisp 调试器
【发布时间】:2011-06-06 03:46:43
【问题描述】:

我正在尝试了解如何解释和使用 Lisp 调试器的输出。

我有一个非常简单的 Backtrace 来评估我的函数,但我似乎无法弄清楚如何使用它来找出我的函数中发生异常的 Lisp 'form'。

如果我能提供任何关于我应该做什么的线索,我将不胜感激,以便在我的代码中找到错误的来源。

另外 - 为什么第二个框架显示为“没有可用于框架的调试信息”?

我附上了调试器和 repl 的屏幕截图(我还在下面包含了我的函数 - 我知道这是非常错误的 - 但我只是对学习正确使用调试器感兴趣)。另外,我在第一帧上按了“v”以转到源,但这导致了repl下方的错误。 (编辑 - 通过下载并将其复制到正确的路径来修复丢失的源代码问题)

(可怕的功能 - 请不要使用 cmets!)

(defun myquicksort2 (lst)
  (if (eql 1 (length lst))
      lst
      (let ((mid (middle lst)))
    (do ((i 0 (+ i 1)))
        ((>= i mid) (append (myquicksort2 (subseq lst 0 mid))
                  (myquicksort2 (subseq lst mid (length lst)))))
      (if (> (ltval i lst) (nth 100 lst))
          (let ((tmp (ltval i lst)))
        (setf (nth i lst) (gtval i lst))
        (setf (nth (- (- (length lst) i) 1) lst)  tmp)))))))

(defun ltval (i lst)
  (nth i lst))

(defun gtval (i lst)
  (nth (- (- (length lst) i) 1) lst))

(defun middle (lst)
  (round (/ (length lst) 2)))

【问题讨论】:

  • 应该提到没有“Lisp 调试器”。 Lisp 是一大类语言和实现。大多数实现都有不同的调试器。像 Emacs 的 SLIME 这样的 IDE 添加了一个在受支持的 Lisps 之上运行的调试器接口。
  • 您是否设置了优化标志以获得最大的调试信息?在编译所有内容之前尝试在 repl 中进行评估:(declaim (optimize (speed 0) (safety 3) (debug 3) (size 0)))
  • @Beef - 是的,我已经尝试过了。
  • @Joel:我不知道你的操作系统是什么(人们真的应该提供这些信息),但是 Debian 有一个名为 sbcl-source 的软件包,它正是为此目的而设计的——回溯等。您的操作系统也可能有一个。 Debian 安装在/usr/share/sbcl-source/src,这正是您的调试器正在寻找的位置。 :-)

标签: lisp common-lisp sbcl


【解决方案1】:

错误在于>,而您的源代码中只有一个>,所以这就是问题所在。

edit 内置 CL 函数很容易在 SBCL 中进行优化,因此尽管代码中的函数调用是对 CL:<,但实际调用的代码(并且显示在调试器)来自优化的、特定的、SBCL 内部例程。这对于用户定义的函数来说不是什么问题,您将更有可能获得有用的框架。

【讨论】:

  • 为什么我不能在调试器中使用'v'将我带到函数发生的源?我真的很想学习如何使用调试器(比修复错误本身更重要!)。
  • @Xach - 关于你在第一次编辑中所做的点 - 有没有办法禁用这种“积极优化” - 以获得更用户友好的调试输出?我已经设置 (sb-ext:restrict-compiler-policy 'debug 3) 为编译代码中的最大调试支持。
  • 由于错误在内部例程中,您需要安装SBCL 的源代码,以使SBCL 可以再次找到它。一种简单的方法是构建 SBCL 并从源代码安装。
  • 我不知道有没有办法禁用这种优化。
  • 有没有办法告诉我的来源中错误的来源?如果我有很多对 > 的函数调用,那将很难追踪。还有关于为什么 Backtrace 对第二帧说“没有可用于帧的调试信息”的任何线索?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-09
  • 1970-01-01
  • 2011-05-12
相关资源
最近更新 更多