Подтвердить что ты не робот

Что такое точки останова данных?

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

Может кто-то проливает свет на то, какие точки останова данных, когда их использовать и как их использовать с VS?

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

Любые другие примеры?

4b9b3361

Ответ 1

Определение:

Контрольные точки данных позволяют когда значение, хранящееся на указанные изменения в памяти.

Из MSDN: Как установить точку останова данных:

Как установить точку останова памяти

  • В меню "Отладка" выберите "Новая точка останова" и нажмите "Новая точка останова данных"

    -или -

    в окне "Точки останова" выберите "Новое раскрывающееся меню" и выберите "Новая точка останова данных".

    Появится диалоговое окно New Breakpoint.

  • В поле "Адрес" введите адрес памяти или выражение, которое оценивает адрес памяти. Например, & foo для разрыва при изменении содержимого переменной foo.

  • В поле "Количество байтов" введите количество байтов, которое вы хотите отследить отладчика. Например, если вы введете 4, отладчик будет следить за четырьмя байтами, начинающимися с & foo и break, если какой-либо из этих байтов изменит значение.

  • Нажмите "ОК".

Ответ 2

Хороший ol Даниэль ЛеЧимант имеет солидный ответ о том, что делает точка останова данных, поэтому я буду бросать некоторые анекдоты, которые выделяют полезное использование:

Любой сценарий, в котором вы знаете, что изменится, но мало или совсем не знает, где меняется его код (поскольку в противном случае вы могли бы просто использовать условную точку останова). В частности,

"Невозможные" сценарии - программа сбой, потому что переменная X равна NULL, когда переменная X никогда не должна быть NULL, потому что нигде нигде не задается переменная X до NULL. Поместите обычную точку останова в код, который инициализирует X, и когда он попадает, настройте точку останова данных, чтобы посмотреть изменение на NULL. Несколько более распространенным является случай, когда память выпускается слишком рано, и все еще есть указатели на нее: используйте точки останова данных, чтобы узнать, кто освобождает память.

Сложные сценарии - сторонняя библиотека делает плохие, неприятные, ужасные вещи для ваших структур данных. Вы знаете, что это происходит, потому что кто-то уничтожает ваши данные и, очевидно, ваш код совершенен. Но вы не знаете, где и когда. Несомненно, вы могли бы выполнить один шаг через мегабайт дизассемблированной DLL... но зачем беспокоиться, когда вы можете установить точку останова данных на свои данные, откинуться на спинку и ждать, пока она будет повреждена!

Heisenbugs - похоже на невозможный сценарий, но они уходят, когда вы смотрите слишком близко, так что обычные точки останова - даже условные точки останова - бесполезны. Синхронизация и чувствительная к логике логика особенно уязвимы для такого рода вещей. Поскольку точки останова данных не требуют, чтобы отладчик фактически вообще разрывался до тех пор, пока время не будет правильным, если предположить, что вы можете найти место памяти, которое будет меняться только тогда, когда эта неуловимая ошибка действительно произойдет, вы можете использовать точки останова данных, чтобы установить ловушку для Heisenbug и поймать его на месте преступления.

Сценарии спагетти - распространены в старых, гнилых базовых кодах, где глобальные данные доступны повсюду. Да, вы могли бы использовать обычные условные точки останова... но вам понадобятся сотни из них. Контрольные точки данных облегчают работу.

Ответ 3

До сих пор мы получили отличное определение и кучу великих теоретических объяснений.

Приведем конкретный пример!

В настоящее время я работаю над довольно большой и запутанной базой кода. Я сделал небольшое безопасное изменение на один бит кода и начал получать - в полностью несвязанной части кода - сбои в распределителе памяти. Это, как правило, признак того, что вы делаете что-то очень неправильное с управлением памятью - либо с двойным удалением, либо с вычеркиванием за пределы.

К счастью, у нас есть возможность включить диспетчер памяти отладки, который проверяет такие вещи. Я включил его, и он сразу же начал сообщать о нарушении защиты блока памяти, что означает, что что-то вышло за рамки. Проблема в том, что этот отчет появляется только после освобождения памяти - по существу, говоря: "эй, что-то было сломано. Надеюсь, ты сможешь понять, что!"

К сожалению, этот конкретный кусок памяти, в момент освобождения, полностью неотличим от буквально тысяч других кусков памяти. К счастью, наши метки отладки основывают каждое выделение с последовательным идентификатором, а поврежденная память имеет согласованный идентификатор (# 9667, если вам интересно). Одна быстрая точка останова в менеджере памяти позже, и я смог найти, где это память была выделена. Который, как выяснилось, тоже не помог.

Но в этот момент у меня было несколько важных компонентов:

  • Я знал адрес блока памяти
  • Я знал предполагаемую длину этой памяти
  • Я знал, что в какой-то момент в будущем конкретный байт, предшествующий предполагаемой длине этой памяти, будет перезаписан.

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

Что я сделал - это привело к ошибке "за один", которую я сейчас исправляю.

И это конкретный пример того, как точки останова данных могут быть полезны.:)

Ответ 4

Я считаю, что точки останова данных - это точки останова, которые будут возникать, когда некоторая память установлена ​​на определенное значение. Например, вы можете установить точку останова, когда я == 10 в типичном для цикла остановке после 10-й итерации. Вы также можете следить за изменениями переменных в куче, например, ждать изменения члена класса.