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?

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.


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 .


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.