为了调试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的技巧。
答案 0 :(得分: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)。这可以打印出很多低级别的跟踪信息。