Làm thế nào để tôi gỡ lỗi một vụ tai nạn emacs?


16

Tôi đang gỡ lỗi tại sao emacs gặp sự cố khi sử dụng hàm từ gói 1 . Mục đích của quá trình gỡ lỗi này là để có được dữ liệu hữu ích để gửi bằng cách sử dụng M-x report-emacs-bug.

Để được trợ giúp về cách gỡ lỗi các sự cố emacs, tôi đã xem Hướng dẫn sử dụng Emacs - Hướng dẫn sử dụng CrashEmacs - Sau khi gặp sự cố , nhưng chúng không giúp ích gì.

Các một vụ tai nạn Sau khi thủ đề cập đến emacs-buffer.gdbnhưng tôi không có ý tưởng làm thế nào để sử dụng nó. Trong khi hỏi google để được giúp đỡ, tôi đã bắt gặp câu hỏi emacs.SE này và tôi đã biên dịch lại các emacs bằng các -ggdb3cờ.

Tôi không có kinh nghiệm sử dụng trước gdbvà vì vậy tôi đã thử một vài lần thất bại để sử dụng emacs-buffer.gbdtệp.

Đây là những gì tôi đã thử:

  • gdb -x /path/to/emacs-buffer.gdb
  • gdb -> file /path/to/emacs-buffer.gdb
  • gdb -> source /path/to/emacs-buffer.gdb
  • source /path/to/emacs-buffer.gdb

Mặt khác, các emacs được biên dịch với -ggdb3cờ sẽ mất khoảng 10 giây để tải; trước đó là 5-6 giây, bây giờ khoảng 16-17 giây. Tôi biết giây chính xác vì một mã tính toán trong init của tôi. Đây có phải là sự gia tăng thời gian khởi động dự kiến?


Chú thích 1: emacs gặp sự cố liên tục khi undo-treecố gắng khôi phục lịch sử hoàn tác cho một tệp .org cụ thể (mà tôi không thể chia sẻ công khai). Tôi có (setq undo-tree-auto-save-history t). Sự cố này chỉ xảy ra trên chủ nhân của emacs, không phải trên emacs 24.5. Trên emacs 24.5, undo-treeđưa ra một lỗi cho biết rằng nó không thể tải lịch sử hoàn tác (ngay cả thông qua tệp lịch sử hoàn tác tồn tại), nhưng ít nhất phiên emacs không gặp sự cố trên phiên bản đó.


2
Tôi đã sử dụng Emacs hơn hai năm và vẫn chưa thực sự tìm ra: stackoverflow.com/q/20891431/2112361 Thành thật mà nói, đó là một điều bí ẩn và cần có một chủ đề có thẩm quyền dạy cách làm nó
luật

Được rồi, câu hỏi là nhận được số lượt xem, nhưng không có upvote. Hãy cho tôi biết nếu bạn cần tôi để cải thiện câu hỏi. Nếu bạn nghĩ rằng câu hỏi có thể mang lại một câu trả lời hay và có thể hữu ích cho cộng đồng emacs, vui lòng nêu lên để nó nhận được sự chú ý của một người trả lời tương lai.
Kaushal Modi

Tôi không muốn chiếm quyền điều khiển của bạn, nhưng tôi sẽ đưa ra một gợi ý. Nếu chủ đề không thu hút được câu trả lời phù hợp trong một khoảng thời gian hợp lý (nghĩa là bạn quyết định điều đó có nghĩa là gì), thì có thể đáng để làm cho chủ đề này chung chung hơn - ví dụ: chủ đề có thẩm quyền về cách sử dụng gdb để gỡ lỗi Emacs sự cố, tạo backtraces có ý nghĩa sẽ hỗ trợ các bậc thầy trong nhóm phát triển Emacs chẩn đoán / khắc phục sự cố khi nhận được báo cáo lỗi có chứa thông tin nói. Tôi hiểu vấn đề là quan trọng vì các undue-treevấn đề, nhưng nó có tiềm năng rộng lớn hơn .
luật

@lawlist Đó chính xác là những gì tôi mong đợi chủ đề này. Tôi không mong đợi một undo-treecâu trả lời cụ thể bởi vì tôi biết sẽ khó có ai khác có thể tạo lại sự cố chính xác đó. Ngoài ra, tôi không thể chia sẻ toàn bộ tệp org, đây là tệp duy nhất gây ra sự cố này. Vì vậy, tôi chỉ áp dụng các gdbthẻ cho câu hỏi này. Tôi đã đưa ra câu chuyện ngược lại để các câu trả lời có thể hướng dẫn tôi cách gỡ lỗi một sự cố emacs nói chung để tôi có thể gửi báo cáo lỗi emacs hữu ích .
Kaushal Modi

