Solusi 1:
Mungkin ada cara yang lebih baik, tetapi cara ini mengotomatiskannya.
Letakkan yang berikut di ~/backtrace
:
backtrace
quit
Masukkan ini ke dalam skrip bernama seg_wrapper.sh
dalam direktori di jalur Anda:
#!/bin/bash
ulimit -c unlimited
"[email protected]"
if [[ $? -eq 139 ]]; then
gdb -q $1 core -x ~/backtrace
fi
ulimit
perintah membuatnya jadi inti dibuang. "[email protected]"
adalah argumen yang diberikan pada skrip, jadi itu akan menjadi program Anda dan argumennya. $?
memegang status keluar, 139 tampaknya menjadi status keluar default untuk mesin saya untuk segfault.
Untuk gdb
, -q
berarti tenang (tidak ada pesan intro), dan -x
memberi tahu gdb
untuk menjalankan perintah dalam file yang diberikan kepadanya.
Penggunaan
Jadi untuk menggunakannya Anda cukup:
seg_wrapper.sh ./mycommand and its arguments
Perbarui
Anda juga dapat menulis penangan sinyal yang melakukan ini, lihat tautan ini.
Solusi 2:
Maaf datang ke sini 2 tahun kemudian ... tersandung saat mencari sesuatu yang lain. Menambahkan ini untuk kelengkapan.
1) Meskipun menurut saya jawaban yang diterima bagus, itu membutuhkan gdb. Metode yang saya kenal menggunakan libSegFault.so.
Jika Anda menjalankan aplikasi dengan
LD_PRELOAD=...path-to.../libSegFault.so myapp
Anda akan mendapatkan laporan dengan lacak balik, lib yang dimuat, dll
2) Skrip pembungkus catchsegv
juga tersedia yang akan mencoba menggunakan addr2line
untuk menerjemahkan alamat ke nama file + nomor baris.
Ini adalah solusi yang jauh lebih ringan daripada file inti atau gdb (baik untuk sistem tersemat misalnya)
Solusi 3:
Anda membutuhkan teman semua orang GDB
gdb <program> [core file]
Setelah Anda memuat corefile Anda, perintah 'backtrace' (dapat disingkat bt) akan memberi Anda tumpukan panggilan saat ini. Jika Anda menjalankan program dari dalam gdb, Anda dapat menyetel breakpoint arbitrer dan memeriksa konten memori, dll.
Solusi 4:
catchsegv
Itu disebutkan dalam jawaban lain (tetapi sama sekali tidak terfokus pada). Ini adalah alat praktis yang dibundel dengan proyek glibc. Ini akan memberikan backtrace (dan informasi debug berguna lainnya) hanya jika sebuah program memang melakukan segfault.
Ada tulisan yang bagus di sini.
Anda dapat memasukkannya ke dalam skrip Anda sendiri sesuai keinginan Anda.
Solusi 5:
Ubuntu (sebagai proyek) menggunakan Apport untuk melakukan ini. Anda dapat melihat bagaimana mereka melakukannya.
https://wiki.ubuntu.com/Apport