Ich debugge gerade, warum Emacs abstürzt, wenn ich eine Funktion aus einem Paket 1 verwende . Ziel dieses Debug-Prozesses ist es, nützliche Daten für die Übermittlung zu erhalten M-x report-emacs-bug
.
Um Hilfe zum Debuggen von Emacs-Abstürzen zu erhalten, habe ich mir bereits das Emacs-Handbuch - Abstürze und das Emacs-Handbuch - Nach einem Absturz angesehen , aber sie haben nicht geholfen.
Das After A Crash- Handbuch bezieht sich auf, emacs-buffer.gdb
aber ich habe keine Ahnung, wie man es benutzt. Als ich Google um Hilfe bat, bin ich auf diese Frage von Emacs.SE gestoßen und habe Emacs mithilfe der -ggdb3
Flags neu kompiliert .
Ich habe keine Vorkenntnisse in der Verwendung von gdb
und daher habe ich nur wenige Fehlversuche unternommen, um die emacs-buffer.gbd
Datei zu verwenden.
Folgendes habe ich versucht:
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
Außerdem -ggdb3
dauert das Laden von Emacs, die mit dem Flag kompiliert wurden, etwa 10 Sekunden länger. früher waren es 5-6 Sekunden, jetzt ungefähr 16-17 Sekunden. Ich kenne die genauen Sekunden aufgrund eines Codes, der diese in meinem Init berechnet. Wird diese Verlängerung der Startzeit erwartet?
Fußnote 1: Emacs stürzt konsistent ab, wenn undo-tree
versucht wird, den Rückgängig-Verlauf für eine bestimmte .org-Datei wiederherzustellen (die ich nicht öffentlich freigeben kann). Ich habe (setq undo-tree-auto-save-history t)
. Dieser Absturz tritt nur auf dem Emacs Git Master auf, nicht auf dem Emacs 24.5. Unter Emacs 24.5 wird undo-tree
ein Fehler ausgegeben, der besagt, dass der Rückgängig-Verlauf nicht geladen werden kann (selbst wenn die Rückgängig-Verlaufsdatei vorhanden ist), aber zumindest die Emacs-Sitzung in dieser Version nicht abstürzt.
undue-tree
Problemen wichtig ist , aber es hat ein breiteres Potenzial .undo-tree
spezifische Antwort erwartet , weil ich weiß, dass es für andere schwierig sein würde, diesen genauen Absturz nachzubilden. Außerdem kann ich nicht die gesamte Organisationsdatei freigeben, die die einzige ist, die diesen Absturz zu verursachen scheint. Also habe ich nur dasgdb
Tag auf diese Frage angewendet . Ich habe diese Hintergrundgeschichte gegeben, damit ich anhand der Antworten nachvollziehen kann, wie ein Emacs-Absturz im Allgemeinen behoben wird, damit ich einen nützlichen Emacs-Fehlerbericht einreichen kann .Antworten:
Der einfachste Weg, einen Emacs-Absturz zu debuggen, besteht darin, Emacs unter zu starten
gdb
und dann das zu tun, was den Absturz reproduziert.Angenommen, Sie erstellen Ihren Emacs aus dem Quellcode und übergeben ihn
CFLAGS="-O0 -g3"
an das./configure
Skript. Dadurch deaktiviert der C-Compiler Optimierungen (die beim Debuggen zu Verwirrung führen können) und aktiviert die maximale Anzahl von Debuginformationen in der ausführbaren Datei. Führen Siemake
, um Emacs zu bauen.Starten Sie dann
gdb
imsrc
Verzeichnis Ihres Emacs-Baums:Auf OSX, möchten Sie weitergeben
--with-ns
an das./configure
Skript und auf den Emacs innerhalb der erstellten Applikation starten gdb:Der Grund für den Start aus dem
src
Verzeichnis ist, dass es eine.gdbinit
Datei gibt, die nützliche GDB-Funktionsdefinitionen für das Debuggen von Emacs enthält. Wenn diese Datei geladen wurde, sollte beim Starten etwa Folgendes angezeigt werdengdb
:Geben Sie ein
r
, um Emacs zu starten. Sie können in derselben Zeile zusätzliche Argumente übergeben, zr --debug-init
.Versuchen Sie dann, Emacs zum Absturz zu bringen. Wenn es abstürzt, sollten Sie eine Notiz darüber in sehen
gdb
, und Sie werden wieder an der(gdb)
Eingabeaufforderung gelassen . Wenn Emacs nicht abstürzt, sondern einfriert, können Sie aufC-z
das Terminal klicken, auf dem Sie gerade laufengdb
, um zur Eingabeaufforderung zurückzukehren.Geben Sie an der Eingabeaufforderung Folgendes ein,
bt
um eine Rückverfolgung abzurufen. Als Bonus wird, wenn die Emacs-.gdbinit
Datei korrekt geladen wurde, ein Lisp-Backtrace nach dem C-Backtrace angezeigt. Beide Backtraces sind sehr nützliche Dinge, die berücksichtigt werden müssenM-x report-emacs-bug
.In der
etc/DEBUG
Datei im Emacs-Baum finden Sie viel mehr Informationen, einschließlich Informationen zum Untersuchen des Zustands von Variablen usw. Sie können es öffnen, indem SieC-h C-d
in Emacs tippen, oder Sie können es online lesen .quelle
emacs-buffer.gdb
macht und wie man es benutzt.src/
. Ich fand es zwar in,lib-src/
aber das hat nicht funktioniertgdb ./emacsclient -a '' -c
. Also brauche ich Hilfe, um diese-a
und-c
Argumente an emacsclient anstatt an gdb weiterzugeben.