Romper cuando un valor cambia con el depurador de Visual Studio


¿Hay alguna forma de colocar un reloj en una variable y solo tener un descanso de Visual Studio cuando ese valor cambia?

Sería mucho más fácil encontrar problemas de estado difíciles.

Se Puede hacer esto?

Las condiciones de punto de interrupción todavía necesitan un conjunto de puntos de interrupción, y prefiero establecer un reloj y dejar que Visual Studio establezca los puntos de interrupción en los cambios de estado.

Author: Peter Mortensen, 2008-10-02

11 answers

En el menú de Visual Studio 2005:

Depurar -> Nuevo Punto de Interrupción -> Nuevo punto de interrupción de datos

Enter:

&myVariable
 108
Author: AShelly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-08 14:57:59

También puede optar por romper explícitamente en el código:

// Assuming C#
if (condition)
{
    System.Diagnostics.Debugger.Break();
}

De MSDN:

Depurador.Romper: Si no hay depurador conectado, los usuarios son se les preguntó si quieren adjuntar un depurador. En caso afirmativo, el depurador es comenzar. Si se adjunta un depurador, el depurador se indica con un usuario evento de punto de interrupción, y el depurador suspende la ejecución del proceso solo como si un punto de interrupción del depurador hubiera sido golpear.

Esto es solo una alternativa, sin embargo. Configuración de una el punto de interrupción condicional en Visual Studio, como se describe en otros comentarios, es una mejor opción.

 25
Author: Michael Petrotta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-08 14:59:21

Post muy antiguo, pero en caso de que alguien no lo sepa...

En Visual Studio 2015 , puede colocar un punto de interrupción en el set accessor de una Propiedad Auto-Implementada y el depurador se romperá cuando la propiedad se actualice

public bool IsUpdated
{
    get;
    set;    //set breakpoint on this line
}

Actualización

Alternativamente; @AbdulRaufMujahid ha señalado en los comentarios que si la propiedad auto implementada está en una sola línea, puede colocar el cursor en get; o set; y golpear F9 y un punto de interrupción se colocará en consecuencia. ¡Bonito!

public bool IsUpdated { get; set; }
 21
Author: Craig,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-15 13:28:09

Imagine que tiene una clase llamada A con la siguiente declaración.

class A  
{  
    public:  
        A();

    private:
        int m_value;
};

Desea que el programa se detenga cuando alguien modifique el valor de "m_value".

Vaya a la definición de clase y ponga un punto de interrupción en el constructor de A.

A::A()
{
    ... // set breakpoint here
}

Una vez que detuvimos el programa:

Debug -> Nuevo Punto de interrupción -> Nuevo Punto de interrupción de Datos ...

Dirección: & (this->m_value)
Cuenta de bytes: 4 (Porque int tiene 4 bytes)

Ahora, podemos reanudar el programa. Depurador se detendrá cuando se cambie el valor.

Puede hacer lo mismo con clases heredadas o clases compuestas.

class B
{
   private:
       A m_a;
};

Dirección: & (this->m_a.m_value)

Si no conoce el número de bytes de la variable que desea inspeccionar, puede usar el operador sizeof.

Por ejemplo:

// to know the size of the word processor,  
// if you want to inspect a pointer.
int wordTam = sizeof (void* ); 

Si nos fijamos en la "pila de llamadas" se puede ver la función que cambió el valor de la variable.

 11
Author: momboco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-06 12:04:19

Cambie la variable a una propiedad y agregue un punto de interrupción en el método set. Ejemplo:

private bool m_Var = false;
protected bool var
{
    get { 
        return m_var;
    }

    set { 
        m_var = value;
    }
}
 9
Author: Marcello,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-08 15:01:47

Si está utilizando WPF, hay una herramienta impresionante : WPF Inspector.
Se adhiere a una aplicación WPF y muestra el árbol completo de controles con todas las propiedades, y le permite (entre otras cosas) romper en cualquier cambio de propiedad.

Pero lamentablemente no he encontrado ninguna herramienta que le permita hacer lo mismo con cualquier propiedad o variable.

 3
Author: Julien N,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-17 17:14:53

Recuerdo la forma en que lo describiste usando Visual Basic 6.0. En Visual Studio, la única forma que he encontrado hasta ahora es especificando una condición de punto de interrupción .

 3
Author: Gulzar Nazim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-15 15:11:25

Hacer clic derecho en el punto de interrupción funciona bien para mí (aunque principalmente lo estoy usando para puntos de interrupción condicionales en valores de variables específicas. Incluso romper en expresiones que involucran un nombre de hilo funciona, lo que es muy útil si estás tratando de detectar problemas de subproceso).

 2
Author: Oskar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-15 15:09:10

Puede usar un punto de vigilancia de memoria en código no administrado. Sin embargo, no estoy seguro de si están disponibles en código administrado.

 1
Author: 1800 INFORMATION,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-01 22:38:20

Probablemente puedas hacer un uso inteligente de la función DebugBreak().

 1
Author: wil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-18 06:52:40

Opcionalmente puede sobrecargar el operador = para la variable y puede colocar el punto de interrupción dentro de la función sobrecargada en una condición específica.

 0
Author: PRIME,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-01 12:39:58