Qu'est-ce qui cause le signal 'SIGILL'?

90

Je porte du code C ++ sur Android en utilisant NDK et GCC. Le code fonctionne essentiellement. À un moment donné, lors du débogage dans Eclipse, l'appel

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

provoque cette erreur:

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

Qu'est-ce que ça veut dire? Le compilateur a-t-il généré du code illégal pour une raison quelconque? J'ai un point d'arrêt dans le constructeur (qui ne fait rien), et il n'est pas touché. J'ai déjà fait une reconstruction complète.

Que pourrais-je faire de mal pour causer ce problème?

Amateur
la source

Réponses:

27

Cela signifie que le CPU a tenté d'exécuter une instruction qu'il n'a pas comprise. Cela pourrait être causé par une corruption, je suppose, ou peut-être qu'il a été compilé pour la mauvaise architecture (dans ce cas, j'aurais pensé que le système d'exploitation refuserait d'exécuter l'exécutable). Je ne sais pas exactement quel est le problème racine.

cheval de Troie
la source
24
Une autre cause d'exécution d'une instruction invalide est de sauter à une adresse qui ne se trouve pas dans la zone de programme.
Paul Nathan
Bizarre, j'ai eu ça, quand j'ai compilé avec clang, mais ça a bien fonctionné avec gcc
Post Self
22

Il peut s'agir d'un pointeur de fonction non initialisé, en particulier si vous avez corrompu la mémoire (alors la fausse vtable de mauvais pointeurs C ++ vers des objets invalides pourrait donner cela).

BTW gdbwatchpoints & tracepoints, ainsi que valgrind peuvent être utiles (si disponible) pour déboguer de tels problèmes. Ou un désinfectant pour adresses .

Basile Starynkevitch
la source
Pour moi, je ne renvoyais aucune valeur d'une fonction censée renvoyer un int. Donc un peu lié à cette réponse. Aucune idée de comment il a réussi à compiler.
Chris Watts
11

Assurez-vous que toutes les fonctions avec un type de retour non void ont une returninstruction.

Alors que certains compilateurs fournissent automatiquement une valeur de retour par défaut, d'autres enverront un SIGILL ou SIGTRAP au moment de l'exécution en essayant de laisser une fonction sans valeur de retour.

Max Klint
la source
Vous n'avez aucune idée de la longueur dans laquelle j'ai cherché une raison derrière SIGILL (QT + Android) juste pour trouver une instruction de retour manquante dans une fonction (inspirée de votre réponse). Je vous remercie.
Vega4