¿Qué causa la señal 'SIGILL'?

90

Estoy transfiriendo un código C ++ a Android usando NDK y GCC. Básicamente, el código se ejecuta. En un momento, al depurar en Eclipse, la llamada

Dabbler::Android::Factory* pFactory = new Dabbler::Android::Factory;

causa este error:

Thread [1] (Suspended: Signal 'SIGILL' received. Description: Illegal instruction.) 
    1 <symbol is not available> 0x812feb44

Qué significa eso? ¿El compilador ha generado código ilegal por alguna razón? Tengo un punto de interrupción en el constructor (que no hace nada) y no se alcanza. Ya hice una reconstrucción completa.

¿Qué podría estar haciendo mal para causar este problema?

Aficionado
fuente

Respuestas:

27

Significa que la CPU intentó ejecutar una instrucción que no entendió. Esto podría deberse a una corrupción, supongo, o tal vez se haya compilado para la arquitectura incorrecta (en cuyo caso habría pensado que el O / S se negaría a ejecutar el ejecutable). No estoy del todo seguro de cuál es la raíz del problema.

trojanfoe
fuente
24
Otra causa de ejecutar una instrucción no válida es saltar a una dirección que no está en el área del programa.
Paul Nathan
Extraño, entendí esto, cuando compilé con clang, pero funcionó bien con gcc
Post Self
22

Podría ser algún puntero de función no inicializado, en particular si tiene memoria dañada (entonces el falso vtable de C ++ malos punteros a objetos no válidos podría dar eso).

Por cierto, los gdbpuntos de observación y los puntos de seguimiento, y también valgrind pueden ser útiles (si están disponibles) para depurar estos problemas. O algún desinfectante de direcciones .

Basile Starynkevitch
fuente
Para mí, no estaba devolviendo ningún valor de una función que se suponía que debía devolver un int. Muy relacionado con esta respuesta. No tengo idea de cómo se las arregló para compilar.
Chris Watts
11

Asegúrese de que todas las funciones con un tipo de retorno no nulo tengan una returndeclaración.

Mientras que algunos compiladores proporcionan automáticamente un valor de retorno predeterminado, otros enviarán un SIGILL o SIGTRAP en tiempo de ejecución cuando intenten dejar una función sin un valor de retorno.

Max Klint
fuente
No tiene idea de hasta qué punto busqué una razón detrás de SIGILL (QT + Android) solo para encontrar una declaración de retorno faltante en una función (inspirada en su respuesta). Gracias.
Vega4