2012-05-26 11 views
13

puedo obtener información acerca de un parámetro por StackTrace usar algo como esto:Cómo obtener valor de los parámetros en StackTrace

catch (Exception ex) 
{ 
    var st = new StackTrace(ex); 

    System.Reflection.ParameterInfo pi = st.GetFrame(0).GetMethod().GetParameters().First(); 
} 

Quiero saber cómo puedo obtener el valor del parámetro. Ejemplo:

Si mi método en el seguimiento de la pila era como:

void MyMethod(object value) 

Y la llamada era como:

MyMethod(10); 

Quiero obtener el valor 10. ¿Cómo puedo hacer eso?

+0

posible duplicado de [¿Es posible obtener los valores de los parámetros para cada cuadro en la pila de llamadas en .NET] (http://stackoverflow.com/questions/819576/is-it-possible-to-get-parameters- values-for-each-frame-in-call-stack-in-net) – nawfal

Respuesta

9

Hay dos formas. La más poderosa es la API COM para la Depuración de .NET. Por ejemplo, los argumentos y las variables locales de función en la pila de llamadas son accesibles desde ICorDebugILFrame. Pero esto debe ejecutarse desde un proceso separado que se adjunta a su proceso como el depurador.

Para la introspección en proceso, está el Profiler API, which also can find information about function arguments. Mire la información sobre "acumulaciones de sombras".

+0

fyi, su segundo enlace está muerto – Fredou

+1

@Fredou: Gracias por informarme, he actualizado el enlace a la nueva dirección de la información. –

+0

Ejemplo por favor! – Demodave

3

No con C#, excepto si está creando una solución altamente dependiente de la versión CLR (parche). Pero lo que hace el trabajo es unir WinDbg a su proceso, cargar sos.dll cambio a su hilo y escribir

!ClrStack -p 

para mostrar la pila de llamadas gestionadas y los parámetros del método para la mayoría de los métodos. Esto incluso bajo el depurador no es infalible porque debido a la incorporación y las optimizaciones de JIT, el diseño de la pila es muy flexible. Además de esto, es posible que algunos parámetros no aparezcan en la memoria de la pila porque se pasan a través de registros (lo que es aún más común en la plataforma x64).

Para responder a su primera pregunta. No, no es posible con el enfoque que estás intentando. Una solución de trabajo sería posible pero no portátil. Un depurador gestionado puede recuperar parcialmente sus argumentos, pero no hay una solución que funcione al 100% (incluso bajo el depurador).

Cuestiones relacionadas