¿Cómo puedo rastrear los valores de una variable a medida que cambian, en tiempo de ejecución, en C#? Me interesa la misma funcionalidad que proporciona el depurador cuando estoy rastreando una variable a través de los pasos de ejecución, solo que necesito invocarla desde mi código. Algún tipo de observación de valores-clave, pero para todo tipo de variables (locales, de clase, estáticas, etc.), no solo propiedades. Entonces, básicamente, recibe una notificación cuando cambia el valor de una variable.¿Cómo puedo rastrear una variable en tiempo de ejecución en C#?
Respuesta
Está trabajando bajo la suposición de que el depurador puede rastrear los cambios de variables. No puede.
Es posible con un código no administrado, el procesador tiene registros de depuración dedicados que permiten establecer puntos de interrupción de datos. Se proporcionan hasta tres. Genera una interrupción de hardware cuando ve una determinada ubicación de memoria que se escribe. Sin embargo, esta característica de lo contrario muy útil no está disponible en el código administrado. El recolector de basura es completamente incompatible con él, mueve objetos, dándoles otra dirección.
El depurador administrado admite una condición "cuando se golpea" en un punto de interrupción, lo que le permite volcar información en la ventana de salida. Sin embargo, eso requiere un punto de interrupción, no puede ser desencadenado por un cambio en el valor de la variable. También realmente ralentiza la ejecución del código ya que el depurador realmente entra en un estado de interrupción antes de ejecutar la condición.
El lugar obvio para poner un punto de interrupción así es en un establecimiento de propiedades. Que es lo que necesitarás para implementar esta característica en el código. Puedes hacer lo que quieras en ese setter, usando la clase Trace por ejemplo.
⁺¹ para la respuesta, sin embargo estoy un poco en desacuerdo con un punto de una gran ralentización de un punto de interrupción condicional simple. Como C# se convierte en un bytecode, la forma más adecuada para un depurador es simplemente crear e insertar un bytecode que imprima un valor en el lugar del valor. No veo una razón por la cual no podría hacerse de esta manera, y de ahí otra implementación de un punto de corte de depurador que llamaría un error de rendimiento. –
No, C# se convierte en código de máquina, IL es solo un paso intermedio. Use Depurar> Windows> Desensamblar para verlo. Característica, no es un error. –
La única manera sensata que podría hacer que sin el depurador sería: no utilizar una variable, pero el uso de una propiedad, y (tal vez de forma condicional) añadir traza para el colocador:
private int myValue;
public int MyValue {
get {return myValue;}
set {
SomeTraceMethod(myValue, value, ...);
myValue = value;
}
}
Obviamente, esto no se puede usar para arbitrariamente campos/variables.
¿Cómo lo hace el depurador para variables arbitrarias? ¿No hay una biblioteca de depuración que pueda ayudarme a lograr el mismo nivel de seguimiento? – luvieere
Para agregar a lo que dijo Marc, si desea hacer esto para un montón de propiedades y métodos, es posible que desee comprobar técnicas de programación orientadas a aspectos, y bibliotecas como PostSharp.
Como otros mencionan un mecanismo como que sólo tiene sentido cuando se utiliza propiedades. En .NET puede hacer uso de la interfaz INotifyPropertyChanged
.
Para una muestra de cómo implementarlo ver
Las conversaciones artículo de referencia de forma explícita sobre las formas de Windows, pero no están obligados a que (la interfaz se declara en realidad en el espacio de nombres System.ComponentModel
en System.dll). De hecho, esta interfaz se usa ampliamente para escenarios de enlace de datos, p. en WPF.
Mencioné en la pregunta que estoy interesado en variables arbitrarias, no en propiedades. Sé sobre INotifyPropertyChanged, lo que no sé es cómo rastrear variables arbitrarias, como lo hace el depurador. – luvieere
El depurador administrado utiliza la API COM ICorDebug
para casi todo. La parte que le interesa es ICorDebugValue
y sus descendientes. Tenga en cuenta que MUCHA cantidad de la API de depuración requiere que el proceso no se ejecute (es decir, haya encontrado un punto de interrupción) para que ocurran las diversas inspecciones.Una descripción general de alto nivel de ICorDebug
es here. La documentación es un poco escasa, pero algunos de Google pueden ayudar. Buena suerte.
- 1. Tiempo de ejecución variable de un programa en C
- 2. Usar una cadena como variable en tiempo de ejecución
- 3. ¿Es posible declarar una variable en C, cuyo nombre da el usuario en tiempo de ejecución?
- 4. burlarse en tiempo de ejecución en C?
- 5. Detecta modificación de variable en tiempo de ejecución en C/C++
- 6. variable de conjunto SSIS en tiempo de ejecución
- 7. C# Pass genéricos en tiempo de ejecución
- 8. ¿Cómo verificar el tipo de la variable en C en tiempo de ejecución?
- 9. ¿Convertir variable a tipo solo conocido en tiempo de ejecución?
- 10. ¿Cómo puedo encontrar el tiempo de ejecución de una sección de mi programa en C?
- 11. C++ modificar recursos en tiempo de ejecución
- 12. cómo rastrear llamada de función en C?
- 13. Mida el tiempo de ejecución en C#
- 14. ¿Cómo se define un objeto C# en tiempo de ejecución?
- 15. ¿Cómo puedo convertir tipos en tiempo de ejecución?
- 16. Recopilación en tiempo de ejecución y en tiempo de ejecución C#
- 17. ¿Puedo hacer una constante a partir de una variable env en tiempo de compilación en csharp?
- 18. ¿Cómo cargo una textura en XNA en tiempo de ejecución?
- 19. ¿Cómo puedo cargar un módulo Perl en tiempo de ejecución?
- 20. find C++ tiempo de ejecución
- 21. Cómo comprobar el tipo de variable en tiempo de ejecución en el lenguaje Ir
- 22. ¿Puedo crear una clase Objective-C en tiempo de ejecución desde un archivo de texto?
- 23. ¿Cómo puedo acceder a la variable de tiempo en modelica
- 24. ¿Cómo puedo agregar métodos a una clase en tiempo de ejecución en Smalltalk?
- 25. C# Parse string para escribir conocido en tiempo de ejecución
- 26. C# Método de anulación en tiempo de ejecución
- 27. Cómo rastrear un NaN en C++
- 28. ¿Cómo cambiar CurrentCulture en tiempo de ejecución?
- 29. ¿Cómo cambiar AndroidManifest en tiempo de ejecución?
- 30. "Inline" (tipo de) funciones en tiempo de ejecución en C
¿Por qué el depurador no es una opción? Para eso es exactamente. –
@ 0xA3 Porque necesito acceder a esos valores desde mi aplicación, en tiempo de ejecución, solo cuando cambian. – luvieere
¿Qué hay de escribir los valores de cambios de la variable en un archivo de registro simple. – Shivam