web-dev-qa-db-fra.com

Break quand une valeur change en utilisant le débogueur Visual Studio

Existe-t-il un moyen de placer une surveillance sur une variable et d’interrompre Visual Studio uniquement lorsque cette valeur change?

Il serait tellement plus facile de trouver des problèmes épineux d’État.

Cela peut-il être fait?

Les conditions de points d'arrêt nécessitent toujours un ensemble de points d'arrêt, et je préfère définir une surveillance et laisser Visual Studio définir les points d'arrêt aux changements d'état.

171
FlySwat

Dans le menu Visual Studio 2005:

Débogage -> Nouveau point d'arrêt -> Nouveau point d'arrêt de données

Entrer:

&myVariable
115
AShelly

Vous pouvez également choisir de casser explicitement dans le code:

// Assuming C#
if (condition)
{
    System.Diagnostics.Debugger.Break();
}

De MSDN:

Debugger.Break: Si aucun débogueur n'est attaché, les utilisateurs sont demandé s'ils veulent joindre un débogueur. Si oui, le débogueur est commencé. Si un débogueur est attaché, le débogueur est signalé à un utilisateur événement de point d'arrêt et le débogueur suspend l'exécution du processus juste comme si un point d'arrêt de débogueur avait été frappé.

Ce n'est cependant qu'un repli. La définition d'un point d'arrêt conditionnel dans Visual Studio, comme décrit dans d'autres commentaires, constitue un meilleur choix.

26
Michael Petrotta

Vraiment vieux post, mais au cas où quelqu'un l'ignorerait ...

Dans Visual Studio 2015 , vous pouvez placer un point d'arrêt sur l'accesseur set d'une propriété implémentée automatiquement. Le débogueur s'interrompra lorsque la propriété sera mise à jour.

public bool IsUpdated
{
    get;
    set;    //set breakpoint on this line
}

Mettre à jour

Alternativement @AbdulRaufMujahid a indiqué dans les commentaires que si la propriété implémentée automatiquement se trouve sur une seule ligne, vous pouvez positionner votre curseur sur le get; ou le set; et cliquer sur F9 pour placer un point d'arrêt en conséquence. Agréable!

public bool IsUpdated { get; set; }
24
Craig

Imaginez que vous ayez une classe appelée A avec la déclaration suivante.

class A  
{  
    public:  
        A();

    private:
        int m_value;
};

Vous voulez que le programme s'arrête quand quelqu'un modifie la valeur de "m_value".

Accédez à la définition de la classe et mettez un point d'arrêt dans le constructeur de A.

A::A()
{
    ... // set breakpoint here
}

Une fois que nous avons arrêté le programme:

Debug -> Nouveau point d'arrêt -> Nouveau point d'arrêt de données ...

Adresse: & (this-> m_value)
Nombre d'octets: 4 (Parce que int a 4 octets)

Maintenant, nous pouvons reprendre le programme. Le débogueur s'arrête lorsque la valeur est modifiée.

Vous pouvez faire la même chose avec des classes héritées ou des classes composées.

class B
{
   private:
       A m_a;
};

Adresse: & (this-> m_a.m_value)

Si vous ne connaissez pas le nombre d'octets de la variable à inspecter, vous pouvez utiliser l'opérateur sizeof.

Par exemple:

// to know the size of the Word processor,  
// if you want to inspect a pointer.
int wordTam = sizeof (void* ); 

Si vous regardez la "pile d'appels", vous pouvez voir la fonction qui a changé la valeur de la variable.

12
momboco

Modifiez la variable en une propriété et ajoutez un point d'arrêt dans la méthode set. Exemple:

private bool m_Var = false;
protected bool var
{
    get { 
        return m_var;
    }

    set { 
        m_var = value;
    }
}
9
Marcello

Je me souviens de la façon dont vous l'avez décrit avec Visual Basic 6.0 . Dans Visual Studio, la seule solution que j'ai trouvée jusqu'ici consiste à spécifier une condition de point d'arrêt .

3
Gulzar Nazim

Si vous utilisez WPF, il existe un outil génial: Inspecteur WPF .
Il s’attache à une application WPF et affiche l’arborescence complète des contrôles avec toutes les propriétés, et vous permet (entre autres) d’interrompre toute modification de propriété.

Mais malheureusement, je n’ai trouvé aucun outil vous permettant de faire la même chose avec n’importe quelle propriété ou variable.

3
Julien N

Un clic droit sur le point d'arrêt fonctionne très bien pour moi (bien que je l'utilise principalement pour des points d'arrêt conditionnels sur des valeurs de variable spécifiques. Même le bris d'expressions impliquant un nom de fil fonctionne ce qui est très utile si vous essayez de repérer des problèmes de thread).

2
Oskar

Vous pouvez utiliser un point de contrôle de la mémoire en code non géré. Pas sûr si ceux-ci sont disponibles dans le code géré cependant.

1
1800 INFORMATION

Vous pouvez probablement utiliser intelligemment la fonction DebugBreak () .

1
wip

Comme Peter Mortensen a écrit:

Dans le menu Visual Studio 2005:

Debug -> Nouveau point d'arrêt -> Nouveau point d'arrêt de données

Entrez: & myVariable

Information additionnelle:

De toute évidence, le système doit savoir quelle adresse en mémoire regarder. So - définissez un point d'arrêt normal sur l'initialisation de myVariable (ou myClass.m_Variable) - exécutez le système et attendez qu'il s'arrête à ce point d'arrêt .- Maintenant, l'entrée de menu est activée et vous peut regarder la variable en entrant &myVariable, .__ ou l'instance en entrant &myClass.m_Variable. Maintenant les adresses sont bien définies.

Désolé quand j'ai mal agi en expliquant une solution déjà donnée. Mais je ne pouvais pas ajouter de commentaire, et il y a eu quelques commentaires à ce sujet. 

1
R Risack

Vous pouvez éventuellement surcharger l'opérateur = pour la variable et placer le point d'arrêt à l'intérieur de la fonction surchargée à une condition spécifique.

0
PRIME

Mise à jour 2019:

Ceci est maintenant officiellement pris en charge dans Visual Studio 2019 Preview 2 pour .Net Core 3.0 ou version ultérieure. Bien entendu, vous devrez peut-être penser aux risques potentiels liés à l’utilisation d’une version Preview de IDE. J'imagine que dans un proche avenir, cela sera inclus dans le Visual Studio officiel.

https://blogs.msdn.Microsoft.com/visualstudio/2019/02/12/break-when-value-changes-data-breakpoints-for-net-core-in-visual-studio-2019/

Heureusement, les points d'arrêt données ne sont plus exclusifs à C++ car ils sont désormais disponibles pour .NET Core (version 3.0 ou supérieure) dans Visual Studio 2019 Preview 2!

0
Matt