Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cet article explique quelles options du compilateur définir pour vous permettre de mieux déboguer du code optimisé.
Une meilleure expérience est disponible à partir de Visual Studio 2022 version 17.14 qui vous permet de déboguer du code optimisé comme s’il était compilé non optimisé, tout en conservant la vitesse du code optimisé. Pour plus d’informations, consultez débogage dynamique C++ (préversion).
Remarque
Les boîtes de dialogue et les commandes de menu que vous voyez peuvent différer de celles décrites dans l’aide en fonction de vos paramètres actifs ou édition. Pour modifier vos paramètres, choisissez paramètres d’importation et d’exportation dans le menu Outils. Pour plus d’informations, consultez Réinitialiser tous les paramètres.
Remarque
L’option de compilateur /Zo (débogage optimisé amélioré) (introduite dans Visual Studio Update 3) génère des informations de débogage plus riches pour le code optimisé (projets qui ne sont pas générés avec l’option de compilateur /Od). Consultez Options /O (Optimiser le code)). Cela inclut la prise en charge améliorée pour le débogage des variables locales et des fonctions inline.
Modifier et continuer est désactivé lorsque l’option de compilateur /Zo est utilisée.
Lorsque le compilateur optimise le code, il repositionne et réorganise les instructions. Cela entraîne 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 ensemble d’instructions.
L’optimisation peut affecter :
L’optimiseur peut supprimer des variables locales ou les déplacer vers des emplacements que le débogueur ne comprend pas.
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 d'appels seront incorrectes en cas de corruption de la pile, si des fonctions écrites en langage assembleur sont utilisées, ou si des trames du système d'exploitation n'ont pas de symboles correspondants dans la pile d'appels.
Les variables globales et statiques sont toujours affichées correctement. La disposition de la structure l'est aussi. Si vous avez un pointeur vers une structure et que la valeur du pointeur est correcte, chaque variable membre de la structure affiche la valeur correcte.
En raison de ces limitations, vous devez déboguer à l’aide d’une version non optimisée de votre programme si possible. Par défaut, l’optimisation est désactivée dans la configuration de débogage d’un programme C++ et activée dans la configuration release.
Toutefois, 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 cibleWin32 Debug
jusqu’à ce que votre programme soit entièrement débogué et que vous êtes prêt à créer une cibleWin32 Release
. Le compilateur n’optimise pas la cibleWin32 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és, vérifiez que
Debug
est sélectionné dans la liste déroulante Configuration.Dans l’affichage dossier à gauche, sélectionnez le dossier C/C++.
Sous le dossier C++, sélectionnez
Optimization
.Dans la liste des propriétés à droite, recherchez
Optimization
. Le réglage à côté de celui-ci indique probablementDisabled (
/Od)
. Choisissez l’une des autres options (Minimum Size``(
/O1)
,Maximum Speed``(
/O2)
,Full Optimization``(
/Ox)
ouCustom
).Si vous avez choisi l’option
Custom
pourOptimization
, vous pouvez maintenant définir des options pour l’une des autres propriétés affichées dans la liste des propriétés.Sélectionnez le nœud Propriétés de configuration, C/C++, Ligne de commande de la page de propriétés du projet, puis ajoutez
(
/Zo)
à la zone de texte Options supplémentaires.Avertissement
L’ajout de
/Zo
désactive Modifier et Continuer.Lorsque vous déboguez du code optimisé, utilisez la fenêtre Désassemblement pour voir quelles instructions sont créées et exécutées. Lorsque vous définissez des points d’arrêt, vous devez savoir que le point d’arrêt peut se déplacer avec une instruction. Par exemple, considérez le code suivant :
for (x=0; x<10; x++)
Supposons que vous définissez un point d’arrêt à cette ligne. Vous pouvez vous attendre à ce que le point d’arrêt soit atteint 10 fois, mais si le code est optimisé, le point d’arrêt n’est atteint qu’une seule fois. Cela est dû au fait que la première instruction définit la valeur de x
sur 0. Le compilateur reconnaît que cette opération doit être effectuée une seule fois et la déplace hors 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 Désassemblement, l’unité d’étape est automatiquement définie sur Instruction pour un contrôle plus important, ce qui est utile lorsque vous parcourez le code optimisé.