Partage via


Utiliser le type de point d’arrêt approprié

Cet article explique comment utiliser différents types de points d’arrêt dans Visual Studio pour améliorer l’efficacité du débogage. Il couvre différents scénarios où des points d’arrêt peuvent être appliqués, tels que la suspension de l’exécution du code, la journalisation des informations et le suivi des modifications dans les états variables. L’article explique comment définir des points d’arrêt conditionnels, des points de trace, des points d’arrêt de données, des points d’arrêt dépendants et des points d’arrêt temporaires. Il inclut également des instructions détaillées sur la définition des points d’arrêt de fonction. Ce guide est essentiel pour les développeurs qui souhaitent utiliser les points d'arrêt pour effectuer un débogage efficace dans Visual Studio.

Si vous ne connaissez pas l’utilisation de points d’arrêt dans Visual Studio, consultez Prise en main des points d’arrêt avant de passer à cet article.

Pour une expérience optimale avec cette documentation, choisissez votre langage de développement ou runtime préféré dans la liste en haut de l’article.

Scénarios

Le tableau suivant présente les scénarios de débogage courants pour les points d’arrêt et le type de point d’arrêt recommandé pour le scénario.

Scénario Description
Comment suspendre l’exécution du code pour inspecter une ligne de code susceptible de contenir un bogue ? Définissez un point d’arrêt. Pour plus d’informations, consultez Prise en main des points d’arrêt.
Ma variable a-t-elle une valeur inattendue ? Ou dois-je inspecter mon application lorsqu’elle atteint un état spécifique ? Essayez un point d’arrêt conditionnel pour contrôler où et quand un point d’arrêt est activé à l’aide de la logique conditionnelle. Cliquez avec le bouton droit sur un point d’arrêt pour ajouter des conditions. Définissez la condition sur true lorsque la variable est égale à la valeur inattendue. Pour plus d’informations, consultez Conditions de point d’arrêt.
Comment enregistrer des informations dans la fenêtre Sortie dans des conditions configurables sans modifier ou arrêter mon code ? Les points de trace vous permettent de consigner des informations dans la fenêtre Sortie dans des conditions configurables sans modifier ou arrêter votre code. Pour plus d’informations, consultez Utiliser des points de trace dans le débogueur Visual Studio.
Comment savoir quand la valeur de ma variable change ? Pour C++, définissez un point d’arrêt de données .
Pour les applications utilisant .NET Core 3 et versions ultérieures, vous pouvez également définir un point d’arrêt de données .
Pour C# et F# uniquement, vous pouvez également suivre un ID d’objet avec un point d’arrêt conditionnel.
Comment arrêter l’exécution uniquement si un autre point d’arrêt est atteint ? Définissez un point d’arrêt dépendant qui interrompt l’exécution uniquement si un autre point d’arrêt est atteint pour la première fois. Pour plus d’informations, consultez Point d’arrêt dépendant.
Puis-je atteindre un point d’arrêt une seule fois ? Définissez un point d’arrêt temporaire qui vous permet d’interrompre le code une seule fois. Pour plus d’informations, consultez le point de rupture temporaire .
Puis-je suspendre le code à l’intérieur d’une boucle à une certaine itération ? Définissez un point d’arrêt dépendant qui interrompt l’exécution uniquement si un autre point d’arrêt est atteint pour la première fois. Pour plus d’informations, consultez Nombre d’accès.
Puis-je suspendre le code au début d’une fonction quand je connais le nom de la fonction, mais pas son emplacement ? Vous pouvez effectuer cette opération avec un point d’arrêt de fonction. Pour plus d’informations, consultez Définir des points d’arrêt de fonction.
Puis-je suspendre le code au début de plusieurs fonctions portant le même nom ? Lorsque vous avez plusieurs fonctions portant le même nom (fonctions surchargées ou fonctions dans différents projets), vous pouvez utiliser un point d’arrêt de fonction .

Actions de point d’arrêt et points de trace

