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 mit C-u C-M-x
.
Beide debug
und edebug
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, wenn debug
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!
(with-eval-after-load 'debug
(defun debugger-setup-buffer (debugger-args)
"Initialize the `*Backtrace*' buffer for entry to the debugger.
That buffer should be current already."
(setq buffer-read-only nil)
(erase-buffer)
(set-buffer-multibyte t) ;Why was it nil ? -stef
(setq buffer-undo-list t)
(let ((standard-output (current-buffer))
(print-escape-newlines t)
(print-level 8)
(print-length 50))
(backtrace))
(goto-char (point-min))
(delete-region (point)
(progn
(search-forward "\n debug(")
(forward-line (if (eq (car debugger-args) 'debug)
2 ; Remove implement-debug-on-entry frame.
1))
(point)))
(insert "Debugger entered")
;; lambda is for debug-on-call when a function call is next.
;; debug is for debug-on-entry function called.
(pcase (car debugger-args)
((or `lambda `debug)
(insert "--entering a function:\n"))
;; Exiting a function.
(`exit
(insert "--returning value: ")
(setq debugger-value (nth 1 debugger-args))
(prin1 debugger-value (current-buffer))
(insert ?\n)
(delete-char 1)
(insert ? )
(beginning-of-line))
;; Debugger entered for an error.
(`error
(insert "--Lisp error: ")
(prin1 (nth 1 debugger-args) (current-buffer))
(insert ?\n))
;; debug-on-call, when the next thing is an eval.
(`t
(insert "--beginning evaluation of function call form:\n"))
;; User calls debug directly.
(_
(insert ": ")
(prin1 (if (eq (car debugger-args) 'nil)
(cdr debugger-args) debugger-args)
(current-buffer))
(insert ?\n)))
;; After any frame that uses eval-buffer,
;; insert a line that states the buffer position it's reading at.
(save-excursion
(let ((tem eval-buffer-list))
(while (and tem
(re-search-forward "^ eval-\\(buffer\\|region\\)(" nil t))
(beginning-of-line)
(insert (format "Error at line %d in %s: "
(with-current-buffer (car tem)
(line-number-at-pos (point)))
(with-current-buffer (car tem)
(buffer-name))))
(pop tem))))
(debugger-make-xrefs)))
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.
nil
debug-on-error
? Hilft das nicht?