Soluzione 1:
Potrebbe esserci un modo migliore, ma questo lo automatizza.
Inserisci quanto segue in ~/backtrace
:
backtrace
quit
Inseriscilo in uno script chiamato seg_wrapper.sh
in una directory nel tuo percorso:
#!/bin/bash
ulimit -c unlimited
"[email protected]"
if [[ $? -eq 139 ]]; then
gdb -q $1 core -x ~/backtrace
fi
Il ulimit
comando fa in modo che il core venga scaricato. "[email protected]"
sono gli argomenti dati allo script, quindi sarebbe il tuo programma e i suoi argomenti. $?
contiene lo stato di uscita, 139 sembra essere lo stato di uscita predefinito per la mia macchina per un segfault.
Per gdb
, -q
significa tranquillo (nessun messaggio introduttivo) e -x
dice a gdb
per eseguire i comandi nel file datogli.
Utilizzo
Quindi per usarlo devi solo:
seg_wrapper.sh ./mycommand and its arguments
Aggiorna
Potresti anche scrivere un gestore di segnale che faccia questo, guarda questo link.
Soluzione 2:
Mi dispiace entrare qui 2 anni dopo... mi sono imbattuto mentre cercavo qualcos'altro. Aggiungo questo per completezza.
1) Anche se penso che la risposta accettata sia ottima, richiede gdb. Il metodo che conosco utilizza libSegFault.so.
Se esegui la tua app con
LD_PRELOAD=...percorso-per.../libSegFault.so miaapp
Otterresti un rapporto con backtrace, librerie caricate, ecc.
2) Uno script wrapper catchsegv
è disponibile anche che tenterebbe di utilizzare addr2line
per tradurre gli indirizzi in nome file + numero di riga.
Queste sono soluzioni molto più leggere rispetto ai file core o gdb (buone per i sistemi embedded, per esempio)
Soluzione 3:
Hai bisogno dell'amico di tutti GDB
gdb <program> [core file]
Una volta che hai caricato il tuo corefile, il comando 'backtrace' (può essere abbreviato in bt) ti darà lo stack di chiamate corrente. Se esegui il tuo programma dall'interno di gdb, puoi impostare punti di interruzione arbitrari ed esaminare il contenuto della memoria, ecc.
Soluzione 4:
catchsegv
È stato menzionato in un'altra risposta (ma in nessun modo focalizzato). È uno strumento utile in bundle con il progetto glibc. Fornirà un backtrace (e altre utili informazioni di debug) solo se un programma fa davvero segfault.
Una buona recensione esiste qui.
Puoi includerlo nei tuoi script come meglio credi.
Soluzione 5:
Ubuntu (come progetto) usa Apport per fare questo. Puoi vedere come l'hanno fatto.
https://wiki.ubuntu.com/Apport