Un point de trace est un point d’arrêt qui affiche un message dans la fenêtre Sortie. Un point de trace peut agir comme une instruction de trace temporaire dans le langage de programmation et ne suspend pas l’exécution du code. Vous créez un point de trace en définissant une action spéciale dans la fenêtre Paramètres du point d’arrêt. Pour obtenir des instructions détaillées, consultez Utiliser des points de trace dans le débogueur Visual Studio.

Conditions de point d’arrêt

Vous pouvez contrôler quand et où un point d’arrêt s’exécute en définissant des conditions. La condition peut être n’importe quelle expression valide que le débogueur reconnaît. (Pour plus d’informations sur les expressions valides, consultez Expressions dans le débogueur.)

Pour définir une condition de point d’arrêt :

  1. Cliquez avec le bouton droit sur le symbole de point d’arrêt et sélectionnez Conditions (ou appuyez sur Alt + F9, C). Ou pointez sur le symbole de point d’arrêt, sélectionnez l'icône des Paramètres , puis sélectionnez Conditions dans la fenêtre Paramètres du point d’arrêt.

    Vous pouvez également cliquer avec le bouton droit dans la marge située à gauche en regard d’une ligne de code et sélectionner Insérer un point d’arrêt conditionnel dans le menu contextuel pour définir un nouveau point d’arrêt conditionnel.

    Vous pouvez également définir des conditions dans la fenêtre points d’arrêt en cliquant avec le bouton droit sur un point d’arrêt et en sélectionnant Paramètres, puis en sélectionnant Conditions

    Paramètres de point d’arrêt

    paramètres de point d’arrêt Paramètres de point d’arrêt BreakpointSettings

  2. Dans la liste déroulante, sélectionnez expression conditionnelle, compteur d'occurrences, ou filtre, et définissez la valeur en conséquence.

  3. Sélectionnez Fermer ou appuyez sur Ctrl+Entrée pour fermer la fenêtre Paramètres du point d'arrêt. Sinon, dans la fenêtre Points d’arrêt, sélectionnez OK pour fermer la boîte de dialogue.

Les points d’arrêt avec des conditions définies s’affichent avec un symbole + dans le code source et les fenêtres Points d’arrêt.

Créer une expression conditionnelle

Quand vous sélectionnez Expression conditionnelle, vous avez le choix entre deux conditions : Est true et En cas de modification. Choisissez Est true pour arrêter l’exécution quand l’expression est satisfaite ou En cas de modification pour l’arrêter quand la valeur de l’expression a changé.

Dans l’exemple suivant, le point d’arrêt est atteint uniquement lorsque la valeur de testInt est 4:

La condition de point d'arrêt a la valeur true

La condition de point d'arrêt a la valeur true

Dans l’exemple suivant, le point d’arrêt est atteint uniquement lorsque la valeur de testInt change :

point d’arrêt Point d’arrêt modifié

point d’arrêt Point d’arrêt modifié

Si vous définissez une condition de point d’arrêt avec une syntaxe non valide, un message d’avertissement s’affiche. Si vous spécifiez une condition de point d’arrêt avec une syntaxe valide mais une sémantique non valide, un message d’avertissement s’affiche la première fois que le point d’arrêt est atteint. Dans les deux cas, le débogueur s’arrête quand il atteint le point d’arrêt non valide. Le point d’arrêt n’est ignoré que si la condition est valide et prend la valeur false.

Remarque

Pour le champ En cas de modification, le débogueur ne considère pas la première évaluation de la condition comme un changement, et n’atteint donc pas le point d’arrêt pendant la première évaluation.

