¿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?

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.


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 .


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.