Angenommen, Emacs wirft einen Fehler auf, den ich nicht verstehe. Oder vielleicht lautet der Fehler "Der Wert des Symbols als Variable ist ungültig: Modi", aber das Symbol kommt modes
in meinem Code häufig vor, sodass ich einen gewissen Kontext benötige. Kann Emacs so konfiguriert werden, dass die Zeilennummer des Lisp-Codes angegeben wird, damit ich weiß, welcher Code den Fehler verursacht?
Ich habe es versucht (setq stack-trace-on-error '(buffer-read-only))
und den Tätercode ausgeführt, um einen Stack-Trace zu erhalten. Auch kein Stack-Trace.
Ich habe auch versucht, edebug-defun
meine Funktion aufzurufen und durchzugehen. Erst wenn ich die Funktion verlasse, wird der Fehler ausgelöst.
(Ich interessiere mich nicht so sehr für die Ursache des Fehlers, mit dem ich gerade konfrontiert bin, wie für die Entwicklung allgemeiner Debugging - Fähigkeiten für elisp. Bitte geben Sie an, wie ich eine Zeilennummer, ein Sexp oder eine Stack - Ablaufverfolgung von einem erstrahlen lassen kann Error.)
quelle
nil
debug-on-error
? Hilft das nicht?t
und dann fortfahre, eine Fehlerwurffunktion zu evaluieren.)debug-ignored-errors
keine Fehler aufgelistet sind. Wenn Siedebug-on-signal
auf non- setzennil
und der andere Code den Fehler behandelt hat, können Sie den Fehler vor dem anderen Code abrufen.Antworten:
Emacs bietet eine gute Menge an Debug - Einrichtungen , einschließlich
M-x toggle-debug-on-error
,M-x toggle-debug-on-quit
Debug auf Signal (das durch das Senden verwendet werden kann ,USR2
von außen nach Emacs),debug-on-entry
(einer Funktion),debug-on-message
und schließlich (wenn eine bestimmte regexp Übereinstimmung einer Nachricht zu sehen),debug
sich als Alternative zur Instrumentierung einer Funktion mitC-u C-M-x
.Beide
debug
undedebug
bieten genügend Funktionen, um den Status von Emacs zu überprüfen, wenn Sie den Code, an dem Sie interessiert sind, auswerten,e
drücken und einen Ausdruck eingeben.Während jedoch die
edebug
Sprünge an den Ort in der instrumentierten Funktion und damit Ihnen einen Anhaltspunkt gibt , wo man suchen (die Art von dumm ist , da Sie bereits wissen , was genau haben Sie instrumentiert),debug
tun dies nicht überhaupt. Ich habe einen kleineren Hack ausgeführt, nachdem ich festgestellt habe, dass immer dann, wenndebug
ein Puffer ausgewertet wird, der Wert des mit dem Fehler verbundenen Punkts ausgegeben wird. Mit anderen Worten, wenn Sie diese Informationen im Puffer verwenden, erhalten Sie eine Zeilennummer in der Rückverfolgung!Damit soll die ursprüngliche Frage im Titel beantwortet werden. Was das Problem betrifft, überhaupt einen Backtrace zu bekommen, habe ich keine nützlichen Ideen mehr.
quelle
M-x debug
...? Was drücke ich dann?debug
Sie durch den Besuch eine fehlerhafte elisp Datei überprüfen können, tunM-x toggle-debug-on-error
undM-x eval-buffer
dann ein Backtrace mit einer Zeilennummer an der problematischen Position sollte erscheinen.eval-buffer
? Zum Beispiel, wenn Sie nur eine Tastenkombination drücken, die einen privaten Befehl*Backtrace*
Vielleicht, weil es jetzt 2018 ist, aber in meinem Fall musste ich nur das Debuggen einschalten, wie von Wasamasa vorgeschlagen: Mx toggle-debug-on-error
Danach gab Mx eval-buffer in meiner fehlerhaften Elisp-Datei den Kontext an, indem er die Position des Fehlers wie folgt angab:
Debugger entered--Lisp error: (invalid-read-syntax ")") eval-buffer() ; Reading at buffer position 523 [....]
Mx goto-char springt zur Fehlerposition:
M-x goto-char 523
quelle
Ich habe die Antwort von wasamasa um zusätzliche Informationen erweitert:
quelle