Перерыв при изменении значения с помощью отладчика Visual Studio

Есть ли способ разместить часы на переменной, и только если Visual Studio сломается при изменении этого значения?

Было бы намного легче найти сложные проблемы.

Можно ли это сделать?

Условия точки останова по-прежнему нуждаются в наборе точек останова, и я предпочел бы установить часы и позволить Visual Studio устанавливать точки останова при изменениях состояния.

Ответ 1

В меню Visual Studio 2005:

Отладка → Новая точка останова → Новая точка останова данных

Введите:

&myVariable

Ответ 2

Вы также можете явно отключить код:

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

Из MSDN:

Debugger.Break: Если отладчик не подключен, пользователи спросил, хотят ли они отладчик. Если да, отладчик начал. Если отладчик подключен, отладчик сигнализируется пользователем событие прерывания и отладчик приостанавливает выполнение процесса просто как если бы точка останова отладчика была удар.

Это только откат. Установка условной точки останова в Visual Studio, как описано в других комментариях, является лучшим выбором.

Ответ 3

Действительно старая почта, но в случае, если кто-то не знает...

В Visual Studio 2015 вы можете поместить точку останова на аксессуар set для объекта Auto-Implemented Property, и отладчик сломается при обновлении свойства

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

Обновление

В качестве альтернативы; @AbdulRaufMujahid указал в комментариях, что если свойство, реализованное автоматически, находится в одной строке, вы можете поместить курсор в get; или set; и нажать F9, и точка останова будет размещена соответственно. Ницца!

public bool IsUpdated { get; set; }

Ответ 4

Представьте, что у вас есть класс под названием A со следующим объявлением.

class A  
{  
    public:  
        A();

    private:
        int m_value;
};

Вы хотите, чтобы программа остановилась, когда кто-то изменил значение "m_value".

Перейдите к определению класса и поместите точку останова в конструкторе А.

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

Как только мы остановили программу:

Отладка → Новая точка останова → Новая точка останова данных...

Адрес: & (this- > m_value)
Количество байт: 4 (поскольку int имеет 4 байта)

Теперь мы можем возобновить программу. Отладчик остановится при изменении значения.

Вы можете сделать то же самое с унаследованными классами или составными классами.

class B
{
   private:
       A m_a;
};

Адрес: & (this- > m_a.m_value)

Если вы не знаете количество байтов переменной, которую хотите проверить, вы можете использовать оператор sizeof.

Например:

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

Если вы посмотрите на "стек вызовов", вы увидите функцию, которая изменила значение переменной.

Ответ 5

Измените переменную в свойство и добавьте точку останова в методе set. Пример:

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

    set { 
        m_var = value;
    }
}

Ответ 7

Если вы используете WPF, есть отличный инструмент: WPF Inspector.
Он присоединяется к приложению WPF и отображает полное дерево элементов управления со всеми свойствами, которое позволяет вам (среди прочего) ломаться на любое изменение свойств.

Но, к сожалению, я не нашел никакого инструмента, который позволил бы вам сделать то же самое с ANY свойством или переменной.

Ответ 8

Щелчок правой кнопкой мыши на точке останова отлично подходит для меня (хотя в основном я использую его для условных точек останова для определенных значений переменных. Даже нарушение выражений с использованием имени потока работает, что очень полезно, если вы пытаетесь выявить проблемы с потоками).

Ответ 9

Вы можете использовать точку наблюдения за памятью в неуправляемом коде. Не уверен, что они доступны в управляемом коде.

Ответ 10

Возможно, вы можете использовать умную функцию DebugBreak().

Ответ 11

Вы можете опционально перегрузить оператор = для переменной и поставить точку останова внутри перегруженной функции на конкретное условие.