Comment déboguer une variable qui est optimisé loin dans la Libération de construire
Je suis à l'aide de VS2010. Ma version debug fonctionne très bien mais ma version conservés sur de s'écraser. Donc, Dans la version en mode j'ai cliqué avec le bouton droit le projet a choisi le Débogage, puis a choisi de démarrer une nouvelle instance. À ce stade, j'ai vu qu'un tableau que j'avais déclaré en tant que tel
int ma[4]= { 1,2,8,4};
N'est jamais initialisée. Toutes les suggestions sur ce qui pourrait se passer.
- Comment avez-vous vérifier le tableau n'est pas initialisé?
- En plaçant un point d'arrêt après. J'ai remarqué que le tableau n'avait pas de valeurs. Aussi j'ai essayé de faire quelque chose comme ceci
int a = ma[0];
et aucune valeur ne s'affiche. - Merci de lire ma réponse ci-dessous. Vous ne devriez pas faire confiance valeurs affichées lors du débogage d'une version validée. Ajouter une instruction d'impression pour vérifier si les valeurs du tableau sont correctement définis et je parie que vous verrez qu'ils sont.
- Mais bien sûr, l'ajout de l'impression peut rendre son programme de travail à nouveau. D'autres utilisations d'une variable va changer la façon dont il est géré par l'optimiseur. (Il est possible que, selon la façon dont il utilise
ma
, que l'optimiseur ne l'éliminer entièrement.) - Je suis désolé mais je ne comprends pas ce que tu veux dire par votre commentaire
- Son problème, c'est que le programme se bloque. L'ajout de l'impression peut dire qu'il ne se bloque plus.
- voir le titre. OP croit que le problème est que le tableau n'est pas initialisé. Je ne fais que souligner que ce n'est probablement pas le problème.
Vous devez vous connecter pour publier un commentaire.
Lorsque vous construisez dans Libération, le compilateur effectue de nombreuses optimisations sur votre code. De nombreuses optimisations inclure le remplacement des variables avec des valeurs codées en dur, quand cela est possible et correct de le faire. Par exemple, si vous avez quelque chose comme:
Par le temps, l'optimiseur se fait avec elle, il sera souvent plus comme:
...et la variable
n
est éliminé de votre programme complètement. Si vous vous déplacez dans une version de ce programme et d'essayer d'examiner la valeur den
, vous pouvez voir très bizarre de valeurs ou le débogueur peut signaler quen
n'existe pas du tout.Il existe de nombreuses autres optimisations qui peut être appliquée faciliter le débogage d'un programme optimisé assez difficile. Placer un point d'arrêt après l'initialisation d'un tableau pourrait donner de très trompeur de l'information si le tableau a été éliminée, ou si l'initialisation de il a été déplacé à un autre endroit.
Une autre commune de l'optimisation est d'éliminer les variables, telles que:
Si il n'y a pas de code dans votre programme qui utilise
a
, le compilateur va voir quea
est inutile, et de l'optimiser à l'écart de sorte qu'il n'existe plus.Afin de voir les valeurs que
ma
a été initialisé avec, le plus simple quelque peu fiables approche consiste à utiliser sprintf de débogage:Et de voir ce qui est réellement là.
Si vous déboguez une version validée le débogueur rapport de valeurs erronées ou ne sera pas en mesure d'afficher toutes les valeurs pour la plupart de vos variables. Le moyen le plus sûr pour vérifier que la valeur d'une variable est dans le Communiqué de construction est à l'utilisation de la journalisation.
Donc, probablement, votre tableau est initialisé dans la Version tout comme dans la version Debug, mais vous n'êtes pas en mesure de voir que, par le débogueur. Il semble que vous avez un autre problème qui est à l'origine du code de crash dans le Communiqué. Look pour une autre variable non initialisée ou certains de corruption de la pile/index out of bounds accès.