跟踪内部sbcl包导致控制堆栈溢出

问题描述 投票:0回答:1

为了调试 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 的技巧。

overflow trace sbcl internals
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信息。

© www.soinside.com 2019 - 2024. All rights reserved.