Bagaimana cara men-debug crash emacs?

16

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.gdbtapi saya tidak tahu bagaimana menggunakannya. Saat meminta bantuan Google, saya menemukan pertanyaan emacs.SE ini , dan saya mengkompilasi ulang emacs menggunakan -ggdb3flag.

Saya tidak punya pengalaman menggunakan gdbdan jadi saya mencoba beberapa upaya gagal untuk menggunakan emacs-buffer.gbdfile.

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 -ggdb3flag 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-treemencoba 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-treemelempar 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.

Kaushal Modi
sumber
2
Saya lebih dari dua tahun menggunakan Emacs dan masih belum benar-benar mengetahuinya: stackoverflow.com/q/20891431/2112489 Sejujurnya, ini agak misteri dan harus ada utas otoritatif yang mengajarkan cara melakukan Emacs Itu.
hukum
Baiklah, pertanyaannya adalah mendapatkan jumlah penayangan, tetapi tidak ada peningkatan. Beri tahu saya jika Anda membutuhkan saya untuk meningkatkan pertanyaan. Jika Anda berpikir bahwa pertanyaan itu dapat menghasilkan jawaban yang baik dan dapat membantu komunitas emacs, harap perbarui pertanyaan tersebut sehingga mendapat perhatian dari calon penjawab.
Kaushal Modi
Saya tidak ingin membajak utas Anda, tetapi saya akan memberikan saran. Jika utas tidak menarik jawaban yang cocok dalam periode waktu yang wajar (yaitu, Anda memutuskan apa artinya), mungkin bermanfaat untuk menjadikan utas ini lebih umum - misalnya, utas otoritatif tentang cara menggunakan gdb untuk men-debug Emacs crash, membuat jejak balik yang bermakna yang akan membantu guru di tim pengembangan Emacs untuk mendiagnosis / memecahkan masalah ketika menerima laporan bug yang berisi informasi tersebut. Saya mengerti masalah ini penting karena undue-treemasalah, tetapi memiliki potensi yang lebih luas .
lawlist
@lawlist Itulah yang saya harapkan dari utas ini. Saya tidak mengharapkan undo-treejawaban 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 menerapkan gdbtag 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 .
Kaushal Modi
@lawlist Saya telah mengulangi pertanyaannya sehingga jelas tidak spesifik untuk paket apa pun.
Kaushal Modi

Jawaban:

15

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 ./configureskrip. Ini membuat kompiler C mematikan optimisasi (yang dapat membuat hal-hal membingungkan saat debugging) dan mengaktifkan informasi debug maksimum dalam executable. Jalankan makeuntuk membangun Emacs.

Kemudian, mulailah gdbdari dalam srcdirektori pohon Emacs Anda:

$ cd ~/my-emacs-tree/src
$ gdb ./emacs

Pada OSX, Anda ingin meneruskan --with-nske ./configureskrip dan memulai gdb pada Emacs di dalam aplikasi yang dibuat:

$ cd ~/my-emacs-tree
$ make install
$ cd src
$ gdb nextstep/Emacs.app/Contents/MacOS/Emacs

Alasan untuk memulai dari srcdirektori adalah bahwa ada .gdbinitfile yang mengatur definisi fungsi GDB yang berguna untuk debugging Emacs. Jika file itu dimuat, Anda akan melihat sesuatu seperti ini ketika memulai gdb:

DISPLAY = /private/tmp/com.apple.launchd.cNjhIdtUNd/org.macosforge.xquartz:0
TERM = xterm-256color
Breakpoint 1 at 0x1000ca444: file ../../src/emacs.c, line 353.
Breakpoint 2 at 0x1000e7e34: file ../../src/sysdep.c, line 926.

Ketik runtuk memulai Emacs. Anda dapat memberikan argumen tambahan pada baris yang sama, mis r --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 menekan C-zterminal tempat Anda berlari gdbuntuk kembali ke prompt.

Setelah diminta, ketik btuntuk mendapatkan backtrace. Sebagai bonus, jika .gdbinitfile Emacs dimuat dengan benar, Anda akan melihat lacak balik Lisp setelah C lacak balik. Kedua backtraces adalah hal yang sangat berguna untuk dimasukkan M-x report-emacs-bug.


Ada banyak informasi lebih lanjut, termasuk cara memeriksa keadaan variabel dll, dalam etc/DEBUGfile di pohon Emacs. Anda dapat membukanya dengan mengetik C-h C-ddi dalam Emacs, atau Anda dapat membacanya secara online .

legoscia
sumber
Terima kasih. Saya akan menemukan waktu hari ini untuk mencoba solusi Anda. Saya masih penasaran apa yang emacs-buffer.gdbdilakukan dan bagaimana menggunakannya.
Kaushal Modi
Seperti yang saya pahami, itu khusus untuk memulihkan konten file yang Anda edit ketika Emacs crash. Karena Emacs menyimpan otomatis setiap 30 detik dan setiap 300 penekanan tombol, saya akan mengatakan bahwa penggunaannya terbatas.
legoscia
1
Tetapi itu juga harus membantu memulihkan buffer non-file, apakah itu benar? Ide saya adalah menggunakannya untuk melihat apa yang * Pesan * dan * Backtrace * miliki sebelum crash.
Kaushal Modi
Ah, itu poin bagus. Saya tidak pernah menggunakannya sendiri, jadi saya tidak yakin bagaimana melakukannya.
legoscia
Apakah Anda tahu cara menjalankan gdb di emacsclient? Saya tidak dapat menemukan biner itu di src/. Saya menemukannya lib-src/meskipun tetapi ini tidak berhasil gdb ./emacsclient -a '' -c. Jadi saya butuh bantuan tentang cara untuk melewatkannya -adan menggunakan -cemacsclient alih-alih ke gdb.
Kaushal Modi