2012-01-08 47 views
6

我正在使用的外部库经常挂住我的CPU。我想帮助作者修复它(因为我真的很喜欢这个库),但我不知道如何正确调试崩溃。如何调试使Emacs崩溃/使用100%CPU的Emacs lisp?

调试Emacs lisp的任何提示?请记住,当它崩溃Emacs不再工作了,我不得不杀了它(所以在Emacs本身的解决方案可能没有帮助)。

编辑:我要澄清,这是字节编译,这个问题不会总是发生为别人,所以它可能是具体到我的建筑/初始化文件。这绝对与这个图书馆有关。

+0

如果它不是一个无限循环,而只是一些非常复杂的代码,你有没有考虑在使用之前尝试进行字节编译? – 2012-01-08 20:22:47

+0

它是字节编译的。虽然谢谢! – 2012-01-08 21:07:13

+0

我不擅长回溯,我怀疑你不是,但是用调试器附加并打印跟踪可能有助于缩小搜索范围。除此之外,在代码中加入调试打印... – tripleee 2012-01-08 21:36:44

回答

6

首先,除非您确信问题是由字节编译器引入的,否则请始终调试Emacs-Lisp程序的未编译版本。其次,如果代码挂起Emacs,那么代码可能处于一个无限循环,禁止 - 禁止绑定非零。因此,首先要做的是通过库的源代码并将所有禁止 - 退出引用更改为其他内容,以便C-g将停止循环。之后,加载库,将debug-on-quit设置为t,并且在按C-g时显示代码正在循环的位置时,应该会得到一个很好的调试跟踪。从那里开始,调试问题应该像调试任何其他无限循环一样简单。

+0

使用它的非编译问题在于它的性能基本上不可用。我会看看代码库中是否有任何'禁止 - 退出'调用,这是一个很好的调用。 – 2012-01-09 09:10:16

+0

没有任何'禁止戒烟'调用。我会尝试'debug-on-quit'的东西。 – 2012-01-09 09:12:16

+0

inhibit-quit not inhibit-on-quit。它通常会这样绑定:(let((inhibit-quit t)...)... some code ...) – 2012-01-09 18:06:01