Comment : déboguer le code optimisé
[!REMARQUE]
Les boîtes de dialogue et les commandes de menu qui s'affichent peuvent être différentes de celles qui sont décrites dans l'aide, en fonction de vos paramètres actifs ou de l'édition utilisée.Pour modifier vos paramètres, choisissez Importation et exportation de paramètres dans le menu Outils.Pour plus d'informations, consultez Paramètres Visual Studio.
Lorsque le compilateur optimise le code, il repositionne et réorganise les instructions.Il permet ainsi d'obtenir un code compilé plus efficace.En raison de cette réorganisation, le débogueur ne peut pas toujours identifier le code source qui correspond à un jeu d'instructions.
L'optimisation peut affecter :
Les variables locales, qui peuvent être supprimées par l'optimiseur ou être déplacées vers des emplacements que le débogueur ne comprend pas.
Des positions à l'intérieur d'une fonction, qui sont modifiées lorsque l'optimiseur fusionne des blocs de code.
Les noms de fonctions pour les trames de la pile des appels, qui peuvent être erronés si l'optimiseur fusionne deux fonctions.
Les trames qui s'affichent sur la pile des appels sont presque toujours correctes, à condition toutefois que vous ayez des symboles pour toutes les trames.Les trames de la pile des appels seront incorrectes en cas d'altération de la pile, ou si certaines fonctions sont écrites en langage assembleur, ou encore s'il y a des trames de système d'exploitation sans correspondance avec les symboles figurant dans la pile des appels.
Les variables globales et statiques s'affichent toujours correctement.C'est également le cas pour les dispositions de structures.Si un pointeur désigne une structure et que la valeur de ce pointeur est correcte, chaque variable membre de la structure affichera la valeur correcte.
En raison de ces limitations, vous devez effectuer le débogage en utilisant si possible une version non optimisée de votre programme.Par défaut, l'optimisation est désactivée dans la configuration debug d'un programme Visual C++ et activée dans la configuration Release.
Mais un bogue peut apparaître uniquement dans une version optimisée d'un programme.Dans ce cas, vous devez déboguer le code optimisé.
Pour activer l'optimisation dans une configuration de build Debug
Lorsque vous créez un projet, sélectionnez la cible Win32 Debug.Utilisez la cibled' Win32Debug jusqu'à ce que votre programme soit entièrement débogué et vous êtes prêt à générer une cible d' Win32 Release .Le compilateur n'optimise pas la cible Win32 Debug.
Sélectionnez le projet dans l'Explorateur de solutions.
Dans le menu Affichage, cliquez sur Pages de propriétés.
Dans la boîte de dialogue Pages de propriété, vérifiez que Debug est sélectionné dans la liste déroulante Configuration.
Dans l'affichage des dossiers, sur le côté gauche, sélectionnez le dossier C/C++.
Sous le dossier C++, sélectionnez Optimization.
Dans la liste des propriétés affichée à droite, recherchez Optimization.Le paramètre en regard de la propriété indique probablement Disabled (/Od).Sélectionnez l'une des autres options (Minimum Size(/O1), Maximum Speed(/O2), Full Optimization(/Ox), ou Custom).
Si vous avez choisi l'option Custom pour Optimization, vous pouvez maintenant définir des options pour l'une des autres propriétés affichées dans la liste des propriétés.
Lorsque vous déboguez du code optimisé, examinez la fenêtre Code Machine pour voir quelles instructions sont réellement créées et exécutées.Lorsque vous définissez des points d'arrêt, n'oubliez pas qu'ils peuvent se déplacer avec les instructions.Considérons par exemple le code suivant :
for (x=0; x<10; x++)
Supposons que vous définissez un point d'arrêt sur cette ligne.Vous pouvez supposer que le point d'arrêt sera atteint 10 fois ; mais si le code est optimisé, il ne sera atteint qu'une seule fois.Cela est dû au fait que la première instruction affecte la valeur 0 à x.Le compilateur reconnaît que l'opération doit être effectuée une seule fois et la sort de la boucle.Le point d'arrêt est déplacé en même temps.Les instructions qui comparent et incrémentent x restent à l'intérieur de la boucle.Lorsque vous affichez la fenêtre Code Machine, l'unité de progression est automatiquement définie sur Instruction pour un contrôle renforcé, ce qui est utile lorsque vous exécutez le code optimisé pas à pas.