Pause lorsqu'une valeur change à l'aide du débogueur Visual Studio
Existe-t-il un moyen de placer une montre sur une variable et d'avoir une pause Visual Studio uniquement lorsque cette valeur change?
Il serait tellement plus facile de trouver des problèmes d'état difficiles.
Cela Peut-il être fait?
Les conditions de point d'arrêt nécessitent toujours un ensemble de points d'arrêt, et je préfère définir une montre et laisser Visual Studio définir les points d'arrêt aux changements d'état.
11 réponses
Dans le menu Visual Studio 2005:
Debug -> Nouveau Point D'Arrêt -> De Nouvelles Données De Point D'Arrêt
Entrez:
&myVariable
Vous pouvez également choisir de casser explicitement dans le code:
// Assuming C#
if (condition)
{
System.Diagnostics.Debugger.Break();
}
De MSDN:
Débogueur.Briser: Si aucun débogueur n'est attaché, les utilisateurs sont demandé s'ils veulent joindre un débogueur. Si oui, le débogueur est commencer. Si un débogueur est attaché, le débogueur est signalé avec 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 du débogueur avait été frapper.
Ce n'est qu'un repli, cependant. La fixation d'un point d'arrêt conditionnel dans Visual Studio, comme indiqué dans d'autres commentaires, est un meilleur choix.
Très vieux poste mais au cas où quelqu'un ne l'ignore pas...
Dans Visual Studio 2015 , vous pouvez placer un point d'arrêt sur l'accesseur set
d'une propriété implémentée automatiquement et le débogueur se rompt lorsque la propriété est mise à jour
public bool IsUpdated
{
get;
set; //set breakpoint on this line
}
Mise à Jour
Alternativement; @ AbdulRaufMujahid a souligné dans les commentaires que si la propriété auto implémentée est sur une seule ligne, vous pouvez positionner votre curseur sur get;
ou set;
et frapper F9
et un point d'arrêt sera être placé en conséquence. Nice!
public bool IsUpdated { get; set; }
Imaginez que vous avez 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".
Allez à la définition de 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. Débogueur s'arrête lorsque la valeur est modifiée.
Vous pouvez faire la même chose avec les classes héritées ou les 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 que vous voulez examiner, 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'Appel", vous pouvez voir la fonction qui a changé la valeur de la variable.
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;
}
}
Si vous utilisez WPF, il est un outil génial : WPF Inspecteur.
Il s'attache à une application WPF et affiche l'arborescence complète des contrôles avec toutes les propriétés, ce qui vous permet (entre autres) de casser tout changement de propriété.
Mais malheureusement, je n'ai trouvé aucun outil qui vous permettrait de faire la même chose avec N'importe quelle propriété ou variable.
Je me souviens de la façon dont vous l'avez décrit en utilisant Visual Basic 6.0 . Dans Visual Studio, la seule façon que j'ai trouvée jusqu'à présent est de spécifier une condition de point d'arrêt .
Le clic droit sur le point d'arrêt fonctionne bien pour moi (bien que je l'utilise surtout pour les points d'arrêt conditionnels sur des valeurs de variables spécifiques. Même casser des expressions impliquant un nom de thread fonctionne, ce qui est très utile si vous essayez de repérer les problèmes de threading).
Vous pouvez utiliser un point de veille mémoire dans un code non géré. Je ne sais pas si ceux-ci sont disponibles dans le code géré.
Vous pouvez probablement utiliser intelligemment la fonctionDebugBreak () .
Vous pouvez éventuellement surcharger l'opérateur = pour la variable et placer le point d'arrêt dans la fonction surchargée à une condition spécifique.