Перервайтеся, коли значення змінюється за допомогою відладчика Visual Studio


198

Чи є спосіб розмістити годинник на змінній і перервати Visual Studio лише тоді, коли це значення зміниться?

Це значно полегшило б пошук складних державних проблем.

Чи можна це зробити?

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


але точка розриву не впливає ні на що, якщо умова не виконується, тому ви можете поставити свою точку розриву куди завгодно (наприклад, сеттер) і взяти її звідти. Або я щось пропускаю?
Оскар

6
Ну. це як vb6 спосіб налагодження. вам не байдуже місце розташування. просто додайте умовне вираження для перегляду вікна, і vb6 гарантуватиме, що воно порушиться там, де буде виконано умову ..
Gulzar Nazim

вибачте, ніколи не бачив шляху, наскільки я знаю, сеттер - це шлях?
Оскар

1
я сподівався знайти кращі новини; VS2010 вказує ніяких змін НЕ msdn.microsoft.com/en-us/library/350dyxd0.aspx тільки рідний C ++ має це @Scottgu ви можете зробити краще!
gerryLowry

Відповіді:


134

У меню Visual Studio 2005:

Налагодження -> Нова точка розриву -> Нова точка перерви даних

Введіть:

&myVariable

38
це доступно для керованого коду? Я бачу цю опцію вимкнено для проекту C #. Пам’ятайте, що десь читали це складну функцію, яку можна застосувати при налагодженні керованих програм, особливо із залученим смітником.
Гульзар Назим

27
Він доступний лише для керованого
Джош Кодрофф

17
Ви також можете тимчасово перетворити поле у ​​властивість і поставити точку перелому на геттер або сетер.
Джон Девіс

12
Параметр "Точка перерви даних" у розділі "Налагодження -> Нова точка перерви" відключений .. будь-яка ідея чому? Він залишається відключеним мокрим чи ні, я насправді налагоджую чи ні. Я використовую Visual Studio 2015.
jbb

2
Трохи пізно, але @jbb для мене це ввімкнено лише тоді, коли я зупиняюсь на точці перерви під час налагодження.
Allball103

27

Ви також можете вирішити чітко прорив у коді:

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

Від MSDN:

Debugger.Break: Якщо налагоджувач не додається, користувачів запитують, чи хочуть вони долучити налагоджувач. Якщо так, налагоджувач запускається. Якщо налагоджувач приєднаний, налагоджувач сигналізується про подію точки перерви користувача, і відладчик призупиняє виконання процесу так само, як ніби потрапила точка зламу налагоджувача.

Це, однак, лише резерв. Встановлення умовної точки перерви у Visual Studio, як описано в інших коментарях, є кращим вибором.


2
FWIW, редагуючи і продовжую, я вважаю за краще це робити так: IME, умовні точки прориву є slaooow
Марк Совул

Це працює - але це дуже боляче - я в кінцевому підсумку робив щось подібне - я ставив це у верхній частині кожного підозрюваного методу - і знову внизу (в остаточному підсумку) - таким чином я точно знав, який метод викликав проблему - (тобто я знав, що дані були хорошими до введення методу, а потім погані перед виходом з нього).
BrainSlugs83

26

Дійсно стара публікація, але якщо хтось не знає ...

У Visual Studio 2015 ви можете розмістити точку розриву на setаксесуарі власності, що реалізується автоматично, і налагоджувач буде зламаний, коли властивість буде оновлено

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

Оновлення

Альтернативно; @AbdulRaufMujahid вказував у коментарях, що якщо властивість, що реалізується автоматично, знаходиться на одній лінії, ви можете розташувати курсор на get;або set;і натиснути, F9і точка розриву буде розміщена відповідно. Приємно!

public bool IsUpdated { get; set; }

5
Навіть якщо властивість, реалізована автоматично, знаходиться в одному рядку, наприклад, публічний рядок UserName {set; дістати; }. Користувач може виділити геттер або сетер і може натиснути F9, щоб додати точку перерви
Абдул Рауф

@AbdulRaufMujahid Awesome!
Крейг

13

Уявіть, у вас є клас під назвою 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;
};

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

