Ответ 1
В меню Visual Studio 2005:
Отладка → Новая точка останова → Новая точка останова данных
Введите:
&myVariable
Есть ли способ разместить часы на переменной, и только если Visual Studio сломается при изменении этого значения?
Было бы намного легче найти сложные проблемы.
Можно ли это сделать?
Условия точки останова по-прежнему нуждаются в наборе точек останова, и я предпочел бы установить часы и позволить Visual Studio устанавливать точки останова при изменениях состояния.
В меню Visual Studio 2005:
Отладка → Новая точка останова → Новая точка останова данных
Введите:
&myVariable
Вы также можете явно отключить код:
// Assuming C#
if (condition)
{
System.Diagnostics.Debugger.Break();
}
Из MSDN:
Debugger.Break: Если отладчик не подключен, пользователи спросил, хотят ли они отладчик. Если да, отладчик начал. Если отладчик подключен, отладчик сигнализируется пользователем событие прерывания и отладчик приостанавливает выполнение процесса просто как если бы точка останова отладчика была удар.
Это только откат. Установка условной точки останова в Visual Studio, как описано в других комментариях, является лучшим выбором.
Действительно старая почта, но в случае, если кто-то не знает...
В 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; }
Представьте, что у вас есть класс под названием 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* );
Если вы посмотрите на "стек вызовов", вы увидите функцию, которая изменила значение переменной.
Измените переменную в свойство и добавьте точку останова в методе set. Пример:
private bool m_Var = false;
protected bool var
{
get {
return m_var;
}
set {
m_var = value;
}
}
Я помню, как вы описали его, используя Visual Basic 6.0. В Visual Studio единственным способом, который я нашел до сих пор, является указание условия точки останова.
Если вы используете WPF, есть отличный инструмент: WPF Inspector.
Он присоединяется к приложению WPF и отображает полное дерево элементов управления со всеми свойствами, которое позволяет вам (среди прочего) ломаться на любое изменение свойств.
Но, к сожалению, я не нашел никакого инструмента, который позволил бы вам сделать то же самое с ANY свойством или переменной.
Щелчок правой кнопкой мыши на точке останова отлично подходит для меня (хотя в основном я использую его для условных точек останова для определенных значений переменных. Даже нарушение выражений с использованием имени потока работает, что очень полезно, если вы пытаетесь выявить проблемы с потоками).
Вы можете использовать точку наблюдения за памятью в неуправляемом коде. Не уверен, что они доступны в управляемом коде.
Возможно, вы можете использовать умную функцию DebugBreak().
Вы можете опционально перегрузить оператор = для переменной и поставить точку останова внутри перегруженной функции на конкретное условие.