7
votes

Instruction illégale lors de la programmation C ++ sur Linux

Mon programme, qui fait exactement la même chose à chaque fois qu'il fonctionne (déplace un point de pointe dans la distance) échouera au hasard avec le texte sur le terminal «Instruction illégale». Mon googling a trouvé des gens qui rencontrent cela lorsque l'assemblage écrit a du sens, car l'assemblage jette ces types d'erreurs.

Mais pourquoi g ++ générerait une instruction illégale comme celle-ci? Ce n'est pas comme si je compose de la compilation de Windows puis de l'exécution de Linux (qui, même à ce moment-là, tant que les deux sont sur X86 ne devraient pas faire une instruction illégale). Je posterai le fichier principal ci-dessous.

Je ne peux pas reproduire de manière fiable l'erreur. Bien que si je fais des changements aléatoires (ajoutez un espace ici, changez une constante là-bas) qui force une recompilation je peux obtenir un binaire qui échouera avec une instruction illégale chaque fois qu'elle est exécutée, jusqu'à ce que j'essaie de définir un point de rupture, ce qui rend le instruction illégale «disparue». : ( xxx


4 commentaires

Je suggérerais de remplacer les modules de mémoire défectueux.


Je suggérerais de remplacer l'auteur de commentaires défectueux.


Exécutez votre code sous GDB, puis lorsque vous obtenez l'exception, effectuez une backtrage (BT).


Tandis que "x86" est un moniker simple, il y a en fait des dizaines de variantes comme Intel et AMD ont continué à ajouter de nouvelles instructions (c'est un CSCC ISA, après tout). Ignorer des extensions évidentes telles que SSE et MMX, il existe également des instructions de base telles que CMOV (mouvement conditionnel) qui n'étaient pas présents sur l'original 80386 (premier processeur X86-32).


3 Réponses :


21
votes

Le compilateur ne génère pas d'exceptions illégales, avec une probabilité de 99,99%. Presque certainement ce qui se passe est que vous ayez un bogue dans votre programme, ce qui la cause soit a) écrase les parties de votre code exécutable avec des données de déchets, ou b) utilisez un pointeur de fonction qui pointe des ordures. Essayez d'exécuter votre programme sous Valgrind pour diagnostiquer le problème - http://valgrind.org/ .


2 commentaires

Une variante de (b) à surveiller en C ++ appelle une fonction virtuelle sur un objet écrasé en quelque sorte.


Je ne dirais pas "une probabilité de 99,99%". Il est assez facile d'obtenir un compilateur pour émettre des instructions illégales, mentirez simplement votre CPU. Si vous dites au compilateur, il est correct d'utiliser les instructions AVX2, et votre CPU ne les a pas réellement, l'exécution de la première instruction AVX2 arrête votre programme avec cette "instruction illégale"



1
votes

Le bogue d'instruction illégal peut également être un symptôme d'un pilote de carte graphique défectueux ou d'une incompatibilité au matériel. Utilisez lspci | grep VGA Pour confirmer quel est votre matériel. Ensuite, essayez de télécharger le dernier pilote et le plus grand pilote pour votre modèle de matériel.

Il existe également un bug connu lors de l'exécution de code à l'intérieur NetBeans 6.8 sur une machine multicœur 64 bits. Le code se bloque stochastiquement avec une instruction illégale basée sur des conditions de race dans le profileur. Pour une pour cent des accidents varie de 1% ou de 5% pour certains codes, 30% ou 50%, jusqu'à environ 95% +, selon lesquelles des bibliothèques sont chargées. Les graphismes et le code de threads semble augmenter cela, mais vous pouvez le voir avec un monde trivial Hello Main. Si vous obtenez un taux de crash de 1%, vous ne l'avez probablement pas remarqué auparavant. Solution: exécutez l'exécutable directement à partir d'un terminal, si vous le pouvez.


0 commentaires

0
votes

Très probablement, vos pilotes sont le rendu logiciel MESA ou un pilote de carte graphique défectueux. Mesa utilise parfois un ensemble spécial d'instructions comme AVX, AVX2, entre autres.

Votre glenable (gl_point_sprite_arb); peut activer une telle partie de Mesa qui n'est pas destinée à votre CPU.

Je sais que le post est vieux, mais pourrait aider les autres à l'avenir.


0 commentaires