Comprendre le débogueur .NET dans Visual Studio Code

Effectué

Dans l’unité précédente, vous avez appris qu’un débogueur vous aide à contrôler l’exécution de votre programme et à observer son état. Dans cette section, vous allez apprendre à effectuer ces deux tâches dans Visual Studio Code.

Apprenons tout d’abord à configurer le débogueur Visual Studio Code pour l’utiliser avec .NET.

Configurer Visual Studio Code pour le débogage .NET

La première fois que vous allez ouvrir un fichier C# dans Visual Studio Code, vous allez être invité à installer les extensions recommandées pour C#.

Screenshot of Visual Studio Code prompt to install the C# extension.

Visual Studio Code va installer l’extension C# et afficher une invite supplémentaire à ajouter les ressources nécessaires pour générer et déboguer votre projet.

Screenshot of Visual Studio Code prompt to add required assets to build and debug your .NET project.

Remarque

La prise en charge du langage C# dans Visual Studio Code est une installation facultative à partir de la Place de marché. Visual Studio Code vous invite automatiquement à installer cette extension quand vous ouvrez un fichier C#, si ce n’est déjà fait. Si vous rencontrez des problèmes lors de la génération ou du débogage de votre application .NET dans Visual Studio Code, vous devez vérifier que votre projet dispose des ressources requises pour prendre en charge le langage C#.

Points d’arrêt

Comme vous l’avez appris dans l’unité précédente, un débogueur vous aide à analyser et contrôler l’exécution de votre programme. Quand vous démarrez le débogueur Visual Studio Code, il commence immédiatement à exécuter votre code. Puisque votre code est exécuté rapidement, vous devez être capable de suspendre le programme à n’importe quelle instruction. Pour ce faire, vous allez utiliser des points d’arrêt.

Vous pouvez ajouter un point d’arrêt dans Visual Studio Code en cliquant sur le côté gauche du numéro de ligne, sur la ligne dont vous voulez arrêter l’exécution. Une fois le point d’arrêt activé, un cercle rouge doit apparaître. Pour le supprimer, resélectionnez simplement le cercle rouge.

Screenshot of a breakpoint added in the Visual Studio Code editor window.

Si vous cliquez avec le bouton droit pour ajouter un point d’arrêt, vous pouvez également sélectionner Ajouter un point d’arrêt conditionnel. Ce type spécial de point d’arrêt vous permet d’entrer une condition pour l’arrêt de l’exécution. Ce point d’arrêt sera actif seulement quand la condition spécifiée sera remplie. Vous pouvez également modifier un point d’arrêt existant en cliquant dessus avec le bouton droit et en sélectionnant Modifier le point d’arrêt.

Screenshot of setting a conditional breakpoint in Visual Studio Code.

Vue d’ensemble du débogueur Visual Studio Code

Une fois que vous avez configuré vos points d’arrêt et démarré votre application, de nouveaux panneaux d’information et de nouveaux contrôles apparaissent à l’écran.

Screenshot of Visual Studio Code debugger overview.

  1. Contrôles de lancement du débogueur
  2. État de variables
  3. État des variables observées
  4. Pile des appels actuelle
  5. Points d’arrêt
  6. Contrôles d’exécution
  7. Étape d’exécution en cours
  8. Console de débogage

Contrôles de lancement du débogueur

En haut de la barre latérale, vous trouverez les contrôles de lancement :

Screenshot of Visual Studio Code debug sidebar controls.

  1. Démarrez le débogage.
  2. Sélectionnez la configuration de lancement active.
  3. Modifiez le fichier launch.json. Créez-le si nécessaire.
  4. Ouvrez le terminal de débogage.

Afficher et modifier l’état de vos variables

Quand vous analysez la cause d’une anomalie dans un programme, observez l’état de vos variables à la recherche de modifications inattendues. Vous pouvez pour cela utiliser le panneau Variables.

Vos variables apparaissent organisées par étendue :

  • Les variables locales sont accessibles dans l’étendue actuelle, généralement la fonction active.
  • Les variables globales sont accessibles depuis n’importe où dans votre programme. Les objets système du runtime JavaScript étant également inclus, ne soyez pas surpris si vous voyez ici un grand nombre de choses.
  • Les variables de clôture sont accessibles depuis la clôture actuelle, le cas échéant. Une clôture combine l’étendue locale d’une fonction avec l’étendue de la fonction externe à laquelle elle appartient.

Vous pouvez développer les étendues et les variables en sélectionnant la flèche. Quand vous développez des objets, vous pouvez voir toutes les propriétés qui y sont définies.

Il est possible de modifier la valeur d’une variable à la volée en double-cliquant dessus.

En plaçant le pointeur de la souris sur un paramètre de fonction ou sur une variable directement dans la fenêtre de l’éditeur, vous pouvez également voir sa valeur.

Screenshot of variable hover during debugging.

Variables espion

Il peut être fastidieux de rechercher l’état de la variable chaque fois que vous voulez la suivre dans le temps ou dans différentes fonctions. C’est là où le volet Espion se révèle pratique.

