在adoc-mode中调试emacs冻结

时间:2014-02-14 19:08:57

标签: emacs elisp

我在emacs(adoc-mode)中使用Asciidoc做了很多工作。我相信它在编辑内联源代码时会出现错误。发生的事情是emacs冻结,CPU消耗达到100%。我可以轻松地重现这种行为。

如何实际确定哪些脚本导致emacs像那样挂起?并且最好产生回溯?

由于emacs在在缓冲区中键入时冻结,而不是在执行命令后,像  toggle-debug-on-quitdebug-on-entry无用。

我想我可以用defun标记adoc-mode.el中的每一个printf,但我希望有一种更简单的方法:)

修改 所以,我最终grep ping ~/.emacs.d/lisp所有defuntrace-function每个$ 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 。 我能够缩小问题并创建一个小测试用例。

这3个文件是必需的:

.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!!

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

测试用例是(elisp删除了“shell”字样):

emacs

现在,运行(adoc-kwf-attriblist),它将挂起end。我对emacs编程知之甚少,但似乎这件事最终没有将重点转移到 (goto-char (or (text-property-not-all (point) end 'adoc-attribute-list nil) end)) 位置。

{{1}}

2 个答案:

答案 0 :(得分:1)

如果能够识别到达循环器的序列中的函数,

debug-on-entry可能会有所帮助。

你试过“apropos”“debug”吗?

不确定调试信号或退出调试。如果使用Unix“kill”或Windows任务管理器“结束任务”向emacs发送信号,您可以使用debug-on-signal拦截它。

并在。搜索“调试循环” https://groups.google.com/forum/#!forum/gnu.emacs.help

另外,您可以使用edebug-defun在adoc-mode.el“debug”中编译一些功能。

(我希望我没有抓住这个话题。我是新来的,不熟悉“答案”与“评论”。)

答案 1 :(得分:0)

以下是我将如何调试它。由于一些小模式,可能会发生冻结。您可以执行 C-h m 以获取活动的次要模式的列表。然后使用emacs -Q启动emacs并加载adoc-mode,然后在每次尝试重现问题时逐个加载每个次要模式。这可能会导致你成为罪魁祸首。