调试冻结的Emacs


48

我正在用mew收发电子邮件。我需要在SMTP的电子邮件提供商中使用TLS。但是,当我尝试调用它时,Emacs冻结。

我想借此机会进一步了解Emacs软件包。我将如何调试此问题?是否有某种内置调试器,例如Common Lisp?我可以使用日志记录吗?


3
您如何“调用”?如果使用Lisp中定义的Emacs命令,则可以(1)加载定义命令的源代码,(2)使用M-x debug-on-entry THE-COMMAND,然后逐步使用调试器d(有时c跳过某些步骤)。使源代码在另一个框架中保持打开状态,以便您可以跟踪调试器的工作。报告您在这里看到的内容,或者如果您认为它表明是Emacs错误,请使用M-x report-emacs-bug
2014年

Answers:


44

gdb使用之前,如果您使用的是Unix-y操作系统,则可以尝试发送SIGUSR2到Emacs进程,如DEBUG其他答案中提到的文件中所述。

$ kill -SIGUSR2 <emacs_pid_goes_here>

这将使Emacs尝试脱离当前循环进入Lisp调试器。

或者使用这一衬板而无需手动键入emacs pid:

$ ps aux | grep -ie emacs | grep -v grep | awk '{print $2}' | xargs kill -SIGUSR2

或者,如果killall可用:

$ killall -USR2 emacs

1
不得不做两次(好吧,我可能要等1秒以上才能重试:-)。无论如何,它指出了问题所在(字体锁定处理太长行太慢了)。
斯特凡纳·古里科

众所周知,font-lock会挂起Emacs -如果匹配器触发但不将指针向前移动,它将永远重新触发。
Lindydancer

哇,真是太神奇了 仍然不确定是什么原因导致了我的问题,但是那招是救命稻草,谢谢!
马特

3
在我的系统上,oneliner可以简化为“ killall -USR2 emacs”(当然,如果您有多个Emacs进程,请避免使用)。
YoungFrog

1
为此推荐htop(en.wikipedia.org/wiki/Htop)。/搜索emacsk发送信号。在Mac上,活动监视器也可以执行此操作(从菜单:“视图” |“发送信号以处理”)。
拉西

36

如果在点击时冻结消失C-g,则可以使用内置调试器。M-x toggle-debug-on-quit在发送消息之前进行键入,C-g在冻结时单击,然后检查出现的*Backtrace*缓冲区。

如果C-g没有帮助,则冻结可能发生在C代码中,并且您需要使用外部调试器,例如gdb。点击C-h C-d查看该DEBUG文件,该文件提供了有关如何执行此操作的一些提示。(您也可以在Emacs存储库Web界面中阅读DEBUG文件。) 此答案进一步介绍了如何gdb与Emacs 一起使用。


您可能需要打C-g几次:C-g C-g C-g
2014年

@Drew我也注意到必须多次击中它。你知道为什么吗?
2014年

2
是。请参阅Emacs手册,节点Quitting。我是怎么找到的?C-h r i,然后输入“ Cg”并点击RET
德鲁
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.