2012-01-08 48 views
6

我正在使用的外部庫經常掛住我的CPU。我想幫助作者修復它(因爲我真的很喜歡這個庫),但我不知道如何正確調試崩潰。如何調試使Emacs崩潰/使用100%CPU的Emacs lisp?

調試Emacs lisp的任何提示?請記住,當它崩潰Emacs不再工作了,我不得不殺了它(所以在Emacs本身的解決方案可能沒有幫助)。

編輯:我要澄清,這是字節編譯,這個問題不會總是發生爲別人,所以它可能是具體到我的建築/初始化文件。這絕對與這個圖書館有關。

+0

如果它不是一個無限循環,而只是一些非常複雜的代碼,你有沒有考慮在使用之前嘗試進行字節編譯? – 2012-01-08 20:22:47

+0

它是字節編譯的。雖然謝謝! – 2012-01-08 21:07:13

+0

我不擅長回溯,我懷疑你不是,但是用調試器附加並打印跟蹤可能有助於縮小搜索範圍。除此之外,在代碼中加入調試打印... – tripleee 2012-01-08 21:36:44

回答

6

首先,除非您確信問題是由字節編譯器引入的,否則請始終調試Emacs-Lisp程序的未編譯版本。其次,如果代碼掛起Emacs,那麼代碼可能處於一個無限循環,禁止 - 禁止綁定非零。因此,首先要做的是通過庫的源代碼並將所有禁止 - 退出引用更改爲其他內容,以便C-g將停止循環。之後,加載庫,將debug-on-quit設置爲t,並且在按C-g時顯示代碼正在循環的位置時,應該會得到一個很好的調試跟蹤。從那裏開始,調試問題應該像調試任何其他無限循環一樣簡單。

+0

使用它的非編譯問題在於它的性能基本上不可用。我會看看代碼庫中是否有任何'禁止 - 退出'調用,這是一個很好的調用。 – 2012-01-09 09:10:16

+0

沒有任何'禁止戒菸'調用。我會嘗試'debug-on-quit'的東西。 – 2012-01-09 09:12:16

+0

inhibit-quit not inhibit-on-quit。它通常會這樣綁定:(let((inhibit-quit t)...)... some code ...) – 2012-01-09 18:06:01