Bagaimana cara men-debug kesalahan pada penjaga dan selama font-lock

10

Ketika kesalahan terjadi di dalam proses sentinel atau selama penguncian font, maka Emacs tidak menunjukkan backtrace meskipun debug-on-errorsebelumnya diaktifkan.

Saya mengerti mengapa kesalahan ini ditangkap, kesalahan yang sama mungkin dipicu lagi saat mencoba menyajikan backtrace. Namun ketika saya ingin benar-benar men-debug kesalahan itu tidak sangat membantu. Saya lebih suka mengambil risiko Emacs menjadi tidak responsif daripada harus bekerja dari ini:

error in process sentinel: Wrong type argument: stringp, nil

Lagipula saya bisa memulai instance kedua, jika yang pertama mulai menjadi gila. Konteks yang sedikit lebih akan membantu ketika ada banyak tempat di mana kesalahan seperti itu secara teoritis dapat terjadi di sentinel.

Jadi bagaimana saya bisa memaksa Emacs untuk menunjukkan backtrace bahkan dalam kasus di mana debug-on-errortidak berpengaruh?

tarsius
sumber
1
Saya telah melihat emacs.stackexchange.com/questions/3552/… tetapi berpikir harus ada pertanyaan tentang ini secara umum, bukan hanya satu kasus tertentu. Saya juga sangat berharap "gunakan printf" bukan satu-satunya jawaban, karena itulah yang saya gunakan di masa lalu, dan itu tidak memuaskan, terutama jika kesalahannya adalah "Referensi wajah tidak valid: some-face-that-i-absolute-know -exists ", yang bisa dipicu oleh hampir setiap paket yang saya instal.
tarsius
URL menunjuk ke pertanyaan ini dan karena itu agak membingungkan dalam komentar Anda, apakah itu disengaja atau kesalahan atas nama Anda?
wasamasa
Itulah masalah yang saya maksud: ttp: //emacs.stackexchange.com/questions/1045/how-to-debug-startup-problem-if-debug-init-has-no-efect
tarsius
tautan tarsius yang dimaksud: emacs.stackexchange.com/questions/1045/... ‌ ug-init-has-no-effect
dcorking

Jawaban:

10

Untuk penjaga proses, saya pikir tidak ada alasan yang bagus. TKI saya pikir itu hanya fitur yang hilang, jadi saya sarankan Anda M-x report-emacs-bug.

Untuk font-lock, masalahnya lebih rumit karena apa yang sebenarnya terjadi adalah bahwa kesalahan dipicu selama jit-lock, yaitu selama redisplay, dan kami tidak dapat dengan mudah memasuki debugger pada saat itu (IIRC pada titik tertentu Gerd mencoba membuat ini bekerja, tetapi masih ada beberapa masalah serius). Jadi, Anda dapat men-debugnya dengan salah satu cara berikut:

  • M-x jit-lock-debug-mode yang mengubah jit-lock untuk dijalankan segera setelah ditampilkan ulang, sehingga kita dapat memasuki debugger.
  • M-: (setq font-lock-support-mode nil) RETdan kemudian menonaktifkan + mengaktifkan kembali font-lock. Dengan cara ini font-lock tidak menggunakan jit-lock lagi, jadi ini berjalan selama perintah pengguna daripada selama tampilan ulang berikutnya.
Stefan
sumber
Sebenarnya, debug-on-errortampaknya berfungsi dengan baik pada sentinel proses.
Stefan
@tarsius - silakan kirim tautan ke masalah debbugs Anda
dcorking
permintaan fitur tarsius adalah 19432 di mana ia ditandai sebagai tidak dapat diproduksi ulang. Stefan Monnier memposting solusi di sana yang menggunakan --evalalih-alih --debug-init . Juga solusinya tidak membantu saya jatuh ke dalam backtrace di aktual saya.emacs.d
dcorking
1
@dcorking: tidak, di bug # 19432, saya tidak memposting "solusi" tetapi upaya yang gagal untuk mereproduksi bug-nya. Mengapa Anda tidak mengirim resep untuk mereproduksi masalah Anda?
Stefan