Compiler errors SBCL错误消息:有改进的方法吗?
我已经用CommonLisp开发了将近一年了,这真的开始让我紧张起来。我开始使用CLISP编程CL,但后来为了提高速度,我切换到了SBCL。我做了很多低级的工作,所以我需要与很多C代码接口。我非常喜欢CL的增量开发方面(但是我不使用Emacs——我在Vim中运行SLIMV),但我发现自己的开发速度比Python、Perl、C甚至NASM慢。问题的根源在于SBCL的错误消息。有一次,我被迫搜索了将近500行代码,因为SBCL决定给我一个Compiler errors SBCL错误消息:有改进的方法吗?,compiler-errors,common-lisp,sbcl,Compiler Errors,Common Lisp,Sbcl,我已经用CommonLisp开发了将近一年了,这真的开始让我紧张起来。我开始使用CLISP编程CL,但后来为了提高速度,我切换到了SBCL。我做了很多低级的工作,所以我需要与很多C代码接口。我非常喜欢CL的增量开发方面(但是我不使用Emacs——我在Vim中运行SLIMV),但我发现自己的开发速度比Python、Perl、C甚至NASM慢。问题的根源在于SBCL的错误消息。有一次,我被迫搜索了将近500行代码,因为SBCL决定给我一个错误:关于外部函数#的参数数无效。没有指定调用什么函数,没有行
错误:关于外部函数#
的参数数无效。没有指定调用什么函数,没有行号,什么都没有。最近,我很高兴得到加载的代码要求SB-PRETTY:PRETTY-STREAM类的布局不兼容。
随机。代码在CLISP上运行良好,但在SBCL上出现模糊错误而失败。有没有办法让这些信息更具信息性?我写C和汇编已经快6年了,甚至它们都会给你一个行号。我所看到的唯一合理的SBCL错误是读卡器错误,这些错误几乎毫无用处,因为它们通常相当于缺少一个括号。同样,是否有任何声明/命令行开关可用于更改此设置?在这一点上,我甚至可以编写自己的错误打印机
编辑:
例如,在my~/.sbclrc中使用(sb ext:restrict compiler policy'debug 3)
(使用--load而不是--script以便加载.sbclrc)
在SB-INT上调用的调试器:线程中的SIMPLE-PROGRAM-ERROR
#:
参数数无效:0
键入“帮助”以获取调试器帮助,或键入(SB-EXT:EXIT)以退出SBCL。
重新启动(可通过数字或可能的缩写名称调用):
0:[中止]退出调试器,返回顶层。
(SB-KERNEL::INVALID-ARG-COUNT-ERROR-HANDLER
#
#(SB-SYS:INT-SAP#XB78CDAE0)
#
(79))
0]打印
(SB-KERNEL::INVALID-ARG-COUNT-ERROR-HANDLER
#
#(SB-SYS:INT-SAP#XB78CDAE0)
#
(79))
0]向下
(SB-KERNEL:内部错误)
#(SB-SYS:INT-SAP#XB78CD7DC)
#)
1] 向下
(“外部功能:#x805FCBB”)
2] 向下
堆栈的底部。
不完全是信息性的。如果您遇到运行时错误(我怀疑
无效数量的参数属于该类别),您应该进入调试器(除非您明确禁用了调试器),并且回溯跟踪可能会向您显示调用的确切位置
加载的代码需要不同的布局…
表示您正在查看在不同时间点编译的两段已编译代码,或者代码与内部连接得有点太深。首先,强制重新编译所有代码,看看警告是否消失。我想您正在寻找:(sb ext:restrict compiler policy'debug 3)
您可以将其放入~/.sbclrc
或REPL中,SBCL的调试器(尤其是SLIME中的调试器)将产生更有用的结果。我最近又学到了一件事,这在您的情况下可能很有用:
确保以足够的调试级别编译所有内容
将您怀疑的代码包装到(步骤…
表单中。从那里,您可以跟踪重新启动,您将认识到它与GDB和其他step调试器非常相似(您可以从那里执行下一步、单步执行、单步执行和单步计数)。如果您完全不知道函数的来源,那么访问所需的函数可能有点单调乏味,但是如果您将它用作一种方法,并测试较小的代码片段,它会有所帮助
更多信息:这是“定制”构建脚本的发行版的常见问题;ArchLinux是一个惯犯。从sbcl.org安装二进制文件是最可靠的方法。如果你想要最新、最棒的,那么从源代码构建是相当容易的。我几乎晚了7年,但我会补充一些有用的建议。在厌倦了在slime中看到错误并且只知道它们在哪个函数中,但没有行号或任何东西之后,我发现了这个堆栈溢出问题。这并没有太大帮助,所以我终于阅读了粘液手册
不确定它是否有助于原始海报,但当出现错误并且您在slime调试器中时,点击“v”(在emacs中,不确定vim)将向您显示引发错误的源代码。您还可以向下浏览到堆栈跟踪中的其他条目并点击“v”
调试部分的slime手册中还有其他有用的提示。能够在产生错误的同一堆栈框架中计算表达式真是太好了。是的,这会让我陷入调试器,但问题是外部函数调用中的参数数量无效,因此调用堆栈只有3个深度,最低的是。最好在SBCL邮件列表中询问此类问题。如果可能,请使用示例代码。维护SBCL编译器的人正在听。你试过Clozure和他们的Objective C bridge吗?在与Objective C例程通信时,我对lisp实现中生成的错误消息没有太大的问题。我知道这不是C,但你可能会从中得到灵感。还有,使用slimv,你会得到调试器缓冲区是的,它显示了回溯,你可以四处导航并查看变量状态,等等。?
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.