Прерывание при изменении значения с помощью отладчика Visual Studio - PullRequest
178 голосов
/ 02 октября 2008

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

Было бы намного проще найти сложные государственные проблемы.

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

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

Ответы [ 13 ]

120 голосов
/ 02 октября 2008

В меню Visual Studio 2005:

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

Введите:

&myVariable
27 голосов
/ 02 октября 2008

Вы также можете явно разбить код на код:

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

Из MSDN:

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

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

26 голосов
/ 17 июня 2016

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

В Visual Studio 2015 вы можете установить точку останова на элементе доступа set Автоматически реализуемого свойства, и отладчик остановится при обновлении свойства

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

Обновление

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

public bool IsUpdated { get; set; }
13 голосов
/ 05 марта 2011

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

class A  
{  
    public:  
        A();

    private:
        int m_value;
};

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

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

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* ); 

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

9 голосов
/ 04 сентября 2013

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

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

    set { 
        m_var = value;
    }
}
3 голосов
/ 17 ноября 2011

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

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

3 голосов
/ 02 октября 2008

Я помню, как вы описали это, используя Visual Basic 6.0 . В Visual Studio до сих пор я нашел единственный способ - указать условие точки останова .

2 голосов
/ 14 января 2019

Как писал Питер Мортенсен:

В меню Visual Studio 2005:

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

Введите: & myVariable

Дополнительная информация:

Очевидно, система должна знать, какой адрес в памяти смотреть. Так - установить нормальную точку останова для инициализации myVariable (или myClass.m_Variable) - запустите систему и дождитесь ее остановки в этой точке останова. - Теперь запись в меню включена, и вы можете посмотреть переменную, введя &myVariable, или экземпляр, введя &myClass.m_Variable. Теперь адреса четко определены.

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

2 голосов
/ 02 октября 2008

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

1 голос
/ 01 декабря 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...