web-dev-qa-db-fra.com

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

Je porte du code C++ sur Android à l'aide de NDK et de GCC. Le code est exécuté. À 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?

83
Dabbler

Ça fonctionne maintenant. Pour ceux qui ont des problèmes avec Android/NDK/GCC/Eclipse, voici comment j'ai résolu le problème:

  1. Enterrer un chat mort à minuit quand la pleine lune
  2. Redémarrez l'émulateur de périphérique Android

Je n'ai pas vérifié si les deux étapes sont vraiment nécessaires, et si non, laquelle est redondante.

674
Dabbler

Cela signifie que le processeur a tenté d'exécuter une instruction qu'il n'a pas comprise. Cela pourrait être dû à la corruption, je suppose, ou peut-être a-t-il été compilé pour la mauvaise architecture (dans ce cas, j'aurais pensé que le système d'exploitation refuserait d'exécuter le fichier exécutable). Pas tout à fait sûr de ce que le problème racine est.

24
trojanfoe

Il peut s'agir d'un pointeur de fonction non initialisé, en particulier si vous avez de la mémoire corrompue (la fausse table virtuelle de pointeurs C++ incorrects sur des objets non valides peut indiquer cela).

BTW gdb points de surveillance et points de trace, ainsi que valgrind peuvent être utiles (si disponibles) pour résoudre ces problèmes. Ou certains adresse désinfectant .

21

Si vous migrez du code de gcc vers clang et commencez à obtenir SIGILL ou SIGTRAP dans la dernière instruction d'une fonction, assurez-vous que la fonction a une instruction return si elle a été déclarée avec un type de retour non vide.

1
Max Klint