Якщо ви не знаєте кількість байтів змінної, яку ви хочете перевірити, ви можете скористатися оператором sizeof.

Наприклад:

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

Якщо ви подивитесь на "стек викликів", ви побачите функцію, яка змінила значення змінної.


1
Отже, що б ти точно робив, якщо те, що я шукаю, не на власних заняттях? Як, наприклад, я намагаюся з’ясувати, де саме керування ввімкнено чи вимкнено? Я можу додати годинник на значення Enabled (Увімкнено) під час налагодження, звичайно, але немає ніякого способу змусити його перерватися при зміні, а потім подивитися, де він зупинився.
Nyerguds

2
Якщо ви спробуєте налагодити зовнішню бібліотеку, вам знадобиться бібліотека, зібрана в режимі налагодження. Я не знайомий з компонентом, але, можливо, ви можете підключити "зворотний виклик" до власності та поставити точку зламу всередину. Форма, яку я описую, потребує адреси пам'яті, якщо ви не можете її знати, є пошук інших методів.
мамбоко

9

Змініть змінну у властивість та додайте точку розриву у встановленому методі. Приклад:

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

    set { 
        m_var = value;
    }
}

3

Якщо ви використовуєте WPF, є дивовижний інструмент: WPF Inspector .
Він приєднується до програми WPF і відображає повне дерево елементів керування з усіма властивостями, і дозволяє вам (серед іншого) перерватися на будь-яку зміну властивості.

Але, на жаль, я не знайшов інструменту, який дозволив би вам зробити те ж саме з будь-якою властивістю чи змінною.



2

Клацніть правою кнопкою миші на точці розриву для мене добре (хоча в основному я використовую її для умовних точок зупинки на конкретні змінні значення. Навіть розбиття на вирази, що містять ім’я теми, працює дуже корисно, якщо ви намагаєтеся визначити проблеми з потоком).


2

Як писав Пітер Мортенсен:

У меню Visual Studio 2005:

Налагодження -> Нова точка розриву -> Нова точка перерви даних

Введіть: & myVariable

Додаткова інформація:

Очевидно, система повинна знати, яку адресу в пам'яті слід спостерігати. Отже - встановіть нормальну точку розриву для ініціалізації myVariable(або myClass.m_Variable) - запустіть систему і почекайте, поки вона зупиниться на цій точці розриву. - Тепер увімкнено запис у меню, і ви можете спостерігати за змінною, ввівши &myVariable, або екземпляр, ввівши &myClass.m_Variable. Зараз адреси чітко визначені.

Вибачте, коли я зробив щось не так, пояснивши вже дане рішення. Але я не зміг додати коментар, і щодо цього були деякі коментарі.


1

Ви можете використовувати точку спостереження пам'яті в некерованому коді. Не впевнений, чи вони доступні в керованому коді.


1

Можливо, ви можете розумно використовувати функцію DebugBreak () .


Як саме? Запустивши окремий потік у тугий цикл і викликаючи DebugBreak () щоразу, коли відбулася зміна?
nalply

@nalpy Ви можете, наприклад, відстежувати місця, де myVariableвикористовується, і зберігати його значення після використання у допоміжній previousValueзмінній, а потім викликати DebugBreak (), коли myVariable!=previousValue; то ви б знали, між якими блоками коду myVariableзмінилися Але я згоден, що рішення Ашеллі найкраще.
витер

1

Ви можете необов'язково перевантажувати оператор = для змінної і може ставити точку розриву всередині перевантаженої функції на певний стан.


1

Оновлення в 2019 році:

Зараз це офіційно підтримується у Visual Studio 2019 Preview 2 для .Net Core 3.0 або новішої версії. Звичайно, можливо, вам доведеться вкласти деякі думки в потенційні ризики використання попередньої версії IDE. Я думаю, що найближчим часом це буде включено до офіційної Visual Studio.

https://blogs.msdn.microsoft.com/visualstudio/2019/02/12/break-when-value-changes-data-breakpoints-for-net-core-in-visual-studio-2019/

На щастя, точки переривання даних вже не є виключно C ++, оскільки вони тепер доступні для .NET Core (3.0 або вище) у Visual Studio 2019 Preview 2!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.