c# .net exception stack-trace system.diagnostics

c# - Cómo obtener el valor de los parámetros en stacktrace



.net exception (2)

Puedo obtener información sobre un parámetro de StackTrace utilizando algo como esto:

catch (Exception ex) { var st = new StackTrace(ex); System.Reflection.ParameterInfo pi = st.GetFrame(0).GetMethod().GetParameters().First(); }

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

Si mi método en el seguimiento de la pila fuera así:

void MyMethod(object value)

Y la llamada fue como:

MyMethod(10);

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


No con C #, excepto si está creando una solución altamente dependiente de la versión CLR (parche). Pero lo que sí funciona es conectar Windbg a su proceso, cargar el modificador sos.dll a su hilo y escribir

!ClrStack -p

para mostrar la pila de llamadas administradas 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 las optimizaciones de JIT y de alineación, 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 tu 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).


Hay dos maneras. 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, existe la API de Profiler, que también puede encontrar información sobre los argumentos de la función . Mire la información sobre "acumulaciones de sombras".