La segnalazione dei Crash in C per Linux
Domanda
A seguito di questa domanda:
Buona la segnalazione dei crash libreria in c#
C'è qualche libreria CrashRpt.dll che fa la stessa cosa su Linux?Che è, generare un report di errore tra un core dump e, se necessario, ambiente e segnalare allo sviluppatore su di esso?
Edit:Questo sembra essere un duplicato di questa domanda
Soluzione
Vedere Ottenere le tracce dello stack su sistemi Unix, automaticamente su Stack Overflow.
Altri suggerimenti
Compilare il codice con i simboli di debug, inserire unlimit coredumpsize nel proprio guscio e si otterrà un coredump nella stessa cartella il file binario.Utilizzare gdb/ddd - aprire il programma e quindi aprire il core dump.Si può controllare questo per ulteriori info.
@Ionut
Questo gestisce la generazione di core dump, ma non gestire notifica lo sviluppatore altri utenti hanno avuto incidenti.
Nathan, in quali circostanze, in un segmento di base non-zero?Non ho mai visto che si verificano nei miei 5 anni di Linux per lo sviluppo di applicazioni.
Grazie.
@Martin
Faccio architettonico di convalida per x86, quindi sono molto familiarità con l'architettura del processore, ma molto onufamiliarità con l'utilizzo.Che è quello che ho basato il mio commento.Se CR2 può essere contato su per dare la risposta corretta, quindi mi trovo corretto.
Nathan, non insistendo sul fatto che si erano sbagliati;Stavo solo dicendo che nella mia (limitata) esperienza con Linux, il segmento di base è sempre zero.Forse questa è una buona domanda per me a chiedere...
Nota:ci sono due interessanti registri in un x86
seg-errore di crash.
Il primo, EIP, specifica il codice di indirizzo in cui si è verificata l'eccezione.In RichQ risposta, egli utilizza addr2line per mostrare la riga che corrisponde al crash indirizzo.Ma il PEI può essere valido;se si chiama un puntatore a funzione che è nullo, può essere 0x00000000
, e se si danneggia il vostro stack di chiamate, il ritorno può pop qualsiasi valore casuale nel PEI.
Il secondo, CR2, specifica l'indirizzo dei dati che ha causato l'errore di segmentazione.In RichQ esempio, è l'impostazione che ho come un puntatore nullo, quindi l'accesso a esso.In questo caso, CR2 sarebbe 0x00000000
.Ma se si modifica:
int j = *i
a:
int j = i[2];
Quindi si sta cercando di accesso indirizzo 0x00000008
, e che cosa si sarebbe trovato in CR2.