2011-11-01 74 views
0

为了调试sbcl内部,我试图跟踪sbcl内部包。跟踪内部sbcl包导致控制堆栈溢出

例如我试图

(trace "SB-IMPL") 

这将导致一个控制堆栈溢出。我尝试在启动SBCL时更改控制堆栈大小 启动选项,但没有更改。

另外,我还试图修改使用功能:(仅片段)

(setf (symbol-function s) 
     #'(lambda (&rest args) 
      ;do something 
      ;invoke original function 
      ;do something more)) 
下DO-所有符号

只属于指定的包符号。

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

另外,如果有人可以指出如何改变内部的SSBCL函数定义,而他们编译也可以很好?在这种情况下,我可以使用 这个技巧来从源代码重新编译SBCL。

回答

3

我认为这里的问题是你正在跟踪函数(可能是SB-IMPL :: FLUSH-OUTPUT-BUFFER),这些函数在跟踪本身时使用。有些东西(REPL)调用FLUSH-OUTPUT-BUFFER,它被跟踪,所以跟踪尝试输出一些东西,这些东西叫做FLUSH-OUTPUT-BUFFER,这被跟踪,所以跟踪尝试输出一些东西,这叫做FLUSH-OUTPUT- BUFFER,这是跟踪....

根据你想跟踪,你可能能够完成你的任务,通过追踪这些功能,而不是所有的SB-IMPL。

如果您确实需要追踪太低级别的踪迹,您可能希望在启用SB-SHOW功能的情况下进行编译(查看base-target-features.lisp-expr和src/code/show.lisp)。这可以打印出很多低级别的跟踪信息。

+0

谢谢塞缪尔。是的,你对循环依赖关系是正确的。我也被sbcl-devel指出,尽管你已经用实际的功能来解释它。是的,我确实启用了显示功能,并且打印出有关内部工作的有用信息。但我想整个猪群,还有什么比追踪整个包装更好的方法。我现在可以进行一些挖掘,并且可能通过有效内部包函数的代码启用/禁用跟踪。再次感谢。 –