valor tipos referencia programacion por paso pasar pasaje parametros objetos datos como c# .net debugging reflection cil

c# - tipos - paso por valor y referencia en c



¿Cómo puedo obtener los valores actuales de los locales y los parámetros en la pila? (5)

En una aplicación .NET tengo algunos puntos en los que necesito recopilar información de depuración sobre el estado del hilo actual. Puedo obtener información del new StackTrace() constructor new StackTrace() . En particular, puedo obtener la lista de marcos de pila actuales, incluidos los objetos correspondientes de MethodInfo , que pueden proporcionarme el código IL, el número de variables y parámetros locales y los nombres de los parámetros.

¿Cómo puedo obtener los valores actuales de estos locales y parámetros (al menos de los tipos primitivos)?

No puedo adjuntar manualmente a ningún depurador a la aplicación, pero la aplicación puede generar nuevos procesos si es necesario.


¿Puede escribir los valores de sus variables en la consola o en un archivo de registro?

System.Diagnostics.Debug.WriteLine("Value of my variable: "+myvariable); Console.WriteLine("Value of my variable: "+myvariable);



La reflexión, lo que está utilizando para obtener MethodInfo y otros detalles, utiliza los metadatos creados en el momento de la compilación, es decir, los datos a los que está accediendo no tienen relación con los datos en tiempo de ejecución, que es lo que desea.

Mencionó que no puede usar un depurador y tiene razón, porque en el código de producción generalmente no hay símbolos de depuración cargados en su ensamblaje; un depurador sería inútil allí.

Una cosa importante aquí es que, según la arquitectura .NET, una vez que ejecuta un ensamblaje, se ejecuta un "jitter" y transforma su código IL en código nativo; El resultado es que lo que se carga en la memoria es un código de máquina puro en el que no se puede piratear fácilmente para obtener valores (aunque en teoría es posible ). Otro punto mencionado son las optimizaciones: mientras estén activadas, puede esperar que los métodos desaparezcan (se encuentren en línea ), el orden de ejecución se pueda cambiar y las variables se reemplacen por literales. El compilador hace muchas cosas para que tu código se ejecute más rápido.

Aunque no puedo ver una buena solución para obtener los valores de los locales en tiempo de ejecución, creo que hay maneras de obtener el valor de los parámetros mediante técnicas de intercepción. Eche un vistazo a lo que PostSharp puede hacer por usted.


Tendría que usar esto en el método involucrado, de modo que la inscripción no le impida ver lo que quiere ver.

MethodImplOptions.NoInlining

Por lo general, para otra información local, utiliza un registrador para un archivo de base de datos o un archivo plano o algo por el estilo.


Una excelente opción es utilizar Postsharp. Se basa en la Programación Orientada a Aspectos y la Inyección de Código. Se le permite tomar los valores de los parámetros en el método.

Tal vez pueda resolver parte de sus necesidades.