2013-05-22 9 views
7

Quando l'applicazione si arresta in modo anomalo con un errore di segmentazione, desidero ottenere un core dump dal sistema. Lo faccio configurando prima di manoLinux: gestione di un errore di segmentazione e acquisizione di un core dump

ulimit -c unlimited 

Vorrei anche avere un'indicazione nei miei registri delle applicazioni che un errore di segmentazione è verificato. Lo faccio usando sigaction(). Se lo faccio comunque, il segnale non raggiunge la sua gestione predefinita e un core dump non viene salvato.

Come posso avere sia il core dump di sistema sia una linea di log dal mio gestore di segnale nello stesso momento?

risposta

1

La risposta: impostare la sigazione con la bandiera SA_RESETHAND e tornare dal gestore. La stessa istruzione si ripresenta, causando di nuovo un errore di segmentazione e invocando il gestore predefinito.

+0

Potete elaborare? – Short

+0

Ho paura che non possa. – shoosh

+1

Questo non funziona sulla versione di Redhat 6 su cui stavo effettuando il test e causa un ciclo regressivo in cui il gestore non viene ripristinato. Funziona se si archivia il vecchio gestore quando si chiama sigaction e lo si reimposta nel gestore SIGSEGV in modo esplicito. – phenompbg

5
  1. Sovrascrivere il gestore di segnale predefinito per SIGSEGV per chiamare la funzione di registrazione personalizzata.
  2. Dopo che è stato registrato, ripristinare e attivare il gestore predefinito che creerà il core dump.

Ecco un esempio di programma utilizzando signal:

void sighandler(int signum) 
{ 
    myLoggingFunction(); 

    // this is the trick: it will trigger the core dump 
    signal(signum, SIG_DFL); 
    kill(getpid(), signum); 
} 

int main() 
{ 
    signal(SIGSEGV, sighandler); 

    // ... 
} 

La stessa idea dovrebbe funzionare anche con sigaction.

Fonte: How to handle SIGSEGV, but also generate a core dump

+0

Ciò che ha funzionato per me è stato impostare il segnale da segnalare (signum, SIG_DFL); e lasciare che il gestore del segnale ritorni. – Vincent