GNU/Linux >> Linux Esercitazione >  >> Linux

Puoi ottenere qualsiasi programma in Linux per stampare una traccia dello stack se si verifica un segfault?

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


Linux
  1. Come hai iniziato con Linux?

  2. Linux:come ottenere qualsiasi versione di Linux per vedere il Macbook Pro Ssd 2018?

  3. Come ottenere l'ID thread di un pthread nel programma linux c?

  4. Puoi sviluppare applicazioni Linux con Xamarin?

  5. Puoi visualizzare direttamente un PDF dannoso su Linux?

Come tracciare l'esecuzione del programma utilizzando il comando Strace di Linux

13 modi in cui puoi aiutare Linux

Le migliori riviste Linux a cui puoi abbonarti

Hai bisogno di Java? Quindi puoi installarlo Java su Linux

Puoi superare questo? 15 Esempi pratici di comandi principali di Linux

Viaggio di un programma C verso un eseguibile Linux in 4 fasi