2014-02-14 55 views
6

我在emacs中使用Asciidoc工作了很多(adoc-mode)。我相信編輯內聯源代碼時會出現一個錯誤。 emacs會凍結,CPU消耗會達到100%。我可以很容易地重現這種行爲。在adoc模式下調試emacs凍結

我該如何確定哪些腳本導致emacs掛起?並最好產生一個回溯?

由於emacs的凍結而打字緩衝內,而不是執行的命令時,類似的東西 toggle-debug-on-quitdebug-on-entry之後是無用的。

我想我可以在adoc-mode.el每一個defun標記與printf S,但我希望有一個更簡單的方法:)

編輯: 所以,我結束了grep平我~/.emacs.d/lisp爲所有defun s和trace-function每一個。 我能夠縮小問題範圍並創建了一個小測試用例。

這3個文件是必需的:

$ find /home/victor/.emacs.d/ 
/home/victor/.emacs.d/ 
/home/victor/.emacs.d/lisp 
/home/victor/.emacs.d/lisp/doc-mode.el 
/home/victor/.emacs.d/lisp/adoc-mode.el 
/home/victor/.emacs.d/lisp/markup-faces.el 

.emacs

$ cat .emacs 
(setq inhibit-startup-message t) 
(add-to-list 'load-path "~/.emacs.d/lisp/") 
(require 'adoc-mode) 
(switch-to-buffer (find-file "test.doc")) 
(adoc-mode) 
(goto-char 29) 
(delete-backward-char 5) 
;; now (adoc-kwf-attriblist) is in endless loop!! 

而測試用例是(單詞 「殼」 被elisp的刪除):

$ cat test.doc 
blah blah blah 
[source,shell] 
foo 
bar 

現在,運行emacs,它將掛起(adoc-kwf-attriblist)。我對emacs編程不太瞭解,但似乎這個東西並沒有最終移到end的位置。

(goto-char (or (text-property-not-all (point) end 'adoc-attribute-list nil) 
      end)) 
+0

當emacs死機時,你可以用'C-g'打斷它嗎? – Francesco

+0

@Francesco:當emacs凍結時,它不能被\ C-g \中斷。 Emacs只停留在那裏,沒有響應事件(打字,點擊關閉窗口等)。 –

+0

你是對的 - 有一個假設,如果text-property-not-all返回,它會返回比point更大的東西。不幸的是,它可以返回相同的點,所以它循環。我已經修復了github –

回答

1

debug-on-entry可能會有所幫助,如果您可以識別序列中到達活套的功能。

您是否嘗試過「apropos」「debug」?

不確定關於調試信號或調試退出。如果使用Unix「kill」或Windows任務管理器「結束任務」向emacs發送信號,則可以通過調試信號對其進行截取。

而在 https://groups.google.com/forum/#!forum/gnu.emacs.help

而且搜索 「調試循環」,你可以編譯ADOC-mode.el 「調試」 與edebug-defun定義一些functins。

(我希望我沒有爛醉了這個話題。我是新來的,不熟悉的「答案」與「評論。)

0

這是我會怎麼調試。凍結可能發生的因爲有一些次要的模式,你可以做Chm得到一個列表到主動模式,然後用emacs -Q啓動emacs並加載adoc-mode,然後每次嘗試重新加載每個次要模式問題,這可能導致你成爲罪魁禍首。

+0

我這樣做了。從'emacs -Q'開始,手動加載定義'adoc-mode'(即'adoc-mode.el'和'markup-faces.el')的文件。啓用的次要模式的列表是不同的(一些更多,一些更少)。該錯誤仍然出現,無需手動加載更多次要模式。 –