Что такое точки останова данных? - PullRequest
24 голосов
/ 07 марта 2009

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

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

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

Есть еще примеры?

Ответы [ 4 ]

56 голосов
/ 07 марта 2009

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

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

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

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

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

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

28 голосов
/ 07 марта 2009

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

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

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

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

  1. В меню отладки выберите New Breakpoint и нажмите New Data Breakpoint

    -или-

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

    Появляется диалоговое окно «Новая точка останова».

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

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

  4. Нажмите ОК.

3 голосов
/ 18 октября 2013

Пока у нас есть отличное определение и куча замечательных теоретических объяснений.

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

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

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

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

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

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

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

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

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

0 голосов
/ 07 марта 2009

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

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