111 votes

Quelle est la cause du signal "SIGILL" ?

Je porte du code C++ sur Android en utilisant NDK et GCC. Le code s'exécute. A 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 cela signifie ? Le compilateur a-t-il généré un 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 atteint. J'ai déjà procédé à une reconstruction complète.

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

49voto

Max Klint Points 411

Assurez-vous que toutes les fonctions dont le type de retour n'est pas vide ont une fonction return déclaration.

Si certains compilateurs fournissent automatiquement une valeur de retour par défaut, d'autres envoient un SIGILL ou un SIGTRAP au moment de l'exécution lorsqu'ils tentent de quitter une fonction sans valeur de retour.

36voto

trojanfoe Points 61927

Cela signifie que l'unité centrale a tenté d'exécuter une instruction qu'elle ne comprenait pas. Cela peut être dû à une corruption, je suppose, ou à une compilation 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 suis pas tout à fait sûr de la nature du problème.

26voto

Basile Starynkevitch Points 67055

Il peut s'agir d'un pointeur de fonction non initialisé, en particulier si la mémoire est corrompue (la table virtuelle bidon du C++, qui pointe sur des objets non valides, peut alors être à l'origine de ce problème).

BTW gdb les points de surveillance et les points de traçage, ainsi que valgrind pourrait être utile (s'il est disponible) pour déboguer de tels problèmes. Ou encore, certains Désinfectant pour adresses .

5voto

pkamb Points 918

LeetCode Le compilateur en ligne et l'environnement de développement du site génèrent SIGILL pour les erreurs qui ne génèrent pas la même erreur dans mon IDE de bureau.

Par exemple, l'accès à un tableau avec un index hors limites :

["foo", "bar"][2]

Le compilateur de LeetCode n'affiche que l'erreur :

Erreur d'exécution le processus s'est arrêté avec le signal SIGILL

dans une aire de jeu locale de Xcode, ce même code donne au lieu de cela l'erreur :

erreur : L'exécution a été interrompue, raison : EXC_BREAKPOINT (code=1, subcode=0x18f2ea5d8).
Le processus a été laissé au point où il a été interrompu, utilisez "thread return -x" pour revenir à l'état précédant l'évaluation de l'expression.

Ce n'est que lors de la compilation et de l'exécution d'un projet Xcode complet qu'il signale l'erreur réelle :

Fil 1 : Erreur fatale : Index hors de portée

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X