Menginterupsi evaluasi dan mengamati tumpukan saat ini di emacs-lisp debugger?

17

Jika beberapa fungsi emacs-lisp, seperti pengait mode utama, membutuhkan waktu lebih lama dari yang diharapkan untuk dieksekusi, saya terkadang ingin menghentikannya dan melihat tumpukan saat ini. Idealnya, saya juga ingin dapat melihat nilai variabel, dan seterusnya, di debugger. Saya tidak berbicara tentang kode yang sengaja saya jalankan dalam mode emacs-lisp, melainkan kode yang dijalankan dalam operasi normal emacs.

Bagaimana saya bisa menghentikan eksekusi kode emacs-lisp secara langsung di emacs? Saya tidak tahu di muka fungsi mana yang perlu saya debug.

Misalnya, mengetik C-g, sementara itu mengganggu eksekusi, juga memberi tahu saya apa-apa tentang fungsi yang terputus.

Kirill
sumber

Jawaban:

18

Anda dapat membuat C-gpemicu debugger dengan menghidupkan debug-on-quit. Lakukan saja

M-x toggle-debug-on-quit

Sekarang setiap kali Anda menekan C-gAnda akan mendapatkan jejak balik dari apa yang sedang terjadi. Backtrace ini bersifat interaktif, sehingga Anda dapat terus melangkah melalui fungsi dengan d, dan Anda dapat mulai bergerak dengan c. (Cobalah, lebih mudah dilihat daripada membaca).

Ini adalah backtrace yang sama dengan yang Anda dapatkan dengan menambahkan (debug)di dalam kode Anda. Di sini ada posting blog pendek , dan halaman manual Elisp yang relevan .

Malabarba
sumber
(patuh berkata hello);) Catatan yang luar biasa bahwa debugger bersifat interaktif - Saya tidak pernah berpikir untuk memeriksanya :)
Sean Allred
@SeanAllred ya, saya baru tahu beberapa minggu yang lalu.
Malabarba