我用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.
不完全提供信息。
答案 0 :(得分:5)
我认为您正在寻找:(sb-ext:restrict-compiler-policy 'debug 3)
你可以把它放到你的~/.sbclrc
或你的REPL中,而SBCL的调试器(特别是在SLIME中)会产生更多有用的结果。
答案 1 :(得分:4)
这是“自定义”构建脚本的发行版的常见问题; Arch Linux是一个常规罪犯。从sbcl.org安装二进制文件是最可靠的方法。如果想要最新最好的,那么从源代码构建起来相当容易。
答案 2 :(得分:2)
我最近学到了一件事,这个在你的情况下可能有用:
(step ...)
表单中。从那里你可以跟随重启,你会发现它与GDB和其他步调试器非常相似(你可以从下一步,逐步进入,逐步进入和逐步计数)。如果您完全不了解它的来源,可能有点单调乏味,但如果您将它用作方法,并测试较小的代码片段,则会有所帮助。答案 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”。
“粘液”手册的“调试”部分中还有其他有用的提示。能够在产生错误的同一堆栈框架中对表达式进行求值是非常好的。