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.

166
demandé sur Peter Mortensen 2008-10-02 02:26:50

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
108
répondu AShelly 2016-04-08 14:57:59

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.

25
répondu Michael Petrotta 2016-04-08 14:59:21

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; }
21
répondu Craig 2016-07-15 13:28:09

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.

11
répondu momboco 2011-03-06 12:04:19

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
répondu Marcello 2016-04-08 15:01:47

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.

3
répondu Julien N 2011-11-17 17:14:53

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 .

3
répondu Gulzar Nazim 2014-05-15 15:11:25

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).

2
répondu Oskar 2014-05-15 15:09:10

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é.

1
répondu 1800 INFORMATION 2008-10-01 22:38:20

Vous pouvez probablement utiliser intelligemment la fonctionDebugBreak () .

1
répondu wil 2011-05-18 06:52:40

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.

0
répondu PRIME 2015-12-01 12:39:58