2012-06-22 18 views
14

Potrebbe dirmi cosa potrebbe causare un errore SIGABRT in C++?Che cosa causa un errore SIGABRT?

+2

Buon punto !! :) ho provato a cercare su esso dice la sua un segnale che viene inviato per annullare il processo dal compilatore per il sistema, ma il mio compilatore non dice quale parte sta causando questo insolito comportamento, al n freccia in giù su questo, ho chiesto possibili ragioni. Il mio codice è lungo 500 righe. – user1444426

+0

@ user1444426 - Compilalo in modalità debug (-g con g ++), usa dbx e troverà il problema. –

+1

@Ecatmur, la pagina di Wikipedia non è davvero così utile. Tutto ciò che dice è che "abort" solleva quel segnale, ma non va oltre. A volte ricevo segnali 'SIGABRT' nei miei programmi, ma non ho * mai * chiamato direttamente' abort'. –

risposta

8

Ciò accade di solito quando le librerie incontrano errori interni, quindi chiamano abort(), perché non possono continuare. Questo potrebbe accadere quando sovrascrivi una delle sue strutture dati (quella che appartiene alla funzione da libc per esempio). Quindi questo potrebbe essere ad es. libc calling perché hai sovrascritto qualcosa. E l'applicazione deve quindi terminare perché è impossibile continuare o gestirla, che è chiamata asserzione fallita.

10

Per Wikipedia,

SIGABRT viene inviato dal processo stesso quando chiama la funzione libc abort, definito in stdlib.h. Il segnale SIGABRT può essere catturato, ma non può essere bloccato; se il gestore di segnale ritorna, tutti i flussi aperti vengono chiusi e scaricati e il programma termina (scaricando il core se necessario). Ciò significa che la chiamata abort non restituisce mai. A causa di questa caratteristica, viene spesso utilizzato per segnalare condizioni fatali nelle librerie di supporto, situazioni in cui l'operazione corrente non può essere completata ma il programma principale può eseguire la pulizia prima di uscire. Viene utilizzato quando un'asserzione fallisce.

Ciò significa che se il codice è chiamando abort direttamente né l'invio di per sé il segnale SIGABRT via raise, e non si ha nessun affermazioni in mancanza, la causa deve essere che una libreria di supporto (che potrebbe essere libc) ha riscontrato un errore interno. Se fornite i dettagli del vostro programma potremmo essere in grado di suggerire possibili cause. Ancora meglio, se si esamina un core o si esegue il programma in un debugger, si dovrebbe essere in grado di raccogliere una traccia dello stack, che mostrerà quale libreria ha causato l'interruzione del programma.

(E 'anche possibile che un altro programma sul vostro sistema sta inviando il vostro programma SIGABRT, ma questo è nella maggior parte dei casi infinitamente improbabile.)

3

In pratica questo di solito è innescata dalla macro assert:

char* foo = NULL; 
assert(foo != NULL); 

si tradurrebbe in SIGABRT

Problemi correlati