Partager 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 les conditions de rupture .
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 Point d’arrêt 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 points 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 met pas en pause 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 reconnue par le débogueur. (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 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 complètement à gauche à côté 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, en sélectionnant Paramètres, puis en sélectionnant Conditions

    Paramètres du point d’arrêt

    Paramètres du point d’arrêt

  2. Dans la liste déroulante, sélectionnez Expression conditionnelle, Nombre d’accès ou Filtre, puis 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 quand la valeur de testInt est 4 :

La condition du point d’arrêt est true

La condition du point d’arrêt est true

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

Point d’arrêt En cas de modification

Point d’arrêt En cas de modification

Si vous définissez une condition de point d’arrêt dont la syntaxe est incorrecte, un message d’avertissement s’affiche. Si vous spécifiez une condition de point d’arrêt avec une syntaxe valide, mais dont la sémantique n’est pas valide, un message d’avertissement apparaît quand le point d’arrêt est atteint pour la première fois. 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.

Notes

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 les expressions conditionnelles (C# et F# uniquement)

Parfois, vous voulez observer le comportement d’un objet spécifique. Par exemple, vous voulez savoir pourquoi un objet a été inséré plusieurs fois dans une collection. En C# et en F#, vous pouvez créer des ID d’objet pour des instances spécifiques de types 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 du Common Language Runtime (CLR) et associé à l’objet.

Pour créer un ID d’objet :

  1. Définissez un point d’arrêt dans le code un peu après l’endroit où l’objet a été créé.

  2. Démarrez le débogage et, quand l’exécution se met en pause sur le point d’arrêt, sélectionnez Déboguer>Fenêtres>Variables locales (ou appuyez sur Ctrl + Alt + V, L) pour ouvrir la fenêtre Variables locales.

    Recherchez l’instance d’objet spécifique dans la fenêtre Variables locales, cliquez dessus avec le bouton droit, puis sélectionnez Définir l’ID d’objet.

    Le symbole $ et un nombre s’affichent alors dans la fenêtre Variables locales . Il s’agit de l’ID d’objet.

  3. Ajoutez un nouveau point d’arrêt conditionnel sur le point vous voulez investiguer, par exemple, quand l’objet est 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 true et tapez item == $<n>, où <n> est le numéro de l’ID d’objet.

    L’exécution s’arrête 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 Variables locales, puis sélectionnez Supprimer l’ID d’objet.

Notes

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. Leur validité ne vaut que pour la session de débogage active.

Définir une condition de nombre d’accès

Si vous pensez qu’une boucle de votre code commence à avoir un comportement anormal après un certain nombre d’itérations, vous pouvez définir un point d’arrêt pour arrêter l’exécution au bout de ce nombre d’accès, plutôt que d’appuyer plusieurs fois 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 du point d’arrêt

Nombre d’accès du 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), || (OR), ! (NOT) et de parenthèses.

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

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

Pour 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ètre 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 Langage, choisissez le langage de la fonction.

  4. Sélectionnez OK.

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

Vous pouvez aussi 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, avec un objet adressable de type my_class, vous pouvez définir un point d’arrêt de fonction sur la méthode my_method appelée par 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 zone 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 quand 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.

    Point d’arrêt de données managé

Les points d’arrêt des 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 quand une valeur stockée sur une adresse mémoire spécifiée change. Si la valeur est lue mais pas modifiée, l’exécution ne s’interrompt 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 prend comme valeur une adresse mémoire. Par exemple, tapez &avar pour interrompre l’exécution quand 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 à partir de &avar et interrompt l’exécution 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 mémoire est partagé entre plusieurs processus.
  • L’emplacement de 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.

Notes

  • Les points d’arrêt de données dépendent d’adresses mémoire spécifiques. L’adresse d’une variable change 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 sur une variable locale, ce point d’arrêt reste activé quand la fonction s’arrête. Cependant, l’adresse mémoire n’est plus applicable, et le comportement du point d’arrêt est donc imprévisible. Si vous définissez un point d’arrêt de données sur une variable locale, vous devez le supprimer ou le désactiver 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 des données. La limite fait référence au nombre maximal de points d’arrêt des données que vous pouvez définir.

Architecture du processeur Limite de 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 en premier. 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 faciliter le débogage du code dans des chemins courants comme une boucle de jeu ou une API d’utilitaire, car un point d’arrêt dans ces fonctions peut être configuré pour être activé 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 pré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. Sinon, 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 aussi utiliser le menu contextuel (bouton droit) pour définir un 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 Dependentbreakpoint

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

Définir un point d’arrêt temporaire

Ce point d’arrêt vous permet d’arrêter le code une seule fois. Pendant le débogage, le débogueur Visual Studio met en pause l’application en cours d’exécution une seule fois pour ce point d’arrêt, puis le supprime immédiatement après qu’il a été 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. Sinon, dans la fenêtre Points d’arrêt, choisissez OK pour fermer la boîte de dialogue.

    Point d’arrêt temporaire

Vous pouvez aussi utiliser le menu contextuel (bouton droit) pour définir un point d’arrêt temporaire.

  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 temporaire dans le menu contextuel.

    Contexte de point d’arrêt temporaire

Vous pouvez également simplement utiliser le raccourci F9 + Maj + Alt, T et définir le point d’arrêt temporaire sur la ligne souhaitée.