@lawlist Tôi đã đọc lại câu hỏi để rõ ràng rằng nó không cụ thể cho bất kỳ gói nào.
Kaushal Modi

Câu trả lời:


15

Cách dễ nhất để gỡ lỗi sự cố Emacs là khởi động Emacs bên dưới gdb, và sau đó làm bất cứ điều gì đó là tái tạo sự cố.

Giả sử bạn đang xây dựng Emacs của mình từ nguồn, bạn nên chuyển CFLAGS="-O0 -g3"sang ./configuretập lệnh. Điều này làm cho trình biên dịch C tắt tối ưu hóa (có thể khiến mọi thứ trở nên khó hiểu trong khi gỡ lỗi) và kích hoạt thông tin gỡ lỗi tối đa trong tệp thực thi. Chạy makeđể xây dựng Emacs.

Sau đó, bắt đầu gdbtừ trong srcthư mục của cây Emacs của bạn:

$ cd ~/my-emacs-tree/src
$ gdb ./emacs

Trên OSX, bạn sẽ muốn chuyển --with-nsđến ./configuretập lệnh và bắt đầu gdb trên Emacs bên trong ứng dụng đã tạo:

$ cd ~/my-emacs-tree
$ make install
$ cd src
$ gdb nextstep/Emacs.app/Contents/MacOS/Emacs

Lý do để bắt đầu từ srcthư mục là có một .gdbinittệp thiết lập các định nghĩa hàm GDB hữu ích để gỡ lỗi Emacs. Nếu tệp đó đã được tải, bạn sẽ thấy một cái gì đó như thế này khi bắt đầu gdb:

DISPLAY = /private/tmp/com.apple.launchd.cNjhIdtUNd/org.macosforge.xquartz:0
TERM = xterm-256color
Breakpoint 1 at 0x1000ca444: file ../../src/emacs.c, line 353.
Breakpoint 2 at 0x1000e7e34: file ../../src/sysdep.c, line 926.

Nhập rđể bắt đầu Emacs. Bạn có thể truyền các đối số phụ trên cùng một dòng, vd r --debug-init.

Sau đó cố gắng làm cho Emacs sụp đổ. Nếu nó gặp sự cố, bạn sẽ thấy một ghi chú về nó gdbvà bạn sẽ lại được (gdb)nhắc lại. Nếu Emacs không gặp sự cố, nhưng đóng băng, bạn có thể nhấn C-zvào thiết bị đầu cuối nơi bạn đang chạy gdbđể quay lại dấu nhắc.

Một lần tại dấu nhắc, gõ btđể có được một backtrace. Như một phần thưởng, nếu .gdbinittệp Emacs được tải chính xác, bạn sẽ thấy một backtrace Lisp sau backtrace C. Cả hai backtraces là những thứ rất hữu ích để đưa vào M-x report-emacs-bug.


Có nhiều thông tin hơn, bao gồm cả cách kiểm tra trạng thái của các biến, v.v., trong etc/DEBUGtệp trong cây Emacs. Bạn có thể mở nó bằng cách gõ C-h C-dvào Emacs hoặc bạn có thể đọc nó trực tuyến .


Cảm ơn. Tôi sẽ tìm thời gian hôm nay để thử giải pháp của bạn. Tôi vẫn tò mò emacs-buffer.gdbkhông biết làm gì và sử dụng nó như thế nào.
Kaushal Modi

Theo tôi hiểu, đó là cách đặc biệt để khôi phục nội dung của tệp bạn đang chỉnh sửa khi Emacs bị sập. Khi Emacs tự động lưu trữ cứ sau 30 giây và cứ sau 300 lần nhấn phím, tôi sẽ nói rằng đó là việc sử dụng hạn chế.
Legoscia

1
Nhưng điều đó cũng sẽ giúp phục hồi bộ đệm không tập tin, điều đó có đúng không? Ý tưởng của tôi là sử dụng nó để xem những gì * Tin nhắn * và * Backtrace * ngay trước khi gặp sự cố.
Kaushal Modi

Ah, đó là một điểm tốt. Tôi chưa bao giờ sử dụng nó cho mình, vì vậy tôi không biết làm thế nào để làm điều đó.
Legoscia

Bạn có biết làm thế nào để chạy gdb trên emacsclient? Tôi không thể tìm thấy nhị phân đó trong src/. Tôi đã tìm thấy nó lib-src/mặc dù nhưng điều này đã không làm việc gdb ./emacsclient -a '' -c. Vì vậy, tôi cần giúp đỡ về cách vượt qua những điều đó -avà lập luận -ccho emacsclient thay vì gdb.
Kaushal Modi
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.