Vous pouvez sélectionner le bouton Plus pour entrer un nom de variable ou une expression à observer. Vous pouvez aussi cliquer avec le bouton droit sur une variable dans le panneau Variables et sélectionner Ajouter à la fenêtre Espion.

Toutes les expressions dans le volet Effectuer le suivi sont mises à jour automatiquement à mesure que votre code s’exécute.

Pile des appels

Chaque fois que votre programme entre dans une fonction, une entrée est ajoutée à la pile des appels. Quand votre application devient complexe et que vous avez des fonctions appelées plusieurs fois dans des fonctions, la pile des appels représente le traçage des appels des fonctions.

Elle est pratique pour trouver la source d’une exception. En cas d’incident inattendu dans votre programme, vous allez souvent voir quelque chose comme l’exemple suivant dans la console :

Unhandled exception. System.IndexOutOfRangeException: Index was outside the bounds of the array.
   at OrderProcessor.OrderQueue.ProcessNewOrders(String[] orderIds) in C:\Users\Repos\OrderProcessor\OrderQueue.cs:line 12
   at OrderProcessor.Program.Main(String[] args) in C:\Users\Repos\OrderProcessor\Program.cs:line 9

Le groupe de lignes at [...] situées sous le message d’erreur est appelé une trace de pile. La trace de pile donne le nom et l’origine de chaque fonction qui a été appelée avant de se terminer par l’exception. Elle peut être un peu difficile à déchiffrer, car elle comprend aussi des fonctions internes du runtime .NET.

C’est là où le panneau Pile des appels de Visual Studio Code se révèle pratique. Il filtre les informations non souhaitées pour vous montrer par défaut seulement les fonctions pertinentes provenant de votre propre code. Vous pouvez ensuite remonter cette pile des appels pour déterminer l’origine de l’exception.

Panneau Points d’arrêt

Dans le panneau Points d’arrêt, vous pouvez voir et activer/désactiver tous les points d’arrêt que vous avez placés dans votre code. Vous pouvez également activer ou désactiver des options pour vous arrêter sur les exceptions interceptées ou non interceptées. Vous pouvez utiliser le panneau Points d’arrêt pour examiner l’état de votre programme et remonter à la source d’une exception en utilisant la Pile des appels quand une exception se produit.

Contrôler l’exécution

Vous pouvez contrôler le flux d’exécution de votre programme en utilisant ces contrôles.

Screenshot of Visual Studio Code debugger execution controls.

De gauche à droite, les contrôles sont :

  • Continuer ou suspendre l’exécution : Si l’exécution est suspendue, elle se poursuit jusqu’à ce que le point d’arrêt suivant soit atteint. Si votre programme est en cours d’exécution, le bouton se change en bouton de mise en suspens que vous pouvez utiliser pour suspendre l’exécution.
  • Pas à pas : Exécute l’instruction de code suivante dans le contexte actuel.
  • Effectuer un pas à pas détaillé : Comme Pas à pas principal, mais si l’instruction suivante est un appel de fonction, passe à la première instruction du code de cette fonction (identique à la commande step).
  • Pas à pas sortant : Si vous êtes à l’intérieur d’une fonction, exécute le code restant de cette fonction et revient à l’instruction après l’appel de la fonction initiale (identique à la commande out).
  • Redémarrer : Redémarre votre programme à partir du début.
  • Arrêter : Mettre fin à l’exécution et quitter le débogueur.

Utiliser la console de débogage

Vous pouvez afficher ou masquer la console de débogage en sélectionnant Ctrl+Maj+Y sur Windows et Linux. Sélectionnez Cmd+Maj+Y sur Mac. Vous pouvez utiliser la console de débogage pour visualiser les journaux de console de votre application. Vous pouvez également l’utiliser pour évaluer des expressions ou exécuter du code dans le contexte d’exécution actuel, comme des commandes ou des noms de variables dans le débogueur .NET intégré.

Vous pouvez entrer une expression .NET dans le champ d’entrée en bas de la console de débogage, puis sélectionner sur Entrée pour l’évaluer. Le résultat s’affiche directement dans la console.

Screenshot of Visual Studio Code debug console.

En utilisant la console de débogage, vous pouvez rapidement vérifier la valeur d’une variable, tester une fonction avec différentes valeurs ou modifier l’état actuel.

Remarque

Même si la console de débogage est très utile pour l’exécution et l’évaluation du code .NET, elle peut sembler un peu déroutante lorsque vous essayez d’exécuter ou de déboguer une application de console .NET, car la console de débogage n’accepte aucune entrée du terminal pour un programme en cours d’exécution.

Pour gérer l’entrée de terminal pendant le débogage, vous pouvez utiliser le terminal intégré (l’une des fenêtres Visual Studio Code) ou un terminal externe. Pour ce tutoriel, vous utilisez le terminal intégré.

  1. Ouvrez .vscode/launch.json.

  2. Remplacez le paramètre console par integratedTerminal :

    "console": "internalConsole",
    

    Par :

    "console": "integratedTerminal",
    
  3. Enregistrez vos modifications.

Dans l’unité suivante, vous allez apprendre à utiliser le débogueur pour corriger le bogue dans le code Fibonacci que nous avons vu précédemment.