Debuggen eines eingefrorenen Emacs

48

Ich benutze mew für meine E-Mail. Ich muss TLS mit meinem E-Mail-Anbieter für SMTP verwenden. Beim Versuch, das aufzurufen, friert Emacs jedoch ein.

Ich möchte diese Gelegenheit nutzen, um mehr über Emacs-Pakete zu erfahren. Wie würde ich dieses Problem beheben? Gibt es einen eingebauten Debugger wie in Common Lisp? Könnte ich die Protokollierung verwenden?

Svante
quelle
3
Wie rufen Sie das auf? Wenn Sie einen Emacs-Befehl verwenden, der in Lisp definiert ist, können Sie (1) den Quellcode laden, der den Befehl definiert, (2) verwenden M-x debug-on-entry THE-COMMANDund dann mit d(oder manchmal c, um einige Schritte zu überspringen) den Debugger durchlaufen. Lassen Sie den Quellcode in einem anderen Frame geöffnet, damit Sie verfolgen können, was der Debugger tut. Berichten Sie hier, was Sie sehen, oder, wenn Sie der Meinung sind, dass es sich um einen Emacs-Fehler handelt, verwenden Sie M-x report-emacs-bug.
Drew

Antworten:

44

Bevor gdbSie auf ein Unix-y-Betriebssystem zurückgreifen , können Sie versuchen, es SIGUSR2an den Emacs-Prozess zu senden , wie in der DEBUGin der anderen Antwort erwähnten Datei dokumentiert .

$ kill -SIGUSR2 <emacs_pid_goes_here>

Dadurch versucht Emacs, aus seiner aktuellen Schleife in den Lisp-Debugger auszubrechen.

Oder verwenden Sie diesen einen Liner, ohne Emacs PID manuell einzugeben:

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

Alternativ, falls killallverfügbar:

$ killall -USR2 emacs
Dmitry
quelle
1
Musste es zweimal machen (naja, ich hätte mehr als 1 Sekunde warten können, bevor ich es erneut versuche :-). Wie auch immer, es hat das Problem festgestellt (eine für eine lange Zeile zu langsame Verarbeitung der Schriftsperre).
Stéphane Gourichon
Es ist bekannt, dass die Schriftsperre Emacs blockiert. Bewegt ein Matcher den Punkt jedoch nicht nach vorne, wird er für immer neu ausgelöst.
Lindydancer
Wow, das war unglaublich. Ich bin mir immer noch nicht sicher, was mein Problem verursacht, aber dieser Trick ist ein Lebensretter, danke!
Matt
3
Auf meinem System kann der Oneliner zu 'killall -USR2 emacs' vereinfacht werden (natürlich vermeiden, wenn Sie mehrere Emacs-Prozesse haben).
YoungFrog
1
Empfehlen Sie dazu htop ( de.wikipedia.org/wiki/Htop ). um das Signal /zu suchen emacsund kzu senden. Activity Monitor auf einem Mac kann dies auch tun (über das Menü: Ansicht | Signal an Prozess senden).
Lassi
36

Wenn das Einfrieren bei einem Treffer C-gverschwindet, können Sie den integrierten Debugger verwenden. Geben Sie M-x toggle-debug-on-quitvor dem Senden der Nachricht ein, drücken C-gSie , wenn die Nachricht einfriert, und überprüfen Sie den *Backtrace*Puffer, der angezeigt wird.

Wenn C-gdies nicht hilft, passiert das Einfrieren wahrscheinlich im C-Code und Sie müssen einen externen Debugger wie verwenden gdb. Klicken Sie C-h C-dauf, um die DEBUGDatei anzuzeigen, die einige Hinweise dazu enthält. (Sie können die DEBUG-Datei auch in der Emacs-Repository-Weboberfläche lesen .) In dieser Antwort erfahren Sie mehr über die Verwendung gdbmit Emacs.

Legoscia
quelle
Möglicherweise müssen Sie schlagen C-gmehrmals: C-g C-g C-g.
Drew
@Drew Mir ist auch aufgefallen, dass es notwendig ist, ihn mehrmals zu treffen. Wissen Sie, warum?
Wilfred Hughes
2
Ja. Siehe Emacs-Handbuch, KnotenQuitting . Wie habe ich das gefunden? C-h r i, dann tippe "Cg" und drücke RET.
Drew