Emacs डिबगिंग सुविधाओं की एक अच्छी मात्रा प्रदान करता है M-x toggle-debug-on-error
, जिनमें , M-x toggle-debug-on-quit
सिग्नल पर डिबग (जिसका उपयोग USR2
बाहर से Emacs को भेजकर किया जा सकता है ), debug-on-entry
(एक फ़ंक्शन का), debug-on-message
(जब एक संदेश का विशिष्ट रेक्सक्सप मैच देखकर) और अंत में, debug
वैकल्पिक रूप में के साथ एक फंक्शन को इंस्ट्रूमेंट करना C-u C-M-x
।
दोनों debug
और edebug
निरीक्षण करने के लिए पर्याप्त सुविधा प्रदान करते राज्य Emacs की जब कोड कि आप रुचि में, हिट का मूल्यांकन e
और एक अभिव्यक्ति दर्ज करें।
हालांकि, जबकि edebug
यंत्रीकृत फ़ंक्शन में जगह के लिए कूदता है और इसलिए आपको एक सुराग देता है कि कहाँ देखना है (जो कि मूर्खतापूर्ण है क्योंकि आप पहले से ही जानते हैं कि आपने वास्तव में क्या लिखा है), debug
ऐसा बिल्कुल नहीं करता है। मैंने खोज के बाद एक छोटी सी हैक को खींच लिया है कि जब भी debug
एक बफर का मूल्यांकन करता है, तो यह त्रुटि से जुड़े बिंदु के मूल्य का उत्सर्जन करता है; दूसरे शब्दों में बफर पर इस जानकारी का उपयोग करके आप बैकट्रेस में एक लाइन नंबर दे सकते हैं!
(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)))
इसके साथ शीर्षक में मूल प्रश्न का उत्तर दिया जाना चाहिए। पहली जगह में बैकट्रेस होने के साथ आपकी समस्या के लिए, मैं उपयोगी विचारों से बाहर हूं।
nil
debug-on-error
? मदद नहीं करता है?