Partager via


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.

  1. Ouvrez Visual Studio.

    Si la fenêtre de démarrage n’est pas ouverte, choisissez Fichier>Fenêtre Démarrer.

  2. Dans la fenêtre de démarrage, choisissez Créer un projet.

  3. 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.

    Screenshot of choosing the C++ template for the Console App.

    Screenshot of choosing the C++ template for the Console App.

    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++.

  4. 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

  1. 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 !

  1. Appuyez sur F5 (Débogage > Démarrer le débogage) ou sur le bouton Démarrer le débogageStart Debugging 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.

  2. Arrêtez le débogueur en appuyant sur le bouton d’arrêt rouge Stop Debugging (Maj + F5).

  3. 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

  1. Dans la boucle for de la fonction main, 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 Breakpoint 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.

  2. Appuyez sur F5, ou cliquez sur le bouton Démarrer le débogageStart Debugging 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.

    Screenshot of setting and hitting a breakpoint.

    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.

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).

  1. Une fois l’exécution interrompue dans la boucle for de la méthode main, appuyez sur F11 (ou choisissez Débogage > Effectuer un pas à pas détaillé) à deux reprises pour passer à l’appel de la méthode SendMessage.

    Après avoir appuyé à deux reprises sur F11, vous devez vous trouver au niveau de cette ligne de code :

    SendMessage(name, a[i]);

  2. 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.

    Screenshot of using F11 to Step Into code.

    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.

  3. 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éthode main, l’exécution étant interrompue au niveau de l’appel de la méthode SendMessage.

  4. Appuyez sur F11 à plusieurs reprises jusqu’à ce que vous reveniez à l’appel de la méthode SendMessage.

  5. 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).

    Screenshot of using F10 to Step Over code.

    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éthode SendMessage (au lieu de F11), nous avons ignoré le code d’implémentation de SendMessage (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.

  1. Appuyez sur F5 pour avancer au point d’arrêt.

  2. Dans l’éditeur de code, faites défiler vers le bas et placez le curseur sur la fonctionstd::wcout dans la méthode SendMessage jusqu’à ce que le bouton vert Exécuter jusqu’au clicRun to Click apparaisse à gauche. L’info-bulle du bouton indique « Lancer l’exécution jusqu’ici ».

    Screenshot of using the Run to Click feature.

    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.)

  3. Cliquez sur le bouton Exécuter jusqu’au clicRun to Click.

    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émarrerRestart App 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é.

  1. Pendant la pause sur l’instruction name += letters[i], pointez sur la variable letters pour voir sa valeur par défaut, size={10}.

  2. Développez la variable letters pour afficher ses propriétés, qui incluent tous les éléments qu’elle contient.

  3. Pointez ensuite sur la variable name pour voir sa valeur actuelle, une chaîne vide.

  4. 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 variable name à chaque fois pour vérifier sa valeur.

    Screenshot of viewing a data tip.

    La valeur de la variable change à chaque itération de la boucle for, en affichant les valeurs de f, puis fr, puis fre, 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

  1. 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).

  2. Ensuite, examinons la fenêtre Variables locales, sous un onglet à côté de la fenêtre Automatique.

  3. Développez la variable letters pour afficher les éléments qu’elle contient.

    Screenshot of inspecting variables in the Locals Window.

    Screenshot of inspecting variables in the Locals Window.

    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

  1. 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

  1. 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.

  2. 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.

    Screenshot of examining the call stack.

    Screenshot of examining the call stack.

    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 que SendMessage a été appelée à partir de la méthode main, 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

  1. Appuyez sur F11 à deux reprises pour exécuter la fonction std::wcout.

  2. 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 sur std::wcout.

  3. 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.

  4. 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.