ত্রুটিতে লাইন নম্বর দেখান


15

বলুন যে ইমাসগুলি কিছু ত্রুটি ছুড়েছে যা আমি বুঝতে পারি না। অথবা হতে পারে ত্রুটিটি "চিহ্ন হিসাবে পরিবর্তনশীল হিসাবে মানটি শূন্য: মোডগুলি" বলে, তবে modesআমার কোডে প্রতীকটির অনেকগুলি উপস্থিতি রয়েছে , তাই আমার কিছু প্রসঙ্গের প্রয়োজন। ইমাসকে কি লিসপ কোডের লাইন নম্বরটি উল্লেখ করার জন্য কনফিগার করা যেতে পারে যাতে আমি জানতে পারি কোন কোডটি ত্রুটি সৃষ্টি করছে?

(setq stack-trace-on-error '(buffer-read-only))স্ট্যাক ট্রেস পাওয়ার চেষ্টা করে আমি চেষ্টা করার চেষ্টা করেছি এবং অপরাধী কোডটি চালিয়েছি। কোনও স্ট্যাকের ট্রেসও নেই।

আমি edebug-defunআমার ফাংশনটিতে কল করার এবং এটির মাধ্যমে পদক্ষেপ নেওয়ার চেষ্টা করেছি। আমি ততক্ষণ ততক্ষণে ফাংশন থেকে সরে আসছি না যে ত্রুটি নিক্ষেপ করা হয়।

(আমি বর্তমানে এলিস্পের জন্য সাধারণ ডিবাগিং দক্ষতা বিকাশের ক্ষেত্রে যে বিশেষ ত্রুটির মুখোমুখি হচ্ছি তার কারণ সম্পর্কে আমি তেমন আগ্রহী নই। দয়া করে পরামর্শ দিন যে আমি কীভাবে একটি লাইন নম্বর, বা একটি যৌনতা, বা একটি স্ট্যাক ট্রেসকে ঝলক করতে পারি) ত্রুটি.)


আপনি কি ইতিমধ্যে অ-চেষ্টা করেছেন nil debug-on-error? যে সাহায্য করে না?
ড্রিউ

নাঃ। এতে কিছু করার মনে হয় না। (আমি এটি সেট করার পরে tতারপরে একটি ত্রুটি-নিক্ষেপ ফাংশনটি প্রকাশ করতে এগিয়ে যাওয়ার পরে।)
জ্যাকসন

সম্ভবত যা ঘটে তা হ'ল অন্য কিছু কোড ত্রুটিটি ধরা দেয় এবং কেবল ত্রুটির বার্তাটি প্রিন্ট করে। এছাড়াও পরীক্ষা করুন যে debug-ignored-errorsকোনও ত্রুটি তালিকাবদ্ধ করে না। আপনি যদি debug-on-signalঅ- তে সেট করে থাকেন nilএবং অন্য কোডটি ত্রুটিটি পরিচালনা করে এমনটি হয় তবে অন্যান্য কোডটি করার আগে আপনি ত্রুটিটি পেতে সক্ষম হবেন।
wvxvw

আমি বর্তমানে একই পরিস্থিতিতে রয়েছি এবং এই প্রশ্নটি পড়ছিলাম। স্ট্যাক-ট্রেস অন-ত্রুটি সম্পর্কে আমি ভাবছি। এই পরিবর্তনশীলটি ইম্যাক্স 25.1 তে নথিভুক্ত নয়।
ম্যাথিয়াস

উত্তর:


15

এ গিয়ে Emacs সহ সুবিধার ডিবাগ একটি ভাল পরিমাণ উপলব্ধ M-x toggle-debug-on-error, M-x toggle-debug-on-quitসংকেত ডিবাগ (যা পাঠিয়ে ব্যবহার করা যেতে পারে USR2বাইরে থেকে এ গিয়ে Emacs করা), debug-on-entry(ক ফাংশনের), debug-on-message(যখন একটি বার্তা একটি নির্দিষ্ট regexp ম্যাচ এইজন্য) এবং পরিশেষে, 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সমস্যাযুক্ত অবস্থানে একটি লাইন নম্বরযুক্ত ব্যাকট্রিজটি পপ আপ হওয়া উচিত।
wasamasa

আপনি ব্যবহার না হলে এই কাজ করবে eval-buffer? উদাহরণস্বরূপ, আপনি যদি কেবল একটি কীবোর্ড শর্টকাট *Backtrace*
টিপেন

না, তা হবে না। আপনি প্রতীকটির ফাংশন মান পাবেন (যা হয় কোনও তালিকা বা বাইট-সংকলিত কিছু হতে পারে) এবং এটি এটি যথেষ্ট পরিমাণে।
ওয়াসমাস

4

সম্ভবত এটি এখন 2018, তবে আমার ক্ষেত্রে, কেবলমাত্র ওয়াসমাসার পরামর্শ মতো আমাকে ডিবাগিং চালু করতে হয়েছিল: এমএক্স টগল-ডিবাগ-অন-ত্রুটি

এর পরে, আমার ত্রুটিযুক্ত এলিস্প ফাইলের এমএক্স ইভাল-বাফার ত্রুটির অবস্থানটি এইভাবে সরবরাহ করে প্রসঙ্গ দিয়েছে: Debugger entered--Lisp error: (invalid-read-syntax ")") eval-buffer() ; Reading at buffer position 523 [....]

এমএক্স গোটো-চর ত্রুটির অবস্থানে চলে যায়: M-x goto-char 523


ভাল লাগছে! এটি 2017 এ যুক্ত হয়েছে বলে মনে হয়, যখন তারা ব্যাকট্র্যাস আইটেমগুলির তালিকায় কাজ করার জন্য সেই ফাংশনটি পুনরায় কাজ করেছিল।
wasamasa

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))))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.