2009-02-05 35 views
5

Digamos que mi clase tiene una variable entera privada llamada conteo.¿Cómo puedo detener la ejecución en el Visual Studio Debugger cuando una variable miembro privada cambia de valor?

Ya he llegado a un punto de interrupción en mi código. Ahora, antes de presionar Continuar, quiero hacerlo para que el depurador se detenga cada vez que se le asigne un nuevo valor.

Además de promocionar el recuento de un campo y establecer un punto de interrupción en el método de configuración del campo, ¿hay alguna otra forma de hacerlo?

+0

¿Qué idioma? Puedes hacerlo si estás usando C++ no administrado. – ChrisW

+0

En mi caso, uso C#. –

Respuesta

3

Lo que está buscando no es posible en el código administrado. En C++ esto se conoce como punto de interrupción de datos. Le permite romper cada vez que un bloque de memoria es alterado por el programa en ejecución. Pero esto solo está disponible en el código nativo puro de C++.

Una versión corta de por qué esto no se implementa es que es mucho más difícil en el código administrado. El código nativo es agradable y predecible. Crea memoria y no se mueve a menos que cree un nuevo objeto (o copie memoria explícitamente).

El código administrado es mucho más complejo porque es un lenguaje basura. El CLR comúnmente mueve objetos en la memoria. Por lo tanto, simplemente mirando un poco de memoria no es lo suficientemente bueno. Requiere interacción de GC.

Este es solo uno de los problemas con la implementación de puntos de interrupción administrados.

+0

Comentario de Microsoft: http://connect.microsoft.com/VisualStudio/feedback/details/333647/data-breakpoints-in-managed-code –

0

Supongo que está intentando hacer esto porque quiere ver de dónde vino el cambio en el valor. Ya dijiste la forma en que siempre lo hice: crear una propiedad y romper el acceso del conjunto (excepto que debes usar ese acceso de configuración para que esto funcione).

Básicamente, yo diría que dado que un campo privado es solo de almacenamiento, no se puede romper porque el campo privado no es una instrucción que se puede romper.

0

La única forma en que puedo pensar hacer esto, es hacer clic derecho en la variable y seleccionar "Buscar todas las referencias". Una vez que encuentre todas las referencias, puede crear un nuevo punto de interrupción en cada punto del código donde a la variable se le asigna un valor. Es probable que esto funcione bastante bien, a menos que esté pasando la variable por referencia a otra función y cambiando el valor allí. En ese caso, necesitarías alguna forma de ver un punto específico en la memoria para ver cuándo cambió. No estoy seguro si tal herramienta existe en VS.

0

Me gusta ChrisW comento. Puede establecer un "Punto de interrupción de datos", pero solo para el código nativo (no administrado). El recolector de basura moverá los bloques de memoria asignados cuando se ejecute el recolector de elementos no utilizados. Por lo tanto, los puntos de interrupción de datos no son posibles para el código administrado.

De lo contrario, no. Debe encapsular el acceso a su artículo para el cual desea 'modificarlo'. Como ya es un miembro privado, sugiero seguir la sugerencia de Kibbee de establecer puntos de interrupción donde sea que se use.

0

Además de promover el recuento de un campo y establecer un punto de interrupción en el método de configuración del campo, ¿hay alguna otra forma de hacerlo?

Haz que sea una propiedad de una clase diferente, crea una instancia de la clase y establece un punto de interrupción en la propiedad.

En lugar de ...

test() 
{ 
    int i = 3; 
    ...etc... 
    i = 4; 
} 

... tienen ...

class Int 
{ 
    int m; 
    internal Int(int i) { m = i; } 
    internal val { set { m = value; } get { return m; } } 
} 

test() 
{ 
    Int i = new Int(3); 
    ...etc... 
    i.val = 4; 
} 

El caso es que, usando C#, la posición de memoria real de todo lo que se mueve continuamente; y por lo tanto, el depurador no puede usar fácilmente el registro de depuración de "interrupción en el acceso a la memoria" de la CPU, y es más fácil para el depurador, en cambio, implementar un punto de corte de ubicación de código.

Cuestiones relacionadas