Saya ingin memaksa core dump di lokasi tertentu dalam aplikasi C ++ saya.
Saya tahu saya bisa melakukannya dengan melakukan sesuatu seperti:
int * crash = NULL;
*crash = 1;
Tapi saya ingin tahu apakah ada cara yang lebih bersih?
Saya menggunakan Linux.
Jawaban:
Menaikkan sinyal nomor 6 (
SIGABRT
di Linux) adalah salah satu cara untuk melakukannya (meskipun perlu diingat bahwa SIGABRT tidak diharuskan menjadi 6 dalam semua implementasi POSIX jadi Anda mungkin ingin menggunakanSIGABRT
nilainya sendiri jika ini adalah selain quick'n 'kode debug kotor).Memanggil
abort()
juga akan menyebabkan dump inti, dan Anda bahkan dapat melakukan ini tanpa menghentikan proses Anda dengan memanggilfork()
diikuti oleh hanyaabort()
pada anak - lihat jawaban ini untuk detailnya.sumber
ulimit -c unlimited
dari jawaban Suvesh Pratapa, banyak membantu saya untuk jawaban ini.Beberapa tahun yang lalu, Google merilis pustaka coredumper .
Bukan itu yang Anda minta, tapi mungkin lebih baik :)
sumber
Seperti yang tercantum di halaman manual sinyal , sinyal apa pun dengan tindakan yang terdaftar sebagai 'inti' akan memaksa pembuangan inti. Beberapa contohnya adalah:
Pastikan Anda mengaktifkan dump inti:
sumber
ulimit -c unlimited
.setrlimit(RLIMIT_CORE, &core_limits);
tersedia melalui#include <sys/resource.h>
. Anda membuat sebuah struct tiperlimit
dan kemudian mengaturrlim_cur
danrlim_max
anggota.sumber
abort()
langsung saja?Memohon
Terkait, terkadang Anda menginginkan penelusuran kembali tanpa core dump yang sebenarnya, dan mengizinkan program untuk terus berjalan: periksa fungsi glibc backtrace () dan backtrace_symbols (): http://www.gnu.org/s/libc/ manual / html_node / Backtraces.html
sumber
Cara lain untuk menghasilkan core dump:
Buat saja contoh baru dari bash dan matikan dengan sinyal yang ditentukan. Itu
$$
adalah PID dari shell. Jika tidak, Anda menghentikan pesta Anda saat ini dan akan keluar, terminal ditutup atau diputuskan.sumber
bash -c 'kill -SIGSEGV $$'
.Anda dapat menggunakan kill (2) untuk mengirim sinyal.
Begitu,
sumber
Kadang-kadang mungkin tepat untuk melakukan sesuatu seperti ini:
Satu masalah dengan pendekatan sederhana ini adalah hanya satu thread yang akan di-coredump.
sumber
gunakan pendekatan ini di mana pun Anda mau :)
sumber
sumber