Tutoriel : Apprendre à déboguer C++ avec Visual Studio
Cet article présente les fonctionnalités du débogueur Visual Studio dans une procédure pas à pas. Pour un tour d’horizon plus général des fonctionnalités du débogueur, voir Présentation du débogueur. Quand vous déboguez votre application, cela signifie généralement que vous exécutez votre application en y ayant attaché le débogueur. Quand vous faites cela, le débogueur fournit de nombreuses façons de voir ce que fait votre code pendant qu’il s’exécute. Vous pouvez parcourir votre code pas à pas et examiner les valeurs stockées dans les variables, vous pouvez définir des espions sur des variables pour voir quand les valeurs changent, vous pouvez examiner le chemin d’exécution de votre code, voir si une branche de code s’exécute, etc. Si c’est la première fois que vous essayez de déboguer du code, vous pouvez lire Débogage pour grands débutants avant de poursuivre cet article.
Bien que l’application de démonstration soit écrite en C++, la plupart des fonctionnalités sont applicables à C#, Visual Basic, F#, Python, JavaScript et d’autres langages pris en charge par Visual Studio (F# ne prend pas en charge Modifier et continuer. F# et JavaScript ne prennent pas en charge la fenêtre Autos). Les captures d’écran sont en C++.
Ce didacticiel présente les procédures suivantes :
- Démarrer le débogueur et atteindre des points d’arrêt
- Découvrir les commandes permettant de parcourir le code pas à pas dans le débogueur
- Inspecter des variables dans des bulles d’informations et dans les fenêtres du débogueur
- Examiner la pile des appels
Prérequis
Au préalable, vous devez avoir installé Visual Studio et la charge de travail Développement Desktop en C++.
Si vous n’avez pas encore installé Visual Studio, accédez à la page Téléchargements Visual Studio pour l’installer gratuitement.
Si vous n’avez pas encore installé Visual Studio 2022, accédez à la page Téléchargements Visual Studio 2022 pour l’installer gratuitement.
Si vous devez installer la charge de travail, mais que vous avez déjà installé Visual Studio, cliquez sur Outils>Obtenir les outils et fonctionnalités..., qui ouvre Visual Studio Installer. Visual Studio Installer est lancé. Choisissez la charge de travail Développement Desktop en C++, puis choisissez Modifier.
Création d’un projet
Tout d’abord, vous allez créer un projet d’application console C++. Le type de projet inclut tous les fichiers de modèle dont vous aurez besoin au départ.
Ouvrez Visual Studio.
Si la fenêtre de démarrage n’est pas ouverte, choisissez Fichier>Fenêtre Démarrer.
Dans la fenêtre de démarrage, choisissez Créer un projet.
Dans la fenêtre Créer un projet, entrez ou tapez console dans la zone de recherche. Ensuite, choisissez C++ Dans la liste des langages, puis choisissez Windows dans la liste des plateformes.
Après avoir appliqué les filtres de langage et de plateforme, choisissez le modèle Application console, puis choisissez Suivant.
Note
Si vous ne voyez pas le modèle Application console, vous pouvez l’installer à partir de la fenêtre Créer un projet. Dans le Vous ne trouvez pas ce que vous cherchez ?, choisissez le lien Installer plus d’outils et de fonctionnalités. Dans le Visual Studio Installer, choisissez ensuite la charge de travail Développement de bureau avec C++.
Dans la fenêtre Configurer votre nouveau projet, tapez ou entrez get-started-debugging dans la zone Nom du projet. Choisissez ensuite Créer.
Visual Studio ouvre votre nouveau projet.
Création de l'application
Dans get-started-debugging.cpp, remplacez tout le code par défaut par le code suivant :
#include <string> #include <vector> #include <iostream> void SendMessage(const std::wstring& name, int msg) { std::wcout << L"Hello, " << name << L"! Count to " << msg << std::endl; } int main() { std::vector<wchar_t> letters = { L'f', L'r', L'e', L'd', L' ', L's', L'm', L'i', L't', L'h' }; std::wstring name = L""; std::vector<int> a(10); std::wstring key = L""; for (int i = 0; i < letters.size(); i++) { name += letters[i]; a[i] = i + 1; SendMessage(name, a[i]); } std::wcin >> key; return 0; }
Démarrez le débogueur !
Appuyez sur F5 (Débogage > Démarrer le débogage) ou sur le bouton Démarrer le débogage dans la barre d’outils de débogage.
F5 démarre l’application avec le débogueur attaché au processus de l’application, mais jusqu’à présent, nous n’avons rien fait de spécial pour examiner le code. L’application se charge juste et vous voyez la sortie de la console.
Hello, f! Count to 1 Hello, fr! Count to 2 Hello, fre! Count to 3 Hello, fred! Count to 4 Hello, fred ! Count to 5 Hello, fred s! Count to 6 Hello, fred sm! Count to 7 Hello, fred smi! Count to 8 Hello, fred smit! Count to 9 Hello, fred smith! Count to 10
Dans ce tutoriel, nous examinons cette application plus en détail avec le débogueur et nous regardons les fonctionnalités du débogueur.
Arrêtez le débogueur en appuyant sur le bouton d’arrêt rouge (Maj + F5).
Dans la fenêtre de console, appuyez sur une touche et sur Entrée pour fermer la fenêtre de console.
Définir un point d’arrêt et démarrer le débogueur
Dans la boucle
for
de la fonctionmain
, définissez un point d’arrêt en cliquant dans la marge gauche de la ligne de code suivante :name += letters[i];
Un cercle rouge apparaît à l’endroit où vous avez défini le point d’arrêt.
Les points d’arrêt sont l’une des fonctionnalités les plus élémentaires et les plus essentielles pour un débogage fiable. Quand vous définissez un point d'arrêt, Visual Studio interrompt l'exécution du code à l'emplacement du point d'arrêt pour vous permettre d'examiner les valeurs des variables, le comportement de la mémoire ou encore la bonne exécution ou non d'une branche de code.
Appuyez sur F5, ou cliquez sur le bouton Démarrer le débogage pour que l’application démarre et que le débogueur s’exécute jusqu’à la ligne de code où vous avez défini le point d’arrêt.
La flèche jaune représente l’instruction sur laquelle le débogueur s’est mis en pause, ce qui interrompt également l’exécution de l’application au même point (cette instruction n’a pas encore été exécutée).
Si l’application ne s’exécute pas encore, F5 démarre le débogueur et s’arrête au premier point d’arrêt. Sinon, F5 continue l’exécution de l’application jusqu’au point d’arrêt suivant.
Les points d’arrêt sont une fonctionnalité pratique quand vous savez quelle ligne de code ou section de code vous voulez examiner en détail. Pour plus d’informations sur les différents types de point d’arrêt que vous pouvez définir, par exemple les points d’arrêt conditionnels, consultez Utilisation des points d’arrêt.
Parcourir le code dans le débogueur avec les commandes d’exécution pas à pas
Nous utilisons ici principalement des raccourcis clavier, car c’est un bon moyen d’exécuter rapidement votre application dans le débogueur (les commandes équivalentes, comme les commandes des menus, sont indiquées entre parenthèses).
Une fois l’exécution interrompue dans la boucle
for
de la méthodemain
, appuyez sur F11 (ou choisissez Débogage > Effectuer un pas à pas détaillé) à deux reprises pour passer à l’appel de la méthodeSendMessage
.Après avoir appuyé à deux reprises sur F11, vous devez vous trouver au niveau de cette ligne de code :
SendMessage(name, a[i]);
Appuyez une nouvelle fois sur F11 pour effectuer un pas à pas détaillé dans la méthode
SendMessage
.Le pointeur jaune avance dans la méthode
SendMessage
.F11 est la commande Pas à pas détaillé : elle fait avancer l’exécution de l’application une instruction à la fois. F11 est un bon moyen pour examiner le flux d’exécution de la façon la plus détaillée possible. (Pour vous déplacer plus rapidement dans le code, nous vous présentons également d’autres options.) Par défaut, le débogueur ignore le code non-utilisateur (si vous souhaitez plus d’informations, consultez Uniquement mon code).
Supposons que vous ayez fini d’examiner la méthode
SendMessage
, et que vous souhaitiez sortir de la méthode tout en restant dans le débogueur. Vous pouvez faire cela avec la commande Pas à pas sortant.Appuyez sur Maj + F11 (ou Débogage > Pas à pas sortant).
Cette commande reprend l’exécution de l’application (et fait avancer le débogueur) jusqu’à ce que la méthode ou la fonction active soit retournée.
Vous devez revenir dans la boucle
for
de la méthodemain
, l’exécution étant interrompue au niveau de l’appel de la méthodeSendMessage
.Appuyez sur F11 à plusieurs reprises jusqu’à ce que vous reveniez à l’appel de la méthode
SendMessage
.Une fois l’exécution interrompue au niveau de l’appel de méthode, appuyez une seule fois sur F10 (ou choisissez Débogage > Effectuer un pas à pas principal).
Notez cette fois que le débogueur n’effectue pas de pas à pas détaillé dans la méthode
SendMessage
. F10 fait avancer le débogueur sans effectuer de pas à pas détaillé dans les fonctions ou les méthodes du code de votre application (le code s’exécute néanmoins). En appuyant sur F10 sur l’appel de méthodeSendMessage
(au lieu de F11), nous avons ignoré le code d’implémentation deSendMessage
(qui potentiellement ne nous intéresse pas pour l’instant). Pour plus d’informations sur les différentes façons de vous déplacer dans votre code, consultez Parcourir le code dans le débogueur.
Parcourir le code avec Exécuter jusqu’au clic
Appuyez sur F5 pour avancer au point d’arrêt.
Dans l’éditeur de code, faites défiler vers le bas et placez le curseur sur la fonction
std::wcout
dans la méthodeSendMessage
jusqu’à ce que le bouton vert Exécuter jusqu’au clic apparaisse à gauche. L’info-bulle du bouton indique « Lancer l’exécution jusqu’ici ».Note
Le bouton Exécuter jusqu’au clic est une nouveauté de Visual Studio 2017. (Si vous ne voyez pas le bouton avec la flèche verte, utilisez à la place F11 dans cet exemple pour faire avancer le débogueur jusqu’au bon endroit.)
Cliquez sur le bouton Exécuter jusqu’au clic.
Le débogueur avance jusqu’à la fonction
std::wcout
.L’utilisation de ce bouton revient à définir un point d’arrêt temporaire. Exécuter jusqu’au clic est pratique pour examiner rapidement une zone visible du code d’application (vous pouvez cliquer dans n’importe quel fichier ouvert).
Redémarrer rapidement votre application
Cliquez sur le bouton Redémarrer dans la barre d’outils de débogage (Ctrl + Maj + F5).
Quand vous appuyez sur Redémarrer, vous gagnez du temps par rapport à l’action consistant à arrêter l’application, puis à redémarrer le débogueur. Le débogueur se met en pause sur le premier point d’arrêt qui est atteint par l’exécution du code.
Le débogueur s’arrête à nouveau au point d’arrêt que vous avez défini dans la boucle for
.
Inspecter des variables avec des bulles d’informations (datatips)
Les fonctionnalités qui vous permettent d’inspecter des variables sont parmi les plus pratiques du débogueur : vous pouvez faire cela de différentes façons. Souvent, quand vous essayez de déboguer un problème, vous essayez de déterminer si les variables stockent les valeurs que vous prévoyez à un moment donné.
Pendant la pause sur l’instruction
name += letters[i]
, pointez sur la variableletters
pour voir sa valeur par défaut,size={10}
.Développez la variable
letters
pour afficher ses propriétés, qui incluent tous les éléments qu’elle contient.Pointez ensuite sur la variable
name
pour voir sa valeur actuelle, une chaîne vide.Appuyez à plusieurs reprises sur F5 (ou Débogage>Continuer) pour itérer plusieurs fois dans la boucle
for
. À chaque interruption au niveau du point d’arrêt, pointez sur la variablename
à chaque fois pour vérifier sa valeur.La valeur de la variable change à chaque itération de la boucle
for
, en affichant les valeurs def
, puisfr
, puisfre
, etc.Souvent, lors du débogage, vous voulez un moyen rapide de vérifier les valeurs des propriétés sur des variables pour voir si elles stockent bien les valeurs prévues. Les bulles d’informations (« data tips ») sont un bon moyen de le faire.
Inspecter des variables avec les Fenêtres Automatique et Variables locales
Examinez la fenêtre Automatique en bas de l’éditeur de code.
Si elle est fermée, ouvrez-la pendant que l’exécution est mise en pause dans le débogueur en choisissant Déboguer>Windows>Automatique.
Dans la fenêtre Automatique, vous voyez des variables et leur valeur actuelle. La fenêtre Automatique montre toutes les variables utilisées dans la ligne active ou la ligne précédente (consultez la documentation pour les comportements selon le langage).
Ensuite, examinons la fenêtre Variables locales, sous un onglet à côté de la fenêtre Automatique.
Développez la variable
letters
pour afficher les éléments qu’elle contient.La fenêtre Variables locales montre les variables qui se trouvent dans l’étendue actuelle, c’est-à-dire le contexte d’exécution actif.
Définir un espion
Dans la fenêtre principale de l’éditeur de code, cliquez avec le bouton droit sur la variable
name
, puis choisissez Ajouter un espion.La fenêtre Espion s’ouvre en bas de l’éditeur de code. Vous pouvez utiliser une fenêtre Espion pour spécifier une variable (ou une expression) que vous voulez observer.
À présent, vous avez un espion défini sur la variable
name
, et vous pouvez voir sa valeur changer au fur et à mesure que vous vous déplacez dans le débogueur. Contrairement à d’autres fenêtres de variables, la fenêtre Espion montre toujours les variables que vous observez (elles apparaissent en grisé quand elles sont en dehors de l’étendue).
Examiner la pile des appels
Alors que l’exécution est mise en pause dans la boucle
for
, cliquez sur la fenêtre Pile des appels qui est ouverte par défaut dans le volet inférieur droit.Si elle est fermée, ouvrez-la pendant que l’exécution est mise en pause dans le débogueur en choisissant Déboguer>Windows>Pile des appels.
Appuyez sur F11 à plusieurs reprises jusqu’à ce que l’exécution du débogueur soit interrompue dans la méthode
SendMessage
. Regardez la fenêtre Pile des appels.La fenêtre Pile des appels montre l’ordre dans lequel les méthodes et les fonctions sont appelées. La ligne du haut montre la fonction active (méthode
SendMessage
dans cette application). La deuxième ligne montre queSendMessage
a été appelée à partir de la méthodemain
, etc.Notes
La fenêtre Pile des appels est similaire à la perspective Débogage dans certains IDE, comme Eclipse.
La pile des appels est un bon moyen d’examiner et de comprendre le flux d’exécution d’une application.
Vous pouvez double-cliquer sur une ligne de code pour accéder à ce code source ; ceci change également l’étendue active inspectée par le débogueur. Cette action ne fait pas avancer le débogueur.
Vous pouvez également utiliser les menus contextuels de la fenêtre Pile des appels pour faire d’autres choses. Par exemple, vous pouvez insérer des points d’arrêt dans des fonctions spécifiées, faire avancer le débogueur avec Exécuter jusqu’au curseur et aller examiner le code source. Pour plus d’informations, consultez Guide pratique pour examiner la pile des appels.
Changer le flux d’exécution
Appuyez sur F11 à deux reprises pour exécuter la fonction
std::wcout
.Alors que le débogueur est mis en pause dans l’appel de méthode
SendMessage
, utilisez la souris pour sélectionner la flèche jaune (pointeur d’exécution) sur la gauche et déplacez la flèche jaune d’une ligne vers le haut, pour retourner surstd::wcout
.Appuyez sur F11.
Le débogueur réexécute la fonction
std::wcout
(vous voyez ceci dans la sortie de la fenêtre de console).En changeant le flux d’exécution, vous pouvez effectuer des opérations comme tester d’autres chemins d’exécution du code ou réexécuter du code sans devoir redémarrer le débogueur.
Avertissement
Vous devez rester prudent avec cette fonctionnalité, vous pouvez voir un avertissement dans l’info-bulle. Vous pouvez aussi en voir d’autres. Le fait de déplacer le pointeur ne peut pas rétablir votre application à un état antérieur.
Appuyez sur F5 pour poursuivre l’exécution de l’application.
Félicitations ! Vous avez terminé ce didacticiel.
Étapes suivantes
Dans ce tutoriel, vous avez découvert comment démarrer le débogueur, parcourir le code pas à pas et inspecter des variables. Vous pouvez obtenir une présentation générale des fonctionnalités du débogueur et suivre des liens qui donnent accès à plus d’informations.