Après ma question précédente, je voulais jeter toutes les variables de la pile (à partir du cadre actuel et de la trame précédente) qui peut être vue ici: Existe-t-il un moyen d'examiner les variables de pile au moment de l'exécution en C #? p>
On m'a suggéré d'intercepter les appels manuellement ou d'utiliser un cadre AOP comme PostSharp pour simplifier une telle tâche. J'ai regardé PostSharp et les arguments d'interception n'incluent pas les variables dans le cadre de pile actuel. Je me demande s'il existe un moyen simple d'obtenir automatiquement toutes les variables locales dans le cadre de pile actuel. Je suppose que je peux effectuer une analyse de code et générer du code qui copie toutes ces valeurs dans une collection, mais il existe peut-être un mécanisme intégré qui le fait. P>
Merci d'avance pour toute suggestion. P>
Edit: J'aurais dû donner plus de détails sur la raison pour laquelle je veux faire cela. Je veux être capable de suspendre l'exécution au milieu d'une méthode. Si j'avais le contenu de la pile, je pourrais reprendre l'exécution plus tard, ou même le sérialiser et le poursuivre dans une autre machine (en supposant qu'il s'agisse d'un code relativement simple, donc pas de threads ou d'E / S par exemple). Il est correct d'exécuter un outil d'analyse de code qui me permettrait de générer automatiquement un code supplémentaire qui enregistre cet état. Je pense que je devrai probablement analyser la CIL pour faire cela. P>
3 Réponses :
System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(); System.Diagnostics.StackFrame frame = trace.GetFrame(0); MethodBase method = frame.GetMethod(); MethodBody methodBody = method.GetMethodBody(); if (methodBody != null) { foreach (var local in methodBody.LocalVariables) { Console.WriteLine(local); } } Console.ReadKey();
Ceci échange comment voir les variables locales définies dans une méthode IL. Cela ne vous aidera pas avec le comportement d'exécution (valeurs / présence) ni les informations non présentes dans les noms d'IL.
Cela fonctionne presque, mais oui, j'ai certainement besoin des noms de la variable
Pour obtenir les noms, vous devriez écrire du code pour les consulter dans les fichiers .pdb si elles sont disponibles ... et ce n'est pas facile.
Vous devez utiliser API de débogage et déboguer votre programme d'un autre processus. Écrire votre propre débogueur géré n'est pas trivial, mais au moins soutenu la manière de réaliser votre objectif déclaré. P>
À ma connaissance, il n'y a rien dans géré .NET FRAMWork que vous pouvez utiliser pour collecter des informations sur l'état d'exécution des variables locales d'une méthode. p>
Notez qu'il existe suffisamment de cas lorsque des valeurs pour les variables locales n'existent pas pour rendre la rédaction de code général pour les gérer complexe: p>
Cela ne va donc pas être simple, mais maintenant j'ai beaucoup à penser. Merci
considérer à écrire des miniduques en utilisant aspect postal personnalisé (avec la transformation de l'IL ). p>
Une bibliothèque de moteur de débogage partagée, écrite en C #. est disponible sur Nuget comme microsoft.samples.debugging.mdbgengine . P>
Le code est disponible sur GITHUB dans le cadre de la Rel="nofollow"> PADRE (Moteur de débogage automatique et de rapport de reporting) PADRE p>
Bonne chance avec votre objectif. Je recommanderais de lire sur les détails de la collection de la poubelle dans .NET - SUSPSEND EXÉCUTION DU CODE GÉRÉE ET MANIPULATION AVEC DES DONNÉES DES MÉTHODES. (Recherchez quelque chose comme "la collection d'ordures INSDE .NET" pour démarrer)