2010-05-26 6 views
5

Comment puis-je suivre les valeurs d'une variable à mesure qu'elles changent, au moment de l'exécution, en C#? Je suis intéressé par la même fonctionnalité que le débogueur fournit lorsque je trace une variable à travers les étapes d'exécution, seulement que j'ai besoin de faire appel à partir de mon code. Une sorte d'observation des valeurs-clés, mais pour toutes sortes de variables (locales, class, statiques, etc.), pas seulement les propriétés. Donc, fondamentalement, recevoir une notification quand la valeur d'une variable change.Comment puis-je tracer une variable à l'exécution en C#?

+0

Pourquoi le débogueur n'est-il pas une option? C'est exactement pour ça. –

+0

@ 0xA3 Parce que j'ai besoin d'accéder à ces valeurs à partir de mon application, lors de l'exécution, uniquement lorsqu'elles changent. – luvieere

+0

Comment écrire les valeurs de modification de la variable dans un fichier journal simple. – Shivam

Répondre

3

Vous travaillez à partir de l'hypothèse que le débogueur peut suivre les modifications variables. Ça ne peut pas.

Il est possible avec le code non géré, le processeur a dédié registres de débogage qui permettent un réglage des points d'arrêt de données. Jusqu'à trois sont fournis. Il génère une interruption matérielle lorsqu'il voit un emplacement de mémoire particulier s'écrire. Cette fonctionnalité par ailleurs très utile n'est pas disponible dans le code managé. Le garbage collector est complètement incompatible avec cela, il déplace les objets autour, leur donnant une autre adresse.

Le débogueur géré prend en charge un « lorsqu'il est frappé » condition sur un point d'arrêt, vous permettant de dumper informations à la fenêtre de sortie. Cela nécessite cependant un point de rupture, il ne peut pas être déclenché par une modification de la valeur de la variable. Il réellement ralentit l'exécution de code puisque le débogueur entre réellement un état de rupture avant d'exécuter la condition.

L'endroit évident pour mettre un tel point d'arrêt est dans un setter de propriété. C'est ce dont vous aurez besoin pour implémenter cette fonctionnalité dans le code. Vous pouvez faire tout ce que vous voulez dans ce setter, en utilisant la classe Trace par exemple.

+0

for¹ pour la réponse, je suis cependant un peu en désaccord avec un point d'un grand ralentissement d'un simple point de rupture conditionnel. Puisque C# est converti en un bytecode, le moyen le plus approprié pour un débogueur est juste de créer et d'insérer un bytecode qui imprime une valeur à la place de la valeur. Je ne vois pas une raison pour laquelle cela ne pourrait pas être fait de cette façon - et donc une autre implémentation d'un point d'arrêt du débogueur que j'appellerais un bug de performance. –

+2

Non, C# est converti en code machine, IL n'est qu'une étape intermédiaire. Utilisez Debug> Windows> Disassembly pour le voir. Feature, pas un bug. –

0

La seule façon raisonnable, vous pouvez le faire sans le débogueur serait: ne pas utiliser une variable, mais utiliser une propriété, et (peut-être conditionnellement) ajouter trace au poseur:

private int myValue; 
public int MyValue { 
    get {return myValue;} 
    set { 
     SomeTraceMethod(myValue, value, ...); 
     myValue = value; 
    } 
} 

Évidemment, cela ne peut pas être utilisé pour arbitraires champs/variables.

+0

Comment le débogueur le fait-il pour des variables arbitraires? N'y a-t-il pas une bibliothèque de débogage qui pourrait m'aider à atteindre le même niveau de suivi? – luvieere

3

Pour ajouter à ce que Marc a dit, si vous voulez faire cela pour beaucoup de propriétés et méthodes que vous pourriez vouloir vérifier les techniques de programmation orientée aspect, et les bibliothèques telles que PostSharp.

http://www.sharpcrafters.com/postsharp

0

Comme d'autres ont mentionné un mécanisme comme ça n'a de sens que lors de l'utilisation des propriétés. Dans .NET, vous pouvez ensuite utiliser l'interface INotifyPropertyChanged.

Pour un échantillon comment l'implémenter voir

How to: Implement the INotifyPropertyChanged Interface

Les pourparlers de l'article fait référence explicitement sur Windows Forms, mais vous n'êtes pas lié à celui (l'interface est effectivement déclarée l'espace de noms System.ComponentModel dans System.dll). En fait, cette interface est largement utilisée pour des scénarios de liaison de données, par ex. dans WPF.

+0

J'ai mentionné dans la question que je m'intéresse aux variables arbitraires, pas aux propriétés. Je connais INotifyPropertyChanged, ce que je ne sais pas c'est comment tracer des variables arbitraires, comme le fait le débogueur. – luvieere

1

Le débogueur géré utilise l'API COM ICorDebug pour à peu près tout. La partie qui vous intéresse est ICorDebugValue et ses descendants. Notez qu'un LOT de l'API de débogage nécessite que le processus ne soit pas en cours d'exécution (c'est-à-dire qu'il ait rencontré un point d'arrêt) pour que les différentes inspections puissent avoir lieu.Un aperçu général de ICorDebug est here. La documentation à ce sujet est assez rare, mais certains Google peuvent aider. Bonne chance.

Questions connexes