2011-11-01 54 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指出,儘管你已經用實際的功能來解釋它。是的,我確實啓用了顯示功能,並且打印出有關內部工作的有用信息。但我想整個豬羣,還有什麼比追蹤整個包裝更好的方法。我現在可以進行一些挖掘,並且可能通過有效內部包函數的代碼啓用/禁用跟蹤。再次感謝。 –