GNU/Linux >> Belajar Linux >  >> Linux

Bisakah Anda mendapatkan program apa pun di Linux untuk mencetak jejak tumpukan jika itu segfault?

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


Linux
  1. Bisakah Anda Menjalankan Xcode di Linux?

  2. Bagaimana cara mendapatkan jejak tumpukan untuk C++ menggunakan gcc dengan informasi nomor baris?

  3. Bisakah Anda langsung melihat PDF berbahaya di Linux?

  1. Bagaimana Anda memulai Linux?

  2. 3 hal berguna yang dapat Anda lakukan dengan alat IP di Linux

  3. Apa yang dapat menyebabkan sinyal 11?

  1. Proses Boot Linux:Panduan untuk Memulai

  2. Linux – Bagaimana Cara Mendapatkan Versi Linux Apa Pun Untuk Melihat Macbook Pro SSD 2018?

  3. Dapatkan Kode Sumber untuk Perintah Linux apa pun