2011-09-29 9 views
5

Quando ottengo il segnale che causa il coredump, voglio eseguire il mio gestore per copiare le strutture siginfo_t e ucontext_t in variabili globali, in modo che possano essere accessibili nel core dump. Attualmente alla fine del mio gestore riassegno il gestore predefinito e il call raise (thesig). Il problema è che il core dump "registri delle informazioni" mostra lo stato dei registri nel mio gestore e non al momento del segnale originale. Mi rendo conto che da quando ho salvato ucontext_t, posso cercare quello per i valori del registro originale, ma è probabile che quella conoscenza si perda/dimentichi quando i dump core vengono passati al team.Linux: Snoop un segnale senza cestinare i registri per il successivo core dump?

Quindi la mia domanda è: esiste un modo per controrilanciare un segnale e assicurarsi che il file di dump principale mantenga lo stato di registrazione del segnale originale? Ho pensato che forse avrei potuto usare alcuni in linea asm per ripristinare manualmente tutti i reg alla fine del gestore, quindi tornare alle istruzioni che hanno causato il segnale invece di chiamare raise(), ma non sono sicuro che possiamo garantirlo -testare l'istruzione causerà lo stesso comportamento di segnalazione del primo tentativo.

risposta

3

copia i siginfo_t e ucontext_t strutture alle variabili globali, in modo che possano essere accessibili nel core dump

Se si ri-rilanciare il segnale nel gestore, allora non c'è bisogno di copiare qualsiasi cosa: i valori saranno sullo stack e accessibili nel core dump.

"registri di informazioni" mostra lo stato dei registri nel gestore e non al momento del segnale originale.

Basta fare up 5 (o comunque molti livelli è necessario intensificare per arrivare al punto di arresto) e info reg di nuovo.

c'è un modo per controrilanciare un segnale e assicurarsi che il file di dump di base mantenga lo stato di registrazione del segnale originale?

Sì: impostare la disposizione del segnale su SIG_DFL utilizzando signal(signum, SIG_DFL); e tornare dall'handler. Le istruzioni che hanno causato SIGSEGV verranno riavviate e causeranno immediatamente un core dump.

+0

@ER, i punti di dumping del nucleo si trovano sempre nella posizione errata. :( – sree