0

为了调试 sbcl 内部,我尝试跟踪 sbcl 内部包。

例如我试过

(trace "SB-IMPL")

这会导致控制堆栈溢出。我尝试在启动 SBCL 时更改控制堆栈大小启动选项,但没有任何变化。

或者,我也尝试使用以下方法修改函数:(仅片段)

(setf (symbol-function s)
      #'(lambda (&rest args)
          ;do something
          ;invoke original function
          ;do something more))

在 do-all-symbols 下仅适用于属于指定包的符号。

我仍然收到溢出错误。上面的代码显示绑定堆栈耗尽错误。可能有人可以解释如何控制绑定堆栈大小?

或者,如果有人可以指出如何在编译内部 SBCL 函数定义时更改它们也会很棒?在这种情况下,我可以使用该技巧从源代码重新编译 SBCL。

4

1 回答 1

3

我认为这里的问题是您正在跟踪用于跟踪自身的函数(尤其是 SB-IMPL::FLUSH-OUTPUT-BUFFER)。有些东西(REPL)调用FLUSH-OUTPUT-BUFFER,它被跟踪,所以trace试图输出一些东西,它调用FLUSH-OUTPUT-BUFFER,它被跟踪,所以trace试图输出一些东西,它调用FLUSH-OUTPUT- BUFFER,这是被追踪的......

根据您要跟踪的内容,您可以通过专门跟踪这些函数而不是所有 SB-IMPL 来完成您的任务。

如果你真的必须跟踪一些太低级的东西而无法使用跟踪,你可能希望在启用 SB-SHOW 功能的情况下进行编译(查看 base-target-features.lisp-expr 和 src/code/show.lisp) . 这样可以打印出很多底层的trace信息。

于 2011-11-01T15:56:04.203 回答