我在emacs(adoc-mode
)中使用Asciidoc做了很多工作。我相信它在编辑内联源代码时会出现错误。发生的事情是emacs冻结,CPU消耗达到100%。我可以轻松地重现这种行为。
如何实际确定哪些脚本导致emacs像那样挂起?并且最好产生回溯?
由于emacs在在缓冲区中键入时冻结,而不是在执行命令后,像
toggle-debug-on-quit
或debug-on-entry
无用。
我想我可以用defun
标记adoc-mode.el
中的每一个printf
,但我希望有一种更简单的方法:)
修改
所以,我最终grep
ping ~/.emacs.d/lisp
所有defun
和trace-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}}
答案 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
,然后在每次尝试重现问题时逐个加载每个次要模式。这可能会导致你成为罪魁祸首。