Gỡ lỗi một Emacs đông lạnh


48

Tôi đang sử dụng mew cho e-mail của tôi. Tôi cần sử dụng TLS với nhà cung cấp email của mình cho SMTP. Tuy nhiên, khi tôi cố gắng gọi điều đó, Emacs đóng băng.

Tôi muốn nhân cơ hội này để tìm hiểu thêm về các gói Emacs. Làm thế nào tôi sẽ đi về gỡ lỗi vấn đề này? Có một số loại trình gỡ lỗi tích hợp, như trong Common Lisp không? Tôi có thể sử dụng đăng nhập không?


3
Làm thế nào để bạn "gọi đó"? Nếu đó là bằng cách sử dụng lệnh Emacs được xác định trong Lisp thì bạn có thể (1) tải mã nguồn xác định lệnh, (2) sử dụng M-x debug-on-entry THE-COMMAND, sau đó bước qua trình gỡ lỗi bằng cách sử dụng d(hoặc đôi khi cđể bỏ qua một số bước). Giữ mã nguồn mở trong một khung khác, để bạn có thể làm theo những gì trình gỡ lỗi đang làm. Báo cáo những gì bạn thấy ở đây hoặc, nếu bạn nghĩ rằng nó gợi ý lỗi Emacs, sử dụng M-x report-emacs-bug.
vẽ

Câu trả lời:


44

Trước khi sử dụng gdb, nếu bạn đang sử dụng hệ điều hành Unix-y, bạn có thể thử gửi SIGUSR2đến quy trình Emacs, giống như được ghi lại trong DEBUGtệp được đề cập trong câu trả lời khác.

$ kill -SIGUSR2 <emacs_pid_goes_here>

Điều này sẽ khiến Emacs cố gắng thoát ra khỏi vòng lặp hiện tại của nó vào trình gỡ lỗi Lisp.

Hoặc sử dụng một lớp lót này mà không cần gõ emacs pid bằng tay:

$ ps aux | grep -ie emacs | grep -v grep | awk '{print $2}' | xargs kill -SIGUSR2

Ngoài ra, nếu killallcó sẵn:

$ killall -USR2 emacs

1
Phải làm điều đó hai lần (tốt, tôi có thể đã đợi hơn 1 giây trước khi thử lại :-). Dù sao, nó đã xác định chính xác vấn đề (xử lý khóa phông chữ quá chậm đối với một dòng dài).
Stéphane Gourichon

khóa phông chữ được biết là treo Emacs - nếu trình kích hoạt trình so khớp nhưng không di chuyển điểm về phía trước, nó sẽ lưu lại mãi mãi.
Lindydancer

wow, thật tuyệt vời Vẫn không chắc điều gì gây ra vấn đề của tôi nhưng mánh khóe đó là cứu cánh, cảm ơn bạn!
Matt

3
Trên hệ thống của tôi, oneliner có thể được đơn giản hóa thành 'killall -USR2 emacs' (tránh nếu bạn có nhiều quá trình Emacs).
YoungFrog

1
Đề nghị htop ( en.wikipedia.org/wiki/Htop ) cho việc này. /để tìm kiếm emacskgửi tín hiệu. Trình giám sát hoạt động trên máy Mac cũng có thể thực hiện (từ menu: Xem | Gửi tín hiệu đến quá trình).
Lassi

36

Nếu đóng băng biến mất khi bạn nhấn C-g, thì bạn có thể sử dụng trình gỡ lỗi tích hợp. Nhập M-x toggle-debug-on-quittrước khi gửi tin nhắn, nhấn C-gkhi nó đóng băng và kiểm tra *Backtrace*bộ đệm xuất hiện.

Nếu C-gkhông có ích, thì việc đóng băng có thể xảy ra trong mã C và bạn sẽ cần sử dụng trình gỡ lỗi bên ngoài như gdb. Nhấn C-h C-dđể xem DEBUGtệp đưa ra một số gợi ý về cách thực hiện. (Bạn cũng có thể đọc tệp DEBUG trong giao diện web của kho lưu trữ Emacs .) Câu trả lời này đi sâu vào chi tiết hơn về cách sử dụng gdbvới Emacs.


Bạn có thể phải đánh C-gnhiều lần : C-g C-g C-g.
vẽ

@Drew Tôi cũng nhận thấy rằng đánh nó nhiều lần là cần thiết. Bạn có biết tại sao?
Wilfred Hughes

2
Đúng. Xem hướng dẫn sử dụng Emacs, nútQuitting . Làm thế nào tôi tìm thấy điều đó? C-h r i, sau đó gõ "Cg" và nhấn RET.
vẽ
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.