Emacs menyediakan sejumlah fasilitas debug termasuk M-x toggle-debug-on-error
,, M-x toggle-debug-on-quit
debug sinyal (yang dapat digunakan dengan mengirim USR2
ke Emacs dari luar), debug-on-entry
(dari suatu fungsi), debug-on-message
(ketika melihat kecocokan regexp tertentu dari suatu pesan) dan akhirnya, debug
itu sendiri sebagai alternatif menginstruksikan fungsi dengan C-u C-M-x
.
Keduanya debug
dan edebug
menawarkan fungsionalitas yang cukup untuk memeriksa keadaan Emacs ketika mengevaluasi kode yang Anda minati, tekan e
dan masukkan ekspresi.
Namun, ketika edebug
melompat ke tempat dalam fungsi yang diinstrumentasi dan karena itu memberi Anda petunjuk di mana mencarinya (yang agak konyol karena Anda sudah tahu apa sebenarnya yang telah Anda instal), debug
tidak melakukan ini sama sekali. Saya telah melakukan hack yang lebih kecil setelah menemukan bahwa setiap kali debug
mengevaluasi buffer, ia memancarkan nilai titik yang terkait dengan kesalahan; dengan kata lain menggunakan informasi ini pada buffer dapat memberi Anda nomor baris di backtrace!
(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)))
Dengan ini pertanyaan awal dalam judul harus dijawab. Adapun masalah Anda dengan mendapatkan backtrace di tempat pertama, saya kehabisan ide berguna.
nil
debug-on-error
? Bukankah itu membantu?