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?
Ça fonctionne maintenant. Pour ceux qui ont des problèmes avec Android/NDK/GCC/Eclipse, voici comment j'ai résolu le problème:
Je n'ai pas vérifié si les deux étapes sont vraiment nécessaires, et si non, laquelle est redondante.
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.
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 .
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.