如何调试emacs崩溃?


16

我正在调试为什么使用软件包1中的函数时emacs崩溃。此调试过程的目的是获得有用的数据以使用提交M-x report-emacs-bug

为了获得有关如何调试emacs崩溃的帮助,我已经查看了Emacs手册-崩溃Emacs手册-崩溃后,但是它们没有帮助。

崩溃后的故障”手册指的是,emacs-buffer.gdb但我不知道如何使用它。在向Google寻求帮助时,我遇到了这个emacs.SE问题,并使用-ggdb3标志重新编译了emacs 。

我没有使用gdb过的经验,因此尝试使用该emacs-buffer.gbd文件的尝试很少。

这是我尝试过的:

  • gdb -x /path/to/emacs-buffer.gdb
  • gdb -> file /path/to/emacs-buffer.gdb
  • gdb -> source /path/to/emacs-buffer.gdb
  • source /path/to/emacs-buffer.gdb

附带一提,使用该-ggdb3标志编译的emacs 加载时间大约需要10秒;之前是5-6秒,现在是16-17秒。我知道确切的秒数,因为有代码可以在我的init中进行计算。启动时间会增加吗?


脚注1:undo-tree尝试恢复特定.org文件(我无法公开共享)的撤消历史记录时,emacs始终崩溃。我有(setq undo-tree-auto-save-history t)此崩溃仅发生在emacs git master上,而不发生在emacs 24.5上。在emacs 24.5上,undo-tree抛出一个错误,指出它无法加载撤消历史记录(即使存在撤消历史记录文件也是如此),但是至少emacs会话不会在该版本上崩溃。


2
我使用Emacs已有两年多了,但仍未真正弄清楚: stackoverflow.com/q/20891431/2112489 老实说,这有点神秘,应该有一个权威的线程来教怎么做它。
法律列表

好的,问题是获得观看次数,但没有投票。让我知道您是否需要我改善问题。如果您认为该问题可以提供一个很好的答案,并且对emacs社区有所帮助,请对其进行投票,以便它吸引潜在的答复者。
Kaushal Modi

我不想劫持您的线程,但我会提出建议。如果该线程在合理的时间内没有吸引到合适的答案(即,您决定要表示什么意思),则可能有必要使该线程更通用-例如,有关如何使用gdb调试Emacs的权威性线程崩溃时,创建有意义的回溯,当收到包含上述信息的错误报告时,该回溯将有助于Emacs开发团队的专家对问题进行诊断/疑难解答。我知道这个问题由于存在undue-tree问题而很重要,但是潜力更大。
法律名单

@lawlist这正是我期望的线程。我没想到会有undo-tree特定的答案,因为我知道其他任何人都很难重新创建确切的崩溃。我也无法共享整个org文件,这是似乎导致此崩溃的唯一文件。因此,我仅将gdb标签应用于此问题。我给了这个故事,以便答案可以指导我一般如何调试emacs崩溃,以便我可以提交有用的emacs错误报告
Kaushal Modi

@lawlist我已改掉了这个问题,以便很明显它不是特定于任何软件包的。
Kaushal Modi

Answers:


15

调试Emacs崩溃的最简单方法是在下启动Emacs gdb,然后执行任何可重现崩溃的操作。

假设您正在从源代码构建Emacs,则应该传递CFLAGS="-O0 -g3"./configure脚本。这使得C编译器关闭优化(这可能会使调试时产生混乱)并激活可执行文件中的最大调试信息。运行make以构建Emacs。

然后,gdbsrcEmacs树的目录中开始:

$ cd ~/my-emacs-tree/src
$ gdb ./emacs

在OSX上,您需要传递--with-ns./configure脚本并在创建的应用程序内的Emacs上启动gdb:

$ cd ~/my-emacs-tree
$ make install
$ cd src
$ gdb nextstep/Emacs.app/Contents/MacOS/Emacs

src目录开始的原因是,存在一个.gdbinit文件,该文件设置了用于调试Emacs的有用的GDB函数定义。如果该文件已加载,则在启动时应该会看到类似以下内容gdb

DISPLAY = /private/tmp/com.apple.launchd.cNjhIdtUNd/org.macosforge.xquartz:0
TERM = xterm-256color
Breakpoint 1 at 0x1000ca444: file ../../src/emacs.c, line 353.
Breakpoint 2 at 0x1000e7e34: file ../../src/sysdep.c, line 926.

键入r以启动Emacs。您可以在同一行上传递其他参数,例如r --debug-init

然后尝试使Emacs崩溃。如果它崩溃了,您应该在中看到关于它的注释gdb,然后您将(gdb)再次留在提示符下。如果Emacs不会崩溃,但会死机,您可以C-z在正在运行的终端中单击gdb以返回提示。

出现提示后,键入bt以获取回溯。另外,如果.gdbinit正确加载了Emacs 文件,您会在C回溯之后看到Lisp回溯。这两个回溯都是非常有用的内容M-x report-emacs-bug


etc/DEBUGEmacs树中的文件中包含更多信息,包括如何检查变量的状态等。您可以通过C-h C-d在Emacs中键入内容来打开它,也可以在线阅读它


谢谢。我今天会抽出时间来尝试您的解决方案。我仍然很好奇它做什么emacs-buffer.gdb以及如何使用它。
Kaushal Modi

据我了解,这是专门用来恢复Emacs崩溃时正在编辑的文件的内容。由于Emacs每30秒和每300次按键自动保存一次,所以我说这是有限的用途。
legoscia

1
但这也应该有助于恢复非文件缓冲区,对吗?我的想法是用它来查看崩溃之前* Messages *和* Backtrace *的内容。
Kaushal Modi

啊,那是一个好点。我自己从未使用过它,所以不确定如何去做。
legoscia 2015年

您知道如何在emacsclient上运行gdb吗?我在中找不到该二进制文件src/。我lib-src/虽然找到了,但这没有用gdb ./emacsclient -a '' -c。因此,我需要有关如何将这些-a-cargs 传递给emacsclient而不是gdb的帮助。
Kaushal Modi 2015年
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.