我在emacs(adoc-mode)中使用Asciidoc工作了很多.我相信它在编辑内联源代码时会出现错误.发生的事情是emacs冻结,CPU消耗达到100%.我可以轻松地重现这种行为.
我如何实际确定哪些脚本导致emacs像那样挂起?并且最好产生回溯?
由于emacs 在缓冲区中键入时冻结,而不是在执行命令后,类似toggle-debug-on-quit或debug-on-entry无用的东西
.
我想我可能标志着每一个defun在adoc-mode.el与printfS,但我希望有一个更简单的方法:)
编辑:
所以,我最终grepping了我~/.emacs.d/lisp的所有defuns和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
Run Code Online (Sandbox Code Playgroud)
我的.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!!
Run Code Online (Sandbox Code Playgroud)
测试用例是(elisp删除单词"shell"):
$ cat test.doc
blah blah blah
[source,shell]
foo
bar
Run Code Online (Sandbox Code Playgroud)
现在,运行emacs它会挂起(adoc-kwf-attriblist).我对emacs编程知之甚少,但看起来这件事最终并没有将这一点转移到end位置.
(goto-char (or (text-property-not-all (point) end 'adoc-attribute-list nil)
end))
Run Code Online (Sandbox Code Playgroud)
小智 1
如果您可以识别到达循环程序的序列中的函数,则 debug-on-entry 可能会有所帮助。
您尝试过“apropos”“调试”吗?
不确定信号调试或退出调试。如果使用 Unix“kill”或 Windows 任务管理器“结束任务”向 emacs 发送信号,您可以使用 debug-on-signal 拦截它。
并在https://groups.google.com/forum/#!forum/gnu.emacs.help中搜索“调试循环”
另外,您可以使用 edebug-defun 在 adoc-mode.el“debug”中编译一些函数。
(我希望我没有混淆这个话题。我是新来的,不熟悉“回答”与“评论”。)