SBCL错误消息:有什么方法可以改进吗?

时间:2012-12-23 16:13:27

标签: compiler-errors common-lisp sbcl

我用Common Lisp开发已近一年了,这真的开始让我感到紧张。我开始使用CLISP编程CL,但后来我转而使用SBCL来提高速度。我做了很多相当低级的东西,所以我需要与很多C代码接口。我非常喜欢CL的增量开发方面(我不使用Emacs - 我在Vim中运行SLIMV),但我发现自己的开发速度比在Python,Perl,C甚至NASM中都要慢。问题的根源在于SBCL的错误消息。我曾被迫搜索近500行代码,因为SBCL决定给我一个ERROR: Invalid number of arguments on foreign function #< some memory address >。没有指定调用什么函数,没有行号,没有。最近,我很高兴随机获得The loaded code expects an incompatible layout for class SB-PRETTY:PRETTY-STREAM.。代码在CLISP上运行FINE,但是在SBCL上出现了一些模糊的错误。有没有办法让这些消息更具信息量?我已经写了近6年的C和汇编了,甚至他们也会给你一个行号。我见过的唯一一半合理的SBCL错误是读者错误,这几乎是无用的,因为它们通常相当于缺少括号。同样,是否有任何声明/命令行开关可用于更改此设置?我甚至可以在此时编写自己的错误打印机。

编辑: 一个例子,我的〜/ .sbclrc中有(sb-ext:restrict-compiler-policy 'debug 3)(使用--load而不是--script,所以.sbclrc被加载)

debugger invoked on a SB-INT:SIMPLE-PROGRAM-ERROR in thread
#<THREAD "main thread" RUNNING {AB09931}>:
  invalid number of arguments: 0

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
  0: [ABORT] Exit debugger, returning to top level.

(SB-KERNEL::INVALID-ARG-COUNT-ERROR-HANDLER
 #<unavailable argument>
 #.(SB-SYS:INT-SAP #XB78CDAE0)
 #<SB-ALIEN-INTERNALS:ALIEN-VALUE :SAP #XB78CD7DC :TYPE (*
                                                         (STRUCT
                                                          SB-VM::OS-CONTEXT-T-STRUCT))>
 (79))
0] print
(SB-KERNEL::INVALID-ARG-COUNT-ERROR-HANDLER
    #<unavailable argument>
    #.(SB-SYS:INT-SAP #XB78CDAE0)
    #<SB-ALIEN-INTERNALS:ALIEN-VALUE :SAP #XB78CD7DC :TYPE (*
                                                            (STRUCT
                                                             SB-VM::OS-CONTEXT-T-STRUCT))>
    (79))
0] down
(SB-KERNEL:INTERNAL-ERROR
    #.(SB-SYS:INT-SAP #XB78CD7DC)
    #<unavailable argument>)
1] down
("foreign function: #x805FCBB")
2] down

Bottom of stack.

不完全提供信息。

5 个答案:

答案 0 :(得分:5)

我认为您正在寻找:(sb-ext:restrict-compiler-policy 'debug 3)

你可以把它放到你的~/.sbclrc或你的REPL中,而SBCL的调试器(特别是在SLIME中)会产生更多有用的结果。

答案 1 :(得分:4)

这是“自定义”构建脚本的发行版的常见问题; Arch Linux是一个常规罪犯。从sbcl.org安装二进制文件是最可靠的方法。如果想要最新最好的,那么从源代码构建起来相当容易。

答案 2 :(得分:2)

我最近学到了一件事,这个在你的情况下可能有用:

  1. 确保以足够的调试级别编译所有内容。
  2. 将您怀疑的代码包装到(step ...)表单中。从那里你可以跟随重启,你会发现它与GDB和其他步调试器非常相似(你可以从下一步,逐步进入,逐步进入和逐步计数)。如果您完全不了解它的来源,可能有点单调乏味,但如果您将它用作方法,并测试较小的代码片段,则会有所帮助。
  3. 更多信息:http://www.sbcl.org/manual/#Single-Stepping

答案 3 :(得分:1)

如果遇到运行时错误(我怀疑invalid number of arguments属于该类别),您应该进入调试器(除非您明确禁用了该调试器),并且可能会返回跟踪告诉你确切的通话地点。

loaded code expects a different layout...表示您正在查看在不同时间点编译的两段编译代码,或者是在内部隐藏得太深的代码。首先,强制重新编译所有代码,看看警告是否消失。

答案 4 :(得分:0)

我快迟了7年,但是我会添加一些有用的建议。在厌倦了看到粘液中的错误并且只知道它们所处的功能,却没有行号或其他任何内容之后,我发现了这个堆栈溢出问题。这并没有太大帮助,所以我终于阅读了粘液手册。 https://common-lisp.net/project/slime/#documentation

不确定是否会对原始海报有所帮助,但是当错误弹出并且您在粘液调试器中时,按'v'(在emacs中,不确定vim)将向您显示错误的源代码被提出。您还可以浏览到堆栈跟踪中的其他条目,然后单击“ v”。

“粘液”手册的“调试”部分中还有其他有用的提示。能够在产生错误的同一堆栈框架中对表达式进行求值是非常好的。