Katakan bahwa emacs melempar kesalahan yang tidak saya mengerti. Atau mungkin kesalahan mengatakan "Nilai simbol sebagai variabel tidak berlaku: mode", tetapi ada banyak kemunculan simbol modes
dalam kode saya, jadi saya perlu konteks. Bisakah Emacs dikonfigurasikan untuk menyebutkan nomor baris kode lisp sehingga saya bisa tahu kode apa yang menyebabkan kesalahan?
Saya telah mencoba melakukan (setq stack-trace-on-error '(buffer-read-only))
dan menjalankan kode yang ada dalam upaya untuk mendapatkan jejak stack. Tidak ada jejak stack juga.
Saya juga mencoba memanggil edebug-defun
fungsi saya dan melangkah melaluinya. Tidak sampai saya keluar dari fungsi kesalahan dilemparkan.
(Saya benar-benar tidak tertarik pada penyebab kesalahan tertentu yang saya hadapi saat ini seperti halnya saya dalam mengembangkan keterampilan debugging umum untuk elisp. Mohon saran tentang bagaimana saya dapat mengumpulkan nomor baris, atau sexp, atau jejak stack dari kesalahan.)
sumber
nil
debug-on-error
? Bukankah itu membantu?t
kemudian melanjutkan untuk eval fungsi kesalahan melempar.)debug-ignored-errors
apakah tidak ada kesalahan. Jika Anda mengaturdebug-on-signal
ke non-nil
, dan itu adalah kasus kode lain menangani kesalahan, Anda akan bisa mendapatkan kesalahan sebelum kode lain melakukannya.Jawaban:
Emacs menyediakan sejumlah fasilitas debug termasuk
M-x toggle-debug-on-error
,,M-x toggle-debug-on-quit
debug sinyal (yang dapat digunakan dengan mengirimUSR2
ke Emacs dari luar),debug-on-entry
(dari suatu fungsi),debug-on-message
(ketika melihat kecocokan regexp tertentu dari suatu pesan) dan akhirnya,debug
itu sendiri sebagai alternatif menginstruksikan fungsi denganC-u C-M-x
.Keduanya
debug
danedebug
menawarkan fungsionalitas yang cukup untuk memeriksa keadaan Emacs ketika mengevaluasi kode yang Anda minati, tekane
dan masukkan ekspresi.Namun, ketika
edebug
melompat ke tempat dalam fungsi yang diinstrumentasi dan karena itu memberi Anda petunjuk di mana mencarinya (yang agak konyol karena Anda sudah tahu apa sebenarnya yang telah Anda instal),debug
tidak melakukan ini sama sekali. Saya telah melakukan hack yang lebih kecil setelah menemukan bahwa setiap kalidebug
mengevaluasi buffer, ia memancarkan nilai titik yang terkait dengan kesalahan; dengan kata lain menggunakan informasi ini pada buffer dapat memberi Anda nomor baris di backtrace!Dengan ini pertanyaan awal dalam judul harus dijawab. Adapun masalah Anda dengan mendapatkan backtrace di tempat pertama, saya kehabisan ide berguna.
sumber
M-x debug
...? Lalu apa yang harus saya tekan?debug
, Anda dapat memeriksa dengan mengunjungi file elisp yang salah, melakukanM-x toggle-debug-on-error
danM-x eval-buffer
, kemudian jejak balik dengan nomor baris di posisi bermasalah harus muncul.eval-buffer
? Misalnya, jika Anda cukup menekan pintasan keyboard yang menjalankan perintah pribadi yang gagal dan membuka debugger di*Backtrace*
buffer ..Mungkin karena ini tahun 2018 sekarang, tetapi dalam kasus saya, saya hanya perlu mengaktifkan debug seperti yang disarankan wasamasa: Mx toggle-debug-on-error
Setelah ini, Mx eval-buffer pada file Elisp saya yang salah memberikan konteks dengan memberikan posisi kesalahan, seperti ini:
Debugger entered--Lisp error: (invalid-read-syntax ")") eval-buffer() ; Reading at buffer position 523 [....]
Mx goto-char melompat ke posisi kesalahan:
M-x goto-char 523
sumber
Saya telah memperluas jawaban wasamasa untuk memasukkan informasi tambahan:
sumber