Nhận backtrace từ lỗi lập trình


12

Nếu một lỗi được báo hiệu trong mã Emacs Lisp, và debug-on-errort, tôi nhận được một bộ đệm backtrace mà làm cho nó dễ dàng để tìm ra nơi xảy ra lỗi. Tuy nhiên, đối với các lỗi xảy ra trong khi xử lý phản hồi từ mạng không đồng bộ, sẽ rất khó chịu khi bộ đệm backtrace bật lên, vì vậy tôi muốn bắt lỗi condition-casevà đăng nhập nó.

Vì vậy, khi tôi xử lý một lỗi trong đó condition-case, có cách nào để có quyền truy cập vào backtrace tại điểm xảy ra lỗi không? Gọi backtracehàm sẽ nhận được backtrace của mã bên trong trình xử lý, đó không phải là điều tôi đang tìm kiếm.

(condition-case e
    (do-something-that-might-fail)
  (error
    (message "%s"
             ;; This gets the wrong backtrace!
             (with-temp-buffer
               (let ((standard-output (current-buffer)))
                 (backtrace)
                 (buffer-string))))))

1
magithub-errorChức năng của tôi làm một cái gì đó tương tự như tôi nghĩ, nhưng tôi không ở máy tính ngay bây giờ. Nó có thể giúp bất kể.
Sean Allred

1
Đó là một vấn đề chung với bất kỳ ngôn ngữ nào quản lý ngăn xếp của nó theo cách tương tự. Một cách để xử lý đó là báo hiệu một lỗi đã có thông tin ngăn xếp kèm theo. Tức là trong trường hợp của bạn, bạn đã do-something-that-might-failtạo theo dõi ngăn xếp và đính kèm với lỗi mà nó phát sinh.
wvxvw

1
debbugs.gnu.org/cgi/orpreport.cgi?orms=24617#8 có một đề xuất (chưa thử bản thân mình)
npostavs

Câu trả lời:


1

Cách dễ nhất để làm là tạo trình gỡ lỗi của riêng bạn trong môi trường xảy ra lỗi. Điều đó diễn ra như thế này:

(defun my-debugger (&rest debugger-args)
  (message "BACKTRACE: %s"
           (with-temp-buffer
             (let ((standard-output (current-buffer)))
               (backtrace)
               (buffer-string)))))

(let ((debugger #'my-debugger))
  (foobar)) ; Runs a function with no definition!

Các letmôi trường sử dụng chức năng gỡ lỗi tùy chỉnh này my-debuggertrong suốt thời gian của mã bên trong nó, vì vậy nếu bạn gặp phải một lỗi un-xử lý, các "gỡ rối" sẽ chạy, trong đó chủ yếu chỉ in ra thông điệp. Trình gỡ lỗi này chạy trong môi trường xảy ra lỗi, do đó, backtrace của bạn sẽ cho bạn biết điều gì đã xảy ra.

Lưu ý: Mã này có hai vấn đề (có thể giải quyết) mà tôi sẽ để lại cho bạn. Đầu tiên, bạn có thể muốn loại bỏ một vài khung stack đầu tiên, vì chúng liên quan đến việc gọi backtrace. Thứ hai, bạn sẽ nhận được một thông báo cũng chỉ ra lỗi (ví dụ, trong trường hợp trên, "let: Định nghĩa chức năng của biểu tượng là void: foobar"). Không phải là vấn đề lớn, nhưng tôi không muốn làm vấy bẩn phản ứng của mình.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.