Existe-t-il un moyen simple d’obtenir toutes les variables locales dans le cadre de stack actuel en C # (ou CIL)

Suite à ma question précédente, dans laquelle je voulais vider toutes les variables de la stack (de l’image actuelle et de l’image précédente) que vous pouvez voir ici: Existe – t-il un moyen d’examiner les variables de la stack à l’exécution en C #?

On m’a suggéré d’intercepter les appels manuellement ou d’utiliser un cadre AOP tel que PostSharp pour simplifier une telle tâche. J’ai examiné PostSharp et les arguments d’interception n’incluent pas les variables dans le cadre de stack actuel. Je me demande s’il existe un moyen simple d’obtenir automatiquement toutes les variables locales dans le cadre actuel de la stack. Je suppose que je peux effectuer une parsing de code et générer un code qui copie toutes ces valeurs dans une collection, mais il existe peut-être un mécanisme intégré qui le fait.

Merci d’avance pour toute suggestion.

EDIT: J’aurais dû donner plus de détails sur les raisons pour lesquelles je veux faire cela. Je veux pouvoir suspendre l’exécution au milieu d’une méthode. Si j’avais le contenu de la stack, je pourrais reprendre l’exécution plus tard, ou même la sérialiser et la continuer sur 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’parsing de code qui me permettrait de générer automatiquement du code supplémentaire qui enregistre cet état. Je pense que je devrai probablement parsingr le CIL pour le faire.

Vous devez utiliser l’API de débogage et déboguer votre programme à partir d’un autre processus. L’écriture de votre propre débogueur géré n’est pas sortingviale, mais au moins une manière prise en charge d’atteindre votre objective déclaré.

À ma connaissance, rien dans le cadre .Net géré ne peut être utilisé pour collecter des informations sur l’état d’exécution des variables locales d’une méthode.

Notez qu’il y a suffisamment de cas où les valeurs des variables locales n’existent pas pour rendre l’écriture de code général complexe afin de les gérer:

  • méthode peut être en ligne (les variables locales seront fusionnées avec les méthodes d’appel)
  • les variables locales peuvent être optimisées
  • la variable locale peut sortir de la scope et être ramassée avant la fin de la méthode.
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(); 

Envisagez d’ écrire des minidumps en utilisant un aspect PostSharp personnalisé (avec transformation IL ).

Bibliothèque de moteur de débogage partagée, écrite en C #. est disponible sur NuGet en tant que Microsoft.Samples.Debugging.MdbgEngine .

Le code est disponible sur GitHub dans le cadre du référentiel PADRE (Pluggable Automatic Debugging and Reporting Engine)