2012-06-22 19 views
14

¿Podría decirme qué podría causar una falla SIGABRT en C++?¿Qué causa una falla SIGABRT?

+2

Buen punto !! :) he intentado mirando hacia arriba se dice que es una señal que se envía para abortar el proceso de compilador para el sistema, pero mi compilador no dice qué parte está causando este inusual comportamiento, para n con la flecha hacia abajo, pregunté por posibles razones. Mi código tiene 500 líneas de longitud. – user1444426

+0

@ user1444426 - Compilarlo en modo de depuración (-g con g ++), use dbx y encontrará el problema. –

+1

@Ecatmur, la página de Wikipedia no es realmente tan útil. Todo lo que dice es que 'abortar' levanta esa señal, pero no va más allá de eso. A veces recibo señales de 'SIGABRT' en mis programas, pero nunca * llamé directamente' abortar '. –

Respuesta

8

Esto suele ocurrir cuando las bibliotecas encuentran un error interno, por lo que llaman a abort(), porque no pueden continuar. Esto puede suceder cuando sobrescribe una de sus estructuras de datos (la que pertenece a la función de libc, por ejemplo). Así que esto podría ser, por ejemplo, Llamando a libc porque sobrescribió algo. Y la aplicación debe finalizar porque es imposible continuar o manejarla, lo que se denomina aserción fallida.

10

por Wikipedia,

SIGABRT es enviado por el proceso a sí mismo cuando se llama a la función libc abort, definido en stdlib.h. La señal SIGABRT se puede capturar, pero no se puede bloquear; si el manejador de señales regresa, todas las transmisiones abiertas se cierran y se purgan y el programa finaliza (volcando el núcleo si corresponde). Esto significa que la llamada abort nunca regresa. Debido a esta característica, a menudo se utiliza para señalar condiciones fatales en bibliotecas de soporte, situaciones donde la operación actual no se puede completar pero el programa principal puede realizar la limpieza antes de salir. Se usa cuando una afirmación falla.

Eso quiere decir que no si su código es llamando abort directa ni lanzarse a través de la señal de SIGABRTraise, y no tiene ningún afirmaciones en su defecto, la causa debe ser que una biblioteca de soporte (que podría ser libc) ha encontrado un error interno. Si proporciona los detalles de su programa, podríamos sugerir posibles causas. Incluso mejor, si examina un núcleo o ejecuta su programa en un depurador, debería poder recopilar un seguimiento de pila, que mostrará qué biblioteca provocó el aborto de su programa.

(También es posible que otro programa en su sistema está enviando su programa SIGABRT, pero esto es en la mayoría de los casos infinitamente improbable.)

3

En la práctica esto generalmente es provocada por la macro assert:

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

resultaría en SIGABRT

Cuestiones relacionadas