如何调试使Emacs崩溃/使用100%CPU的Emacs lisp?

如何调试使Emacs崩溃/使用100%CPU的Emacs lisp?,emacs,elisp,Emacs,Elisp,我正在使用一个外部库,它经常占用我的CPU。我想帮助作者修复它(因为我非常喜欢这个库),但我不知道如何正确调试崩溃 调试Emacs lisp有什么提示吗?请记住,当它崩溃时,Emacs不再工作,我必须杀死它(因此Emacs内部的解决方案本身可能没有帮助) 编辑:我应该澄清,它是字节编译的,而这个问题并不总是发生在其他人身上,因此它可能特定于我的体系结构/init文件。但是它肯定与这个库有关。首先,始终调试Emacs Lisp程序的未编译版本,除非您确信问题是由字节编译器引起的 其次,如果代码挂起

我正在使用一个外部库,它经常占用我的CPU。我想帮助作者修复它(因为我非常喜欢这个库),但我不知道如何正确调试崩溃

调试Emacs lisp有什么提示吗?请记住,当它崩溃时,Emacs不再工作,我必须杀死它(因此Emacs内部的解决方案本身可能没有帮助)


编辑:我应该澄清,它是字节编译的,而这个问题并不总是发生在其他人身上,因此它可能特定于我的体系结构/init文件。但是它肯定与这个库有关。

首先,始终调试Emacs Lisp程序的未编译版本,除非您确信问题是由字节编译器引起的


其次,如果代码挂起Emacs,那么代码可能处于无限循环中,且禁止退出绑定为非nil。因此,首先要做的是遍历库的源代码,并将所有的禁止退出引用更改为其他引用,以便C-g能够阻止循环。之后,加载库,将debug on quit设置为t,当您按下C-g键时,应该会得到一个很好的调试跟踪,显示代码循环的位置。从这里开始,调试问题应该像调试任何其他无限循环一样简单。

如果它不是无限循环,只是一些非常复杂的代码,您是否考虑过在使用之前尝试对其进行字节编译?它是字节编译的。谢谢你!我不擅长回溯,我怀疑你也不擅长,但附加调试器和打印跟踪可能有助于缩小搜索范围。除此之外,在代码中添加调试打印…非编译使用它的问题是,由于其性能,它基本上不可用。我将查看代码库中是否有任何
inhibit-on-quit
调用,这是一个很好的调用。没有任何
inhibit-on-quit
调用。我将尝试退出时调试thing.inhibit-quit不禁止退出。它通常是这样绑定的:(let((禁止退出t)…一些代码…)