2011-02-27 18 views
7

siguiendo mi pregunta anterior, en la que quería volcar todas las variables en la pila (de la corriente y todas las anteriores marco) que se puede ver aquí: Is there a way to examine the stack variables at runtime in C#?¿Hay una manera simple de obtener todas las variables locales en el marco de pila actual en C# (o CIL)

Me sugirieron interceptar las llamadas manualmente o utilizar el marco AOP como PostSharp para simplificar tal tarea. Miré PostSharp y los argumentos de interceptación no incluyen las variables en el marco de pila actual. Me pregunto si existe una forma simple de obtener automáticamente todas las variables locales en el marco de pila actual. Supongo que puedo realizar análisis de código y generar código que copie todos esos valores en una colección, pero tal vez haya un mecanismo incorporado que lo haga.

Gracias de antemano por cualquier sugerencia.

EDITAR: Debería haber dado más detalles de por qué quiero hacer esto. Quiero poder suspender la ejecución en medio de un método. Si tuviera el contenido de la pila podría reanudar la ejecución más tarde, o incluso serializarla y continuarla en otra máquina (suponiendo que es un código relativamente simple, por lo que no hay hilos o E/S, por ejemplo). Está bien ejecutar una herramienta de análisis de código que me permita generar automáticamente código adicional que guarde este estado. Creo que probablemente tendré que analizar el CIL para hacer esto.

+0

¿Qué necesita esto? –

+1

Buena suerte con tu objetivo. Recomiendo leer los detalles de la recolección de basura en .Net: sospecha de la ejecución del código administrado y manipula los datos de los métodos. (busque algo como "insde .net basura recolección" para iniciar) –

Respuesta

5

Debe usar la API de depuración y depurar su programa de otro proceso. Escribir su propio depurador administrado no es trivial, pero al menos es una manera de lograr su objetivo establecido.

Que yo sepa, no hay nada en el framwork .Net gestionado que pueda usar para recopilar información sobre el estado de ejecución de las variables locales de un método.

Tenga en cuenta que hay bastantes casos en los que no existen valores para las variables locales para hacer la escritura código general para manejarlos complejo:

  • método puede ser inline (variables locales se fusionarán con métodos de llamada)
  • las variables locales se pueden optimizar
  • variable local puede salir del alcance y ser basura recolectada antes de que finalice el método.
+0

Así que no va a ser sencillo, pero ahora tengo mucho en qué pensar. Gracias – cloudraven

5
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(); 
+0

no pudo encontrar la forma de mostrar los nombres o valores :( – JDPeckham

+1

Esto es una muestra de cómo ver las variables locales definidas en el IL de un método. No ayudará con comportamiento en tiempo de ejecución (valores/presencia) ni información no presente en nombres tipo IL. –

+0

Eso casi funciona, pero sí, definitivamente necesito los nombres de la variable – cloudraven

Cuestiones relacionadas