在 ADOC 模式下调试 Emacs 冻结



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

我如何实际确定是什么脚本导致 emacs 像这样挂起?最好产生回溯?

由于 emacs 在缓冲区内键入时冻结,而不是在执行命令后冻结,因此像toggle-debug-on-quitdebug-on-entry是没有用的。

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

编辑:所以,我最终grep对所有defun~/.emacs.d/lisp进行ping,并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!!

测试用例是("shell"一词被 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))

输入时调试可能会有所帮助,如果你可以在到达 looper 的序列中识别一个函数。

您是否尝试过"apropos"debug"?

不确定信号调试或退出调试。 如果使用Unix"kill"或Windows任务管理器"End Task"向emacs发送信号,你可以用调试信号拦截它。

并在以下位置搜索"调试循环" https://groups.google.com/forum/#!forum/gnu.emacs.help

此外,您可以使用 edebug-defun 在 adoc-mode.el "debug" 中编译一些 functins。

(我希望我没有搞砸这个话题。 我是新来的,不熟悉"答案"与"评论"。

这是我调试它的方法。冻结可能是由于某些次要模式而发生的。您可以执行C-hm以获取活动次要模式的列表。然后用emacs -Q启动 emacs 并加载adoc-mode,然后在每次尝试重现问题时逐个加载每个次要模式。这可能会将您引向罪魁祸首。

最新更新