web-dev-qa-db-fra.com

Comment puis-je afficher la valeur d'une variable <sortie optimisée> en C ++?

J'utilise gdb pour déboguer un programme C++.

J'ai ce code:

int x = floor(sqrt(3));

et je veux voir la valeur de x. Cependant, gdb prétend que x est "<optimisé_out>". Comment puis-je voir la valeur de x? Dois-je changer mes drapeaux de compilateur?

34
dangerChihuahua007

Aux niveaux d'optimisation élevés, le compilateur peut éliminer les valeurs intermédiaires, comme vous l'avez vu ici. Il existe plusieurs options:

  • Vous pouvez réduire le niveau d'optimisation pour permettre au débogueur de suivre plus facilement les choses. -O0 est certain de fonctionner (mais sera beaucoup plus lent), -O1 pourrait également fonctionner correctement.
  • Vous pouvez ajouter des instructions d'impression explicites pour consigner la valeur de sortie.
  • Vous pouvez également généralement forcer le compilateur à conserver cette valeur spécifique en la rendant volatile (mais n'oubliez pas de la rendre non volatile lorsque vous avez terminé!). Notez, cependant, que puisque le flux de contrôle est également sujet à altération dans le code optimisé, même si vous pouvez voir la valeur de la variable, il peut ne pas être tout à fait clair à quel point du code vous vous trouvez lorsque vous regardez le variable en question.
38
bdonlan

Si vous ne pouvez pas ou ne voulez pas désactiver l'optimisation, vous pouvez essayer de déclarer la variable comme volatile. C'est généralement suffisant pour que votre compilateur conserve la variable dans le code final.

Alternativement, dans les versions récentes de GCC, vous pouvez désactiver l'optimisation pour juste une fonction, comme ceci:

void my_function() __attribute__((optimize(0)))
{
  int x = floor(sqrt(3));
}
14
Gigi

Créez votre propre "variable globale" et imprimez la variable optimisée de sortie dans cette variable globale. Assurez-vous de supprimer ces globaux créés par vous après avoir terminé le débogage!

0
Gautham Krishnan