Wie kann ich einen Emacs-Absturz debuggen?

16

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.gdbaber 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 -ggdb3Flags neu kompiliert .

Ich habe keine Vorkenntnisse in der Verwendung von gdbund daher habe ich nur wenige Fehlversuche unternommen, um die emacs-buffer.gbdDatei 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 -ggdb3dauert 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-treeversucht 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-treeein 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.

Kaushal Modi
quelle
2
Ich bin seit mehr als zwei Jahren mit Emacs beschäftigt und habe es immer noch nicht wirklich herausgefunden: stackoverflow.com/q/20891431/2112489 Um ehrlich zu sein, ist es ein bisschen rätselhaft und es sollte einen autoritären Thread geben, der lehrt, wie man das macht es.
Gesetzesliste
In Ordnung, die Frage ist, wie viele Aufrufe es gibt, aber keine Gegenstimmen. Lassen Sie mich wissen, wenn Sie mich brauchen, um die Frage zu verbessern. Wenn Sie der Meinung sind, dass die Frage eine gute Antwort liefern und für die Emacs-Community hilfreich sein kann, stimmen Sie sie bitte ab, damit ein potenzieller Antwortender darauf aufmerksam wird.
Kaushal Modi
Ich möchte Ihren Thread nicht entführen, aber ich mache einen Vorschlag. Wenn der Thread innerhalb eines angemessenen Zeitraums keine passende Antwort findet (dh Sie entscheiden, was das bedeutet), kann es sich lohnen, diesen Thread allgemeiner zu gestalten - z. B. den maßgeblichen Thread zur Verwendung von gdb zum Debuggen von Emacs Abstürze, erstellen Sie aussagekräftige Backtraces, die den Gurus im Emacs-Entwicklungsteam helfen, die Probleme zu diagnostizieren / zu beheben, wenn sie einen Fehlerbericht erhalten, der diese Informationen enthält. Ich verstehe, dass das Problem aufgrund von undue-treeProblemen wichtig ist , aber es hat ein breiteres Potenzial .
Gesetzesliste
@lawlist Genau das erwarte ich von diesem Thread. Ich hatte keine undo-treespezifische 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 das gdbTag 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 .
Kaushal Modi
@lawlist Ich habe die Frage so umformuliert, dass klar ist, dass sie für kein Paket spezifisch ist.
Kaushal Modi

Antworten:

15

Der einfachste Weg, einen Emacs-Absturz zu debuggen, besteht darin, Emacs unter zu starten gdbund dann das zu tun, was den Absturz reproduziert.

Angenommen, Sie erstellen Ihren Emacs aus dem Quellcode und übergeben ihn CFLAGS="-O0 -g3"an das ./configureSkript. 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 Sie make, um Emacs zu bauen.

Starten Sie dann gdbim srcVerzeichnis Ihres Emacs-Baums:

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

Auf OSX, möchten Sie weitergeben --with-nsan das ./configureSkript und auf den Emacs innerhalb der erstellten Applikation starten gdb:

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

Der Grund für den Start aus dem srcVerzeichnis ist, dass es eine .gdbinitDatei 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 werden 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.

Geben Sie ein r, um Emacs zu starten. Sie können in derselben Zeile zusätzliche Argumente übergeben, z r --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 auf C-zdas Terminal klicken, auf dem Sie gerade laufen gdb, um zur Eingabeaufforderung zurückzukehren.

Geben Sie an der Eingabeaufforderung Folgendes ein, btum eine Rückverfolgung abzurufen. Als Bonus wird, wenn die Emacs- .gdbinitDatei korrekt geladen wurde, ein Lisp-Backtrace nach dem C-Backtrace angezeigt. Beide Backtraces sind sehr nützliche Dinge, die berücksichtigt werden müssen M-x report-emacs-bug.


In der etc/DEBUGDatei im Emacs-Baum finden Sie viel mehr Informationen, einschließlich Informationen zum Untersuchen des Zustands von Variablen usw. Sie können es öffnen, indem Sie C-h C-din Emacs tippen, oder Sie können es online lesen .

Legoscia
quelle
Vielen Dank. Ich werde heute Zeit finden, Ihre Lösung auszuprobieren. Ich bin immer noch neugierig, was es emacs-buffer.gdbmacht und wie man es benutzt.
Kaushal Modi
Soweit ich weiß, dient dies speziell dazu, den Inhalt der Datei wiederherzustellen, die Sie beim Absturz von Emacs bearbeitet haben. Da Emacs alle 30 Sekunden und alle 300 Tastendrücke automatisch speichert, ist dies nur bedingt sinnvoll.
Legoscia
1
Aber das sollte auch dazu beitragen, Nicht-Dateipuffer wiederherzustellen. Ist das richtig? Meine Idee war, das zu nutzen, um zu sehen, was * Messages * und * Backtrace * kurz vor dem Absturz hatten.
Kaushal Modi
Ah, das ist ein guter Punkt. Ich habe es selbst nie benutzt, daher weiß ich nicht, wie ich es machen soll.
Legoscia
Wissen Sie, wie man GDB auf Emacsclient ausführt? Ich kann diese Binärdatei in nicht finden src/. Ich fand es zwar in, lib-src/aber das hat nicht funktioniert gdb ./emacsclient -a '' -c. Also brauche ich Hilfe, um diese -aund -cArgumente an emacsclient anstatt an gdb weiterzugeben.
Kaushal Modi,