Saya men-debug mengapa emacs lumpuh saat menggunakan fungsi dari paket 1 . Tujuan dari proses debug ini adalah untuk mendapatkan data yang berguna untuk dikirim menggunakan M-x report-emacs-bug
.
Untuk mendapatkan bantuan tentang cara men-debug crash emacs, saya telah melihat Manual Emacs - Manual Crashing and Emacs - Setelah Crash , tetapi mereka tidak membantu.
The Setelah A Kecelakaan pengguna mengacu emacs-buffer.gdb
tapi saya tidak tahu bagaimana menggunakannya. Saat meminta bantuan Google, saya menemukan pertanyaan emacs.SE ini , dan saya mengkompilasi ulang emacs menggunakan -ggdb3
flag.
Saya tidak punya pengalaman menggunakan gdb
dan jadi saya mencoba beberapa upaya gagal untuk menggunakan emacs-buffer.gbd
file.
Inilah yang saya coba:
gdb -x /path/to/emacs-buffer.gdb
gdb
->file /path/to/emacs-buffer.gdb
gdb
->source /path/to/emacs-buffer.gdb
source /path/to/emacs-buffer.gdb
Di samping catatan, emacs yang dikompilasi dengan -ggdb3
flag membutuhkan waktu sekitar 10 detik lebih lama untuk memuat; sebelumnya itu 5-6 detik, sekarang sekitar 16-17 detik. Saya tahu detik pasti karena kode yang menghitung itu di init saya. Apakah peningkatan waktu startup ini diharapkan?
Catatan Kaki 1: emacs crash secara konsisten ketika undo-tree
mencoba untuk mengembalikan sejarah undo untuk file .org tertentu (yang saya tidak bisa bagikan secara publik). Saya punya (setq undo-tree-auto-save-history t)
. Kecelakaan ini hanya terjadi pada emacs git master, bukan pada emacs 24.5. Pada emacs 24.5, undo-tree
melempar kesalahan yang menyatakan bahwa ia tidak dapat memuat sejarah undo (bahkan melalui file undo history ada), tetapi setidaknya sesi emacs tidak crash pada versi itu.
undue-tree
masalah, tetapi memiliki potensi yang lebih luas .undo-tree
jawaban khusus karena saya tahu akan sulit bagi orang lain untuk membuat ulang crash yang sebenarnya. Juga saya tidak dapat membagikan seluruh file org yang merupakan satu-satunya yang tampaknya menyebabkan crash ini. Jadi saya hanya menerapkangdb
tag pada pertanyaan ini. Saya memberikan kembali cerita itu sehingga jawabannya dapat membimbing saya cara men-debug emacs crash secara umum sehingga saya dapat mengajukan laporan bug emacs yang berguna .Jawaban:
Cara termudah untuk men-debug crash Emacs adalah memulai Emacs di bawah
gdb
, dan kemudian melakukan apa pun yang mereproduksi crash.Dengan asumsi Anda sedang membangun Emacs Anda dari sumber, Anda harus meneruskan
CFLAGS="-O0 -g3"
ke./configure
skrip. Ini membuat kompiler C mematikan optimisasi (yang dapat membuat hal-hal membingungkan saat debugging) dan mengaktifkan informasi debug maksimum dalam executable. Jalankanmake
untuk membangun Emacs.Kemudian, mulailah
gdb
dari dalamsrc
direktori pohon Emacs Anda:Pada OSX, Anda ingin meneruskan
--with-ns
ke./configure
skrip dan memulai gdb pada Emacs di dalam aplikasi yang dibuat:Alasan untuk memulai dari
src
direktori adalah bahwa ada.gdbinit
file yang mengatur definisi fungsi GDB yang berguna untuk debugging Emacs. Jika file itu dimuat, Anda akan melihat sesuatu seperti ini ketika memulaigdb
:Ketik
r
untuk memulai Emacs. Anda dapat memberikan argumen tambahan pada baris yang sama, misr --debug-init
.Kemudian cobalah membuat Emacs crash. Jika macet, Anda akan melihat catatan tentang itu di
gdb
, dan Anda akan dibiarkan di(gdb)
prompt lagi. Jika Emacs tidak mogok, tetapi macet, Anda bisa menekanC-z
terminal tempat Anda berlarigdb
untuk kembali ke prompt.Setelah diminta, ketik
bt
untuk mendapatkan backtrace. Sebagai bonus, jika.gdbinit
file Emacs dimuat dengan benar, Anda akan melihat lacak balik Lisp setelah C lacak balik. Kedua backtraces adalah hal yang sangat berguna untuk dimasukkanM-x report-emacs-bug
.Ada banyak informasi lebih lanjut, termasuk cara memeriksa keadaan variabel dll, dalam
etc/DEBUG
file di pohon Emacs. Anda dapat membukanya dengan mengetikC-h C-d
di dalam Emacs, atau Anda dapat membacanya secara online .sumber
emacs-buffer.gdb
dilakukan dan bagaimana menggunakannya.src/
. Saya menemukannyalib-src/
meskipun tetapi ini tidak berhasilgdb ./emacsclient -a '' -c
. Jadi saya butuh bantuan tentang cara untuk melewatkannya-a
dan menggunakan-c
emacsclient alih-alih ke gdb.