Compiler errors 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决定给我一个错误:关于外部函数#的参数数无效。没有指定调用什么函数,没有行

我已经用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.