Utiliser des ID d’objet dans des expressions conditionnelles (C# et F# uniquement)

Il existe des moments où vous souhaitez observer le comportement d’un objet spécifique. Par exemple, vous souhaiterez peut-être savoir pourquoi un objet a été inséré dans une collection plusieurs fois. En C# et F#, vous pouvez créer des ID d’objet pour des instances spécifiques de types de référence , et les utiliser dans des conditions de point d’arrêt. L’ID d’objet est généré par les services de débogage CLR (Common Language Runtime) et associés à l’objet.

Pour créer un ID d’objet :

  1. Définissez un point d’arrêt dans le code une fois l’objet créé.

  2. Démarrez le débogage et, lorsque l’exécution s’arrête au point d’arrêt, sélectionnez Déboguer>Windows>Locals (ou appuyez sur Ctrl + Alt + V, L) pour ouvrir la fenêtre Locals.

    Recherchez l’instance d’objet spécifique dans la fenêtre Locals, cliquez dessus avec le bouton droit, puis sélectionnez Créer un ID d’objet.

    Vous devez voir un $ plus un nombre dans la fenêtre Variables locales. Il s’agit de l’ID d’objet.

  3. Ajoutez un nouveau point d’arrêt au point que vous souhaitez examiner ; par exemple, lorsque l’objet doit être ajouté à la collection. Cliquez avec le bouton droit sur le point d’arrêt et sélectionnez Conditions.

  4. Utilisez l'ID d'objet dans le champ « expression conditionnelle » . Par exemple, si la variable item est l’objet à ajouter à la collection, sélectionnez Est vrai et tapez item == $<n>, où <n> est le numéro d'identifiant d'objet.

    L’exécution s’interrompt au point où cet objet doit être ajouté à la collection.

    Pour supprimer l’ID d’objet, cliquez avec le bouton droit sur la variable dans la fenêtre Locals, puis sélectionnez Supprimer l’ID d’objet.

Remarque

Les ID d’objet créent des références faibles et n’empêchent pas l’objet de subir une récupération de mémoire. Ils sont valides uniquement pour la session de débogage actuelle.

Définir une condition de nombre de hits

Si vous pensez qu’une boucle dans votre code commence à se comporter mal après un certain nombre d’itérations, vous pouvez définir un point d’arrêt pour arrêter l’exécution après ce nombre d’accès, plutôt que de devoir appuyer à plusieurs reprises sur F5 pour atteindre cette itération.

Sous Conditions dans la fenêtre Paramètres du point d’arrêt, sélectionnez Nombre d’accès, puis spécifiez le nombre d’itérations. Dans l’exemple suivant, le point d’arrêt est atteint à chaque itération :

Nombre d'accès à un point d'arrêt

Nombre d'accès à un point d'arrêt

Définir une condition de filtre

Vous pouvez limiter le déclenchement d’un point d’arrêt seulement sur des appareils spécifiés ou dans des processus et des threads spécifiés.

Sous Conditions dans la fenêtre Paramètres du point d’arrêt, sélectionnez Filtre, puis entrez une ou plusieurs des expressions suivantes :

  • MachineName = "nom"
  • ProcessId = valeur
  • ProcessName = "nom"
  • ThreadId = valeur
  • ThreadName = "nom"

Placez les valeurs de chaîne entre guillemets doubles. Vous pouvez combiner des clauses à l’aide de & (AND), de || (OR), de ! (NOT) et de parenthèses.

Définir des points d’arrêt de fonction

Vous pouvez interrompre l’exécution lorsqu’une fonction est appelée. Cela est utile, par exemple, lorsque vous connaissez le nom de la fonction, mais pas son emplacement. Il est également utile si vous avez des fonctions portant le même nom et que vous souhaitez les interrompre toutes (telles que les fonctions surchargées ou les fonctions dans différents projets).

Définir un point d’arrêt de fonction :

  1. Sélectionnez Déboguer>Nouveau point d’arrêt>Point d’arrêt de fonction, ou appuyez sur Ctrl + K, B.

    Vous pouvez également sélectionner Nouveau>Point d’arrêt de fonction dans la fenêtre Points d’arrêt.

  2. Dans la boîte de dialogue Nouveau point d’arrêt de fonction, entrez le nom de la fonction dans la zone Nom de la fonction.

    Pour affiner la spécification de la fonction :

    • Utilisez le nom complet de la fonction.

      Exemple : Namespace1.ClassX.MethodA()

    • Ajoutez les types de paramètres d’une fonction surchargée.

      Exemple : MethodA(int, string)

    • Utilisez le symbole « ! » pour spécifier le module.

      Exemple : App1.dll!MethodA

    • Utilisez l’opérateur de contexte en C++natif.

      {function, , [module]} [+<line offset from start of method>]

      Exemple : {MethodA, , App1.dll}+2

  3. Dans la liste déroulante Langue, choisissez la langue de la fonction.

  4. Sélectionnez OK.

Définir un point d’arrêt de fonction à l’aide d’une adresse mémoire (C++ natif uniquement)

Vous pouvez utiliser l’adresse d’un objet pour définir un point d’arrêt de fonction sur une méthode appelée par une instance spécifique d’une classe. Par exemple, en fonction d’un objet adressable de type my_class, vous pouvez définir un point d’arrêt de fonction sur la méthode my_method qui appelle cette instance.

  1. Définissez un point d’arrêt quelque part après l’instanciation de l’instance de la classe.

  2. Recherchez l’adresse de l’instance (par exemple, 0xcccccccc).

  3. Sélectionnez Déboguer>Nouveau point d’arrêt>Point d’arrêt de fonction, ou appuyez sur Ctrl + K, B.

  4. Ajoutez ce qui suit à la boîte nom de la fonction, puis sélectionnez le langage C++.

    ((my_class *) 0xcccccccc)->my_method
    

Définir des points d’arrêt de données (.NET Core 3.x ou .NET 5+)

Les points d’arrêt de données arrêtent l’exécution lorsque la propriété d’un objet spécifique change.

Pour définir un point d’arrêt de données :

  1. Dans un projet .NET Core ou .NET 5+, démarrez le débogage et attendez qu’un point d’arrêt soit atteint.

  2. Dans la fenêtre Automatique, Espion ou Variables locales, cliquez avec le bouton droit sur une propriété et sélectionnez Arrêter quand la valeur change dans le menu contextuel.

    Points d’arrêt sur variable managés

Les points d’arrêt de données pour .NET Core et .NET 5+ ne fonctionnent pas pour :

  • Propriétés non extensibles dans la fenêtre Info-bulle, Variables locales, Automatique ou Espion
  • Variables statiques
  • Classes avec l’attribut DebuggerTypeProxy
  • Champs à l’intérieur de structs

Pour connaître le nombre maximal que vous pouvez définir, consultez les Limites matérielles du point d’arrêt des données.

Définir des points d’arrêt de données (C++ natif uniquement)

Les points d’arrêt de données arrêtent l’exécution lorsqu’une valeur stockée à une adresse mémoire spécifiée change. Si la valeur est lue, mais n’est pas modifiée, l’exécution ne s’arrête pas.

Pour définir un point d’arrêt de données :

  1. Dans un projet C++, démarrez le débogage et attendez qu’un point d’arrêt soit atteint. Dans le menu Déboguer, choisissez Nouveau point d’arrêt>Nouveau point d’arrêt.

    Vous pouvez également sélectionner Nouveau>Point d’arrêt de données dans la fenêtre Points d’arrêt, ou cliquer avec le bouton droit sur un élément dans la fenêtre Automatique, Espion ou Variables locales, puis sélectionner Arrêter quand la valeur change dans le menu contextuel.

  2. Dans la zone Adresse, tapez une adresse mémoire ou une expression qui s’évalue à une adresse mémoire. Par exemple, saisissez &avar pour arrêter lorsque le contenu de la variable avar change.

  3. Dans la zone déroulante Nombre d’octets , sélectionnez le nombre d’octets que le débogueur doit surveiller. Par exemple, si vous sélectionnez 4, le débogueur surveille les quatre octets commençant à &avar et interrompt si l’un de ces octets change de valeur.

Les points d’arrêt de données ne fonctionnent pas dans les conditions suivantes :

  • Un processus qui n’est pas en cours de débogage écrit à l’emplacement mémoire.
  • L’emplacement de mémoire est partagé entre deux processus ou plus.
  • L’emplacement de la mémoire est mis à jour dans le noyau. Par exemple, si la mémoire est passée à la fonction ReadFile Windows 32 bits, elle est mise à jour à partir du mode noyau et le débogueur ne s’arrête pas sur la mise à jour.
  • Quand l’expression watch est supérieure à 4 octets sur du matériel 32 bits et à 8 octets sur du matériel 64 bits. Il s’agit d’une limitation de l’architecture x86.

Remarque

  • Les points d’arrêt de données dépendent d’adresses mémoire spécifiques. L’adresse d’une variable passe d’une session de débogage à la suivante, de sorte que les points d’arrêt de données sont automatiquement désactivés à la fin de chaque session de débogage.

  • Si vous définissez un point d’arrêt de données sur une variable locale, le point d’arrêt reste activé lorsque la fonction se termine, mais l’adresse mémoire n’est plus applicable, de sorte que le comportement du point d’arrêt est imprévisible. Si vous définissez un point d’arrêt de données sur une variable locale, vous devez supprimer ou désactiver le point d’arrêt avant la fin de la fonction.

Limites matérielles du point d’arrêt des données

Le noyau Windows et le matériel sous-jacent ont les limites suivantes lors de la définition de points d’arrêt de données. La limite fait référence au nombre maximal de points d’arrêt de données que vous pouvez définir.

Architecture du processeur Limite du point d’arrêt des données
x64 et x86 4
ARM64 2
ARM 1

Définir un point d’arrêt dépendant

Les points d’arrêt dépendants arrêtent l’exécution uniquement si un autre point d’arrêt est atteint pour la première fois. Ainsi, dans un scénario complexe comme le débogage d’une application multithread, vous pouvez configurer les points d’arrêt supplémentaires après la première fois qu’un autre point d’arrêt est atteint. Cela peut rendre le code de débogage dans des chemins courants tels que la boucle de jeu ou une API utilitaire beaucoup plus facile, car un point d’arrêt dans ces fonctions peut être configuré pour permettre uniquement si la fonction est appelée à partir d’une partie spécifique de votre application.

Pour définir un point d’arrêt dépendant :

  1. Pointez sur le symbole de point d’arrêt, choisissez l’icône Paramètres, puis sélectionnez Activer uniquement quand le point d’arrêt suivant est atteint dans la fenêtre Paramètres du point d’arrêt.

  2. Dans la liste déroulante, sélectionnez le point d’arrêt requis dont vous souhaitez que votre point d’arrêt actuel dépende.

Choisissez Fermer ou appuyez sur Ctrl+Entrée pour fermer la fenêtre Paramètres du point d’arrêt. Ou, dans la fenêtre Points d’arrêt, choisissez OK pour fermer la boîte de dialogue. Point d’arrêt dépendant

Vous pouvez également utiliser le menu contextuel de clic droit pour définir le point d’arrêt dépendant.

  1. Cliquez avec le bouton droit dans la marge complètement à gauche à côté d’une ligne de code, puis sélectionnez Insérer un point d’arrêt dépendant dans le menu contextuel.

    Contexte de point d'arrêt dépendant

  • Les points d’arrêt dépendants ne fonctionnent pas s’il n’existe qu’un seul point d’arrêt dans votre application.
  • Les points d’arrêt dépendants sont convertis en point d’arrêt de ligne normal si le point d’arrêt requis est supprimé.

Définir un point d’arrêt temporaire

Ce point d’arrêt vous permet d’interrompre le code une seule fois. Lors du débogage, le débogueur Visual Studio suspend uniquement l'application en cours d'exécution une seule fois à ce point d'arrêt, puis le supprime immédiatement lorsque ce point d'arrêt est atteint.

Pour définir un point d’arrêt temporaire :

  1. Pointez sur le symbole de point d’arrêt, choisissez l’icône Paramètres, puis sélectionnez Supprimer le point d’arrêt dès qu’il est atteint dans la fenêtre Paramètres du point d’arrêt.

  2. Choisissez Fermer ou appuyez sur Ctrl+Entrée pour fermer la fenêtre Paramètres du point d’arrêt. Ou, dans la fenêtre Points d’arrêt, choisissez OK pour fermer la boîte de dialogue.

    point d’arrêt temporaire

Vous pouvez également utiliser le menu contextuel pour définir le point d’arrêt temporaire.

  1. Cliquez avec le bouton droit dans la marge de gauche d'une ligne de code et sélectionnez Insérer un point d’arrêt temporaire dans le menu contextuel.

    Contexte de point d’arrêt temporaire

Sinon, utilisez simplement le raccourci F9 + Maj + Alt, T et définissez le point d’arrêt temporaire sur la ligne souhaitée.