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#?
Répondre
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.
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. –
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. –
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.
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
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.
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
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.
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
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.
- 1. Comment tracer un NaN en C++
- 2. comment tracer un histogramme en c
- 3. tracer le diagramme variable pour un C# chaînée
- 4. Comment animer tracer une ligne en Javascript
- 5. C#: Comment construire une variable à partir d'une autre variable
- 6. Comment capturer une variable (C#)
- 7. Comment tracer tous les messages envoyés à une classe ou instance particulière en Objective-C?
- 8. Obtenir un IntPtr à une variable ulong en C#
- 9. Comment ajouter une variable membre à une interface dans C#
- 10. Passer une variable Javascript à Objective-C
- 11. Tracer une ligne courbe en Python Basemap
- 12. Comment tracer une exception de sécurité ASP.NET
- 13. Tracer graphique en utilisant .NET
- 14. Tracer une ligne à un angle spécifique en Java
- 15. Tracer une ligne parallèle
- 16. Arité variable en C?
- 17. Tracer une ligne blanche en opengl es
- 18. Tracer une ligne avec une flèche en Java
- 19. Comment tracer une ligne sur l'iPhone?
- 20. affecter la sortie de l'impression à une variable en python
- 21. Comment faire une variable "opérateur"? (C++)
- 22. Comment tracer une ligne dynamiquement dans vb6?
- 23. Comment accéder à une variable d'instance publique dans Objective C?
- 24. En comparant une variable à plusieurs valeurs
- 25. Comment accéder à la variable JS en C#
- 26. longueurs scanf/champ: en utilisant une variable/macro, C/C++
- 27. Comment réutiliser une variable de chaîne en C++
- 28. Comment créer un fichier avec une variable en C++?
- 29. comment je peux tracer une adresse IP en utilisant delphi
- 30. Comment tracer une figure de mon but en python?
Pourquoi le débogueur n'est-il pas une option? C'est exactement pour ça. –
@ 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
Comment écrire les valeurs de modification de la variable dans un fichier journal simple. – Shivam