त्रुटि पर लाइन नंबर दिखाएं


15

कहो कि emacs कुछ त्रुटि फेंकता है जो मुझे समझ में नहीं आता है। या हो सकता है कि त्रुटि कहती है "वैरिएबल के रूप में सिंबल का मूल्य शून्य है: मोड", लेकिन modesमेरे कोड में प्रतीक की कई घटनाएं हैं , इसलिए मुझे कुछ संदर्भ की आवश्यकता है। क्या Emacs को लिस्प कोड की लाइन संख्या का उल्लेख करने के लिए कॉन्फ़िगर किया जा सकता है ताकि मुझे पता चल सके कि किस कोड में त्रुटि हो रही है?

मैंने कोशिश की है (setq stack-trace-on-error '(buffer-read-only))और स्टैक ट्रेस प्राप्त करने के प्रयास में लगातार कोड चला रहा हूं । कोई स्टैक ट्रेस भी नहीं।

मैंने edebug-defunअपने फंक्शन पर कॉल करने और इसके जरिए कदम बढ़ाने की भी कोशिश की है। यह तब तक नहीं है जब तक कि मैं फ़ंक्शन से बाहर नहीं निकलता हूं कि त्रुटि फेंक दी गई है।

(मैं वास्तव में उस विशेष त्रुटि के कारण के बारे में दिलचस्पी नहीं ले रहा हूं जो मैं वर्तमान में सामना कर रहा हूं क्योंकि मैं सामान्य रूप से सामान्य डिबगिंग कौशल विकसित करने में हूं। कृपया सलाह दें कि मैं एक लाइन नंबर, या एक सेक्सपी, या स्टैक ट्रेस को कैसे चमका सकता हूं? त्रुटि।)


क्या आपने पहले से ही गैर-कोशिश की थी nil debug-on-error? मदद नहीं करता है?
ड्रू

नहीं। यह कुछ भी करने के लिए प्रतीत नहीं होता है। (जब मैंने इसे सेट किया tऔर फिर एक त्रुटि-फेंकने वाले फ़ंक्शन को निकालने के लिए आगे बढ़ा।)
जैक्सन

संभवतः ऐसा होता है कि कुछ अन्य कोड त्रुटि पकड़ते हैं और त्रुटि संदेश प्रिंट करते हैं। यह भी जांचें कि debug-ignored-errorsकोई त्रुटि नहीं है। यदि आप debug-on-signalगैर- पर सेट करते हैं nil, और यह वह स्थिति थी, जिसमें अन्य कोड ने त्रुटि को संभाला था, तो आप दूसरे कोड को करने से पहले त्रुटि प्राप्त कर सकेंगे।
wvxvw

मैं इस समय एक समान स्थिति में हूं और इस सवाल को पढ़ रहा था। मैं स्टैक-ट्रेस-ऑन-एरर के बारे में सोच रहा हूं। यह चर Emacs 25.1 में प्रलेखित नहीं है।
मथायस

जवाबों:


15

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)))

इसके साथ शीर्षक में मूल प्रश्न का उत्तर दिया जाना चाहिए। पहली जगह में बैकट्रेस होने के साथ आपकी समस्या के लिए, मैं उपयोगी विचारों से बाहर हूं।


आपकी मदद के लिए धन्यवाद, लेकिन मैं अभी भी समझ नहीं पा रहा हूं कि लाइन नंबर कैसे लाया जाए। M-x debug...? फिर मैं क्या दबाऊं?
जैक्सन

इस कोड के साथ आप एक लाइन नंबर देखेंगे जिसके द्वारा बनाया गया है debug, आप एक दोषपूर्ण अतिसंकल्प फ़ाइल पर जाकर चेक कर सकते हैं, कर सकते हैं M-x toggle-debug-on-errorऔर M-x eval-bufferफिर समस्याग्रस्त स्थिति में लाइन नंबर के साथ एक बैकट्रेस पॉप अप करना चाहिए।
वामासा

यदि आप उपयोग नहीं करते हैं तो क्या यह काम करेगा eval-buffer? उदाहरण के लिए, यदि आप एक कीबोर्ड शॉर्टकट दबाते हैं जो एक निजी कमांड चलाता है जो विफल हो जाता है और *Backtrace*बफर में डीबगर को खोलता है ..
Håkon Hågland

नहीं, यह नहीं होगा। आपको प्रतीक का फ़ंक्शन मान मिलता है (जो या तो एक सूची या कुछ बाइट-संकलित हो सकता है) और यह बहुत अधिक है।
थामासा

4

शायद इसलिए कि यह अब 2018 है, लेकिन मेरे मामले में, मुझे केवल डिबगिंग को चालू करना पड़ा जैसे कि वासमासा ने सुझाव दिया: एमएक्स टॉगल-डिबग-ऑन-एरर

इसके बाद, मेरी दोषपूर्ण Elisp फ़ाइल पर Mx eval-बफर ने त्रुटि की स्थिति प्रदान करके संदर्भ दिया, जैसे: Debugger entered--Lisp error: (invalid-read-syntax ")") eval-buffer() ; Reading at buffer position 523 [....]

Mx गोटो-चार त्रुटि स्थिति में कूदता है: M-x goto-char 523


अच्छा लगा! ऐसा प्रतीत होता है कि यह 2017 में वापस जोड़ा गया है, जब उन्होंने बैकट्रेस आइटम की सूची पर काम करने के लिए उस फ़ंक्शन को फिर से काम किया।
वामासा

1

मैंने अतिरिक्त जानकारी को शामिल करने के लिए वामासा का उत्तर दिया:

(save-excursion
  (let ((tem eval-buffer-list))
    (while (and tem
                (re-search-forward "^  eval-\\(buffer\\|region\\)(" nil t))
      (beginning-of-line)
      (insert (apply 'format "Error at line %d, column %d (point %d) in %s\n"
                     (with-current-buffer (car tem)
                       (list (line-number-at-pos (point))
                             (current-column)
                             (point)
                             (buffer-name)))))
      (pop tem))))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.