Auswertung unterbrechen und aktuellen Stack im emacs-lisp Debugger beobachten?

17

Wenn die Ausführung einiger Emacs-Lisp-Funktionen, wie z. B. eines Hauptmodus-Hooks, länger dauert als erwartet, möchte ich sie manchmal unterbrechen und den aktuellen Stack anzeigen. Im Idealfall möchte ich auch Variablenwerte usw. im Debugger anzeigen können. Ich spreche nicht von Code, den ich absichtlich im Emacs-Lisp-Modus ausführe, sondern von Code, der im normalen Betrieb von Emacs ausgeführt wird.

Wie kann ich die Ausführung von emacs-lisp-Code direkt in emacs unterbrechen? Ich weiß vorher nicht, welche Funktion ich debuggen muss.

Wenn C-gich zum Beispiel tippe , ohne die Ausführung zu unterbrechen, erfahre ich auch nichts darüber, welche Funktion unterbrochen wurde.

Kirill
quelle

Antworten:

18

Sie können C-gden Debugger auslösen, indem Sie ihn einschalten debug-on-quit. Mach einfach

M-x toggle-debug-on-quit

Jetzt erhalten Sie jedes Mal, wenn C-gSie drücken, eine Rückverfolgung dessen, was vor sich ging. Diese Rückverfolgung ist interaktiv, sodass Sie die Funktion mit weiter durchlaufen dund mit loslegen können c. (Probieren Sie es aus, es ist einfacher zu sehen als zu lesen).

Dies ist derselbe Backtrace, den Sie erhalten, wenn Sie (debug)in Ihren Code einfügen. Hier ist ein kurzer Blog-Beitrag dazu und die entsprechende Elisp-Handbuchseite .

Malabarba
quelle
(sanftmütig sagt hello);) Tolle Notiz, dass der Debugger interaktiv ist - ich hätte nie gedacht, das zu überprüfen :)
Sean Allred
@ SeanAllred ja, ich habe es erst vor ein paar Wochen herausgefunden.
Malabarba