Debugging Emacs beku

48

Saya menggunakan mew untuk email saya. Saya perlu menggunakan TLS dengan penyedia email saya untuk SMTP. Namun, ketika saya mencoba memintanya, Emacs membeku.

Saya ingin memanfaatkan kesempatan ini untuk mempelajari lebih lanjut tentang paket Emacs. Bagaimana cara saya men-debug masalah ini? Apakah ada semacam debugger bawaan, seperti di Common Lisp? Bisakah saya menggunakan logging?

Svante
sumber
3
Bagaimana Anda "memohon itu"? Jika itu dengan menggunakan perintah Emacs yang didefinisikan dalam Lisp maka Anda dapat (1) memuat kode sumber yang mendefinisikan perintah, (2) gunakan M-x debug-on-entry THE-COMMAND, kemudian melangkah melalui debugger menggunakan d(atau kadang-kadang cuntuk melewati beberapa langkah). Biarkan kode sumber terbuka di frame lain, sehingga Anda dapat mengikuti apa yang dilakukan debugger. Laporkan apa yang Anda lihat di sini atau, jika Anda pikir itu menyarankan bug Emacs, gunakan M-x report-emacs-bug.
Drew

Jawaban:

45

Sebelum beralih ke gdb, jika Anda menggunakan sistem operasi Unix-y, Anda dapat mencoba mengirim SIGUSR2ke proses Emacs, seperti didokumentasikan dalam DEBUGfile yang disebutkan dalam jawaban lain.

$ kill -SIGUSR2 <emacs_pid_goes_here>

Ini akan membuat Emacs berusaha untuk keluar dari loop saat ini ke debugger Lisp.

Atau gunakan liner yang satu ini tanpa mengetikkan emacs pid secara manual:

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

Atau, jika killalltersedia:

$ killall -USR2 emacs
Dmitry
sumber
1
Harus melakukannya dua kali (well, saya bisa menunggu lebih dari 1 detik sebelum mencoba lagi :-). Bagaimanapun, itu menunjukkan masalah (pemrosesan font-lock terlalu lambat untuk garis panjang).
Stéphane Gourichon
font-lock dikenal untuk menggantung Emacs - jika pemicu memicu tetapi tidak menggerakkan titik ke depan, itu akan retrigger selamanya.
Lindydancer
wow, itu luar biasa. Masih tidak yakin apa yang menyebabkan masalah saya tetapi trik itu adalah penyelamat, terima kasih!
Matt
3
Di sistem saya oneliner dapat disederhanakan menjadi 'killall -USR2 emacs' (hindari jika Anda memiliki beberapa proses Emacs tentu saja).
YoungFrog
1
Rekomendasikan htop ( en.wikipedia.org/wiki/Htop ) untuk ini. /untuk mencari emacsdan kmengirim sinyal. Activity Monitor pada Mac juga dapat melakukannya (dari menu: View | Send Signal to Process).
Lassi
36

Jika pembekuan hilang saat Anda menekan C-g, maka Anda dapat menggunakan debugger bawaan. Ketik M-x toggle-debug-on-quitsebelum mengirim pesan, tekan C-gsaat membeku, dan periksa *Backtrace*buffer yang muncul.

Jika C-gtidak membantu, maka pembekuan mungkin terjadi dalam kode C, dan Anda harus menggunakan debugger eksternal seperti gdb. Hit C-h C-duntuk melihat DEBUGfile yang memberikan beberapa petunjuk tentang cara melakukannya. (Anda juga dapat membaca file DEBUG di antarmuka web repositori Emacs .) Jawaban ini menjelaskan lebih detail tentang cara menggunakan gdbEmacs.

legoscia
sumber
Anda mungkin harus memukul C-gbeberapa kali: C-g C-g C-g.
Drew
@Drew Saya juga memperhatikan bahwa memukulnya beberapa kali diperlukan. Apa kamu tahu kenapa?
Wilfred Hughes
2
Iya. Lihat manual Emacs, simpulQuitting . Bagaimana saya menemukan itu? C-h r i, lalu ketik "Cg" dan tekan RET.
Drew