Existe-t-il un moyen de placer une surveillance sur une variable et de ne faire interrompre Visual Studio que lorsque cette valeur change?
Il serait ainsi beaucoup plus facile de trouver des problèmes d'état délicats.
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 surveillance et laisser Visual Studio définir les points d'arrêt lors des changements d'état.
Réponses:
Dans le menu Visual Studio 2005:
Débogage -> Nouveau point d'arrêt -> Nouveau point d'arrêt des données
Entrer:
la source
Vous pouvez également choisir de rompre explicitement dans le code:
Depuis MSDN:
Ce n'est qu'un repli, cependant. La définition d'un point d'arrêt conditionnel dans Visual Studio, comme décrit dans d'autres commentaires, est un meilleur choix.
la source
Vraiment un vieux message mais au cas où quelqu'un ne le sait pas ...
Dans Visual Studio 2015 , vous pouvez placer un point d'arrêt sur l'
set
accesseur d'une propriété implémentée automatiquement et le débogueur s'arrêtera lorsque la propriété sera mise à jourMettre à jour
Alternativement; @AbdulRaufMujahid a souligné dans les commentaires que si la propriété implémentée automatiquement se trouve sur une seule ligne, vous pouvez positionner votre curseur sur
get;
ouset;
et frapperF9
et un point d'arrêt sera placé en conséquence. Agréable!la source
Imaginez que vous ayez une classe appelée A avec la déclaration suivante.
Vous souhaitez que le programme s'arrête lorsque quelqu'un modifie la valeur de "m_value".
Accédez à la définition de classe et mettez un point d'arrêt dans le constructeur de A.
Une fois que nous avons arrêté le programme:
Débogage -> Nouveau point d'arrêt -> Nouveau point d'arrêt des données ...
Adresse: & (this-> m_value)
Nombre d'octets: 4 (car 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 de même avec les classes héritées ou les classes composées.
Adresse: & (this-> m_a.m_value)
Si vous ne connaissez pas le nombre d'octets de la variable que vous souhaitez inspecter, vous pouvez utiliser l'opérateur sizeof.
Par exemple:
Si vous regardez la "pile d'appels", vous pouvez voir la fonction qui a changé la valeur de la variable.
la source
Modifiez la variable en propriété et ajoutez un point d'arrêt dans la méthode set. Exemple:
la source
Si vous utilisez WPF, il existe un outil génial: WPF Inspector .
Il s'attache à une application WPF et affiche l'arborescence complète des contrôles avec toutes les propriétés, et il vous permet (entre autres) d'interrompre tout changement de propriété.
Mais malheureusement, je n'ai trouvé aucun outil qui vous permettrait de faire de même avec n'importe quelle propriété ou variable.
la source
Je me souviens de la façon dont vous l'avez décrit en utilisant Visual Basic 6.0 . Dans Visual Studio, le seul moyen que j'ai trouvé jusqu'à présent est de spécifier une condition de point d'arrêt .
la source
Le clic droit sur le point d'arrêt fonctionne bien pour moi (bien que la plupart du temps je l'utilise pour des points d'arrêt conditionnels sur des valeurs de variable spécifiques.
la source
Comme l'a écrit Peter Mortensen:
Information additionnelle:
De toute évidence, le système doit savoir quelle adresse en mémoire regarder. Donc - définissez un point d'arrêt normal pour l'initialisation de
myVariable
(oumyClass.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 pouvez 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 fait en expliquant une solution déjà donnée. Mais je n'ai pas pu ajouter de commentaire, et il y a eu des commentaires à ce sujet.
la source
Vous pouvez utiliser un point d'observation de la mémoire dans du code non managé. Je ne sais pas si ceux-ci sont disponibles dans le code managé.
la source
Vous pouvez probablement faire un usage intelligent de la fonction DebugBreak () .
la source
myVariable
est utilisé et stocker ses valeurs après utilisation dans unepreviousValue
variable auxiliaire , puis appeler DebugBreak () quandmyVariable!=previousValue
; alors vous saurez entre quels blocs de codemyVariable
a changé. Mais je suis d'accord que la solution d'AShelly est la meilleure.Vous pouvez éventuellement surcharger l'opérateur = pour la variable et mettre le point d'arrêt à l'intérieur de la fonction surchargée dans des conditions spécifiques.
la source
Mise à jour en 2019:
Ceci est désormais officiellement pris en charge dans Visual Studio 2019 Preview 2 pour .Net Core 3.0 ou supérieur. Bien sûr, vous devrez peut-être réfléchir à certains risques potentiels liés à l'utilisation d'une version d'aperçu d'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/
la source