210 votes

Interruption lorsqu'une valeur change à l'aide du débogueur de Visual Studio

Existe-t-il un moyen de placer une surveillance sur une variable et de faire en sorte que Visual Studio ne s'arrête que lorsque cette valeur change ?

Il serait tellement plus facile de trouver les questions délicates de l'État.

Cela peut-il être fait ?

Les conditions de point d'arrêt nécessitent toujours la définition d'un point d'arrêt, et je préfère définir une veille et laisser Visual Studio définir les points d'arrêt lors des changements d'état.

0 votes

Mais le point d'arrêt n'affecte rien tant que la condition n'est pas remplie, donc vous pouvez placer votre point d'arrêt n'importe où (comme le Setter) et le prendre à partir de là. Ou est-ce que quelque chose m'échappe ?

6 votes

Eh bien, c'est comme la façon vb6 de déboguer. vous ne vous souciez pas de l'emplacement du point d'arrêt. il suffit d'ajouter une expression conditionnelle à la fenêtre de surveillance et vb6 garantira qu'elle s'arrêtera dès que la condition sera remplie

0 votes

Désolé, je n'ai jamais vu de moyen, pour autant que je sache, le setter est la solution.

138voto

AShelly Points 17389

Dans le menu Visual Studio 2005 :

Déboguer -> Nouveau point de rupture -> Nouveau point d'arrêt des données

Entrez :

&myVariable

38 votes

Cette option est-elle disponible pour le code géré ? Je vois que cette option est désactivée pour les projets C#. Je me souviens avoir lu quelque part que c'est une fonctionnalité difficile à mettre en œuvre dans le débogage des applications gérées, en particulier avec le garbage collector impliqué.

27 votes

Il n'est disponible que pour le code non géré, malheureusement : msdn.microsoft.com/fr/us/library/350dyxd0.aspx

1 votes

Je pense que vous avez toujours besoin de mettre un point d'arrêt si vos données ne sont pas globales. VS remplace le &var par l'adresse mémoire, il ne se souvient pas d'une exécution à l'autre que vous souhaitez arrêter sur cette variable.

28voto

Michael Petrotta Points 35647

Vous pouvez également choisir de faire une rupture explicite 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é aux utilisateurs s'ils veulent attacher un débogueur. Si oui, le débogueur est lancé. Si un débogueur est attaché, le débogueur est signalé par un signal utilisateur point d'arrêt utilisateur, et le débogueur suspend l'exécution du processus comme si processus comme si un point d'arrêt du débogueur avait été touché.

Il ne s'agit cependant que d'une solution de repli. La définition d'un point d'arrêt conditionnel dans Visual Studio, comme décrit dans d'autres commentaires, est un meilleur choix.

2 votes

Pour information, avec edit et continue, je préfère procéder de cette façon : IME, les points d'arrêt conditionnels sont trop lents.

0 votes

Cela fonctionne - mais c'est très pénible - j'ai fini par faire quelque chose de similaire - j'ai mis cela au début de chaque méthode que je soupçonnais - et à nouveau à la fin (dans une clause finale) - de cette façon, je savais exactement quelle méthode causait le problème - (c'est-à-dire que je savais que les données étaient bonnes avant d'entrer dans la méthode, puis mauvaises avant de la quitter).

13voto

momboco Points 566

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 lorsque quelqu'un modifie la valeur de "m_valeur".

Allez dans 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 -> New Breakpoint -> New Data Breakpoint ...

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êtera lorsque la valeur sera modifiée.

Vous pouvez faire de même 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 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.

1 votes

Alors, que feriez-vous exactement si la chose que je cherche n'est pas dans mes propres classes ? Par exemple, si j'essaie de savoir exactement où un contrôle est activé ou désactivé ? Je peux ajouter une surveillance sur la valeur Enabled du contrôle pendant le débogage, bien sûr, mais il n'y a aucun moyen de faire en sorte qu'elle s'arrête lors d'un changement et de regarder ensuite où elle s'est arrêtée.

2 votes

Si vous essayez de déboguer une bibliothèque externe, vous aurez besoin de la bibliothèque compilée en mode débogage. Je ne suis pas familier avec les composants, mais vous pouvez peut-être connecter un "callback" à la propriété et y placer un point d'arrêt. Le formulaire que je décris a besoin de l'adresse mémoire, si vous n'avez aucun moyen de la connaître, il faut chercher d'autres méthodes.

9voto

Marcello Points 11

Changez la variable en 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;
    }
}

3voto

Gulzar Nazim Points 35342

Je me souviens de la façon dont tu l'as 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 un fichier condition de point d'arrêt .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X