Точки останова. Использование числа попаданий, функций стека вызовов и условий для останова в любой момент и в любом месте отладчика Visual Studio
Точки останова можно устанавливать для строк исходного кода, инструкций ассемблера и функции в стеке вызовов. Можно указывать пороговое количество попаданий, местоположение выполнения и другие условия срабатывания точек останова. Можно выполнять печать в окно вывода с использованием точек трассировки. Возможно сохранение и импорт точек останова.
Описание
Create breakpoints that break when you want
Set a breakpoint at a source line, assembly instruction, or call stack function
Access the advanced functionality of breakpoints
Specify when a breakpoint breaks by hit count, expression evaluation, execution location, or data change
Print to the Output window with tracepoints
Manage breakpoints in the Breakpoints window
Troubleshoot breakpoints
Breakpoint Glyphs Reference
Создание точек останова, останавливающих выполнение тогда, когда это нужно
Стандартные точки останова, которые приостанавливают выполнение отладчика каждый раз при попадании в расположение исходного файла, являются одной из самых важных технологий отладки в арсенале разработчика. Visual Studio расширяет возможности стандартных точек останова, обеспечивая точное управление временем и местом их выполнения.
Можно установить точки останова, которые будут останавливать выполнение при возврате программы к функции в стеке вызовов, что позволит избежать многократного использования команды Шаг с выходом.
Если есть подозрение, что цикл в коде начинает неправильно вести себя после определенного числа итераций, можно установить точку останова для остановки выполнения после указанного числа попаданий в соответствующую строку кода, вместо того чтобы многократно нажимать клавишу F5 (Отладка, Продолжить) для достижения нужного уровня итерации.
Используя выражение в коде, можно указать точные условия, при которых точка останова должна прерывать выполнение.
Для управления состоянием и поведением большого числа точек останова можно использовать окно Точки останова. Тщательно выстроив последовательность точек останова для диагностирования некоторой распространенной или особо сложной проблемы, можно сохранить эту последовательность или предоставить ее для совместного использования с помощью команд импорта и экспорта в окне Точки останова.
Предупреждение
При отладке смешанного кода (машинного и управляемого) следует избегать установки точек останова на системных компонентах.Установка точки останова на системном компоненте при отладке смешанного кода может вызвать прерывание среды CLR и сбой отладчика.
Contents
Установка точки останова на строке исходного кода, инструкции ассемблера или функции в стеке вызовов
- Set a breakpoint in a source file • Set a breakpoint at a function return in the Call Stack window • Set a breakpoint at an assembly instruction in the Disassembly window
Установка точки останова в исходном файле
Существуют два следующих способа установки стандартной точки останова в окне исходного кода.
Дважды щелкните на переплете окна в строке, на которой требуется прервать выполнение.
-или-
Выделите строку и нажмите F9.
На переплете отобразится значок точки останова.
Визуальное отслеживание точек останова во время выполнения кода описано в разделе Сопоставление методов в визуализации стека вызовов при отладке в Visual Studio.
Set a breakpoint at a source line, assembly instruction, or call stack function
Contents
Установка точки останова на возврате функции в окне стека вызовов
Можно прервать выполнение на инструкции или строке, к которой возвращается вызывающая функция, установив соответствующую точку останова в окне Стек вызовов. Отладчик должен находиться в режиме приостановки выполнения.
Откройте окно Стек вызовов (сочетание клавиш: Ctrl + Alt + C) и выберите вызывающую функцию, на которой нужно прервать выполнение.
Выберите Точка останова, Вставить точку останова в контекстном меню или просто нажмите клавишу F9.
В левом поле рядом с именем вызова функции появится символ точки останова.
Если открыть окно Точки останова (сочетание клавиш: Ctrl + Alt + B), точка останова будет представлена как точка останова по адресу, где адрес памяти будет соответствовать следующей исполняемой инструкции в функции. Отладчик приостанавливает выполнение на этой инструкции.
Визуальное отслеживание точек останова во время выполнения кода описано в разделе Сопоставление методов в визуализации стека вызовов при отладке в Visual Studio.
Set a breakpoint at a source line, assembly instruction, or call stack function
Contents
Установка точки останова на инструкции ассемблера в окне дизассемблирования
Чтобы установить точку останова на инструкции ассемблера, отладчик должен находиться в режиме приостановки выполнения.
Откройте окно Дизассемблирование (сочетание клавиш: Ctrl + Alt + D).
Выполните одно из следующих действий.
Дважды щелкните на переплете окна в строке, на которой требуется прервать выполнение.
-или-
Выделите строку и нажмите F9.
Set a breakpoint at a source line, assembly instruction, or call stack function
Contents
Доступ к расширенным функциям точек останова
В окне исходного кода, окне Стек вызовов или окне Дизассемблирование откройте контекстное меню для точки останова и выберите свойство. В окне "Точки останова" выберите строку точки останова и откройте контекстное меню. Можно также задать некоторые условия непосредственно в столбце условий. |
Contents
Задание условия срабатывания точки останова: число попаданий, вычисление выражения, место выполнения или изменение данных
- Specify a hit count at which the breakpoint executes • Specify a breakpoint condition using a code expression • Specify the devices, processes, or threads that a breakpoint executes on • Set a data change breakpoint (native C++ only)
Задание количества попаданий, при котором срабатывает точка останова
При использовании количества попаданий отслеживается, сколько раз была пройдена точка останова. При этом задаются пороговое количество и условие срабатывания. Точка останова срабатывает, когда количество попаданий совпадает с пороговым значением, кратно этому значению либо больше или равно ему. Для задания порогового количества попаданий и условия срабатывания:
Откройте диалоговое окно Количество попаданий в точку останова.
В окне исходного кода, окне Дизассемблирование или окне Стек вызовов выберите строку, содержащую точку останова, а затем в контекстном меню последовательно выберите Точки останова и Число попаданий.
-или-
В окне Точки останова выберите строку точки останова, а затем в контекстном меню выберите пункт Число попаданий.
Выберите условие и введите количество попаданий.
Использование числа попаданий в качестве условия срабатывания может быть полезно, когда требуется прервать цикл через определенное число итераций. Кроме того, указав очень большое пороговое число попаданий, можно подсчитать количество прохождений через точку останова, не прерывая выполнение программы.
Указанное число попаданий сохраняется только для сеанса отладки. При завершении сеанса отладки число попаданий будет сброшено в ноль.
Specify when a breakpoint breaks by hit count, expression evaluation, execution location, or data change
Contents
Задание условия останова с помощью выражения кода
Условие точки останова представляет собой выражение, которое отладчик вычисляет при достижении точки останова. Если условие выполняется, отладчик приостанавливает выполнение.
Условие может быть любым допустимым выражением, которое распознает отладчик. Например, в банковской программе можно задать такое условие точки останова, как balance < 0. Дополнительные сведения о допустимых выражениях см. в разделе Выражения в отладчике.
Задание условия для точки останова
Откройте контекстное меню для точки останова и выберите Условие.
В диалоговом окне Условие для точки останова введите допустимое выражение в поле Условие.
Выберите значение Верно, если требуется прервать выполнение при истинности выражения, или выберите значение Изменилось, если требуется прервать выполнение при изменении значения выражения.
Отладчик не вычисляет выражение до тех пор, пока точка останова не будет достигнута в первый раз. Если выбрано условие Изменилось для машинного кода, отладчик не рассматривает первое вычисление условия как изменение, так что при первом вычислении выражения точка останова не сработает. Если условие Изменилось выбрано для управляемого кода, точка останова срабатывает при первом вычислении после выбора условия Изменилось.
Если условие точки останова имеет недопустимый синтаксис, немедленно появится предупреждающее сообщение. Если указать условие для точки останова с недопустимой семантикой, но допустимым синтаксисом, предупреждающее сообщение появится при достижении точки останова в первый раз. В любом случае, отладчик прерывает выполнение при попадании на недопустимую точку останова. Точка останова пропускается, только если условие допустимо и принимает значение FALSE.
Specify when a breakpoint breaks by hit count, expression evaluation, execution location, or data change
Contents
Задание устройств, процессов или потоков, в которых срабатывает точка останова
Откройте контекстное меню для точки останова и выберите команду Фильтр.
Укажите условие фильтрации в соответствии с категориями в диалоговом окне.
Specify when a breakpoint breaks by hit count, expression evaluation, execution location, or data change
Contents
Установка точки останова, действующей при изменении данных (только для машинного кода C++)
Точки останова для данных приостанавливают выполнение, когда записывается значение в указанную область памяти. Если производится только чтение значения, а запись не производится, выполнение программы не прерывается. Чтобы установить точку останова для данных, отладчик должен находиться в режиме приостановки выполнения.
В меню Отладка выберите команду Создать точку останова, а затем команду Создать точку останова в данных.
-или-
В меню окна Точки останова последовательно выберите команды Создать и Создать точку останова в данных.
В поле Адрес введите адрес в памяти или выражение, результатом вычисления которого будет адрес в памяти.
Например, для прерывания при изменении содержимого переменной avar введите &avar.
В поле Число байтов введите количество байт, за которыми должен наблюдать отладчик.
Например, при вводе 4 отладчик будет отслеживать четыре байта, начиная с &myFunction, и прерывать выполнение, если любой из этих байтов изменит значение.
Чтобы установить точку останова для данных, отладчик должен находиться в режиме приостановки выполнения.
Точки останова в данных не работают при следующих условиях:
Если запись по контролируемому адресу памяти выполняет процесс, который не отлаживается.
Если область памяти совместно используется несколькими процессами (двумя или больше).
Если область памяти обновляется в ядре. Например, если память передается в функцию ReadFile (Windows 32-разр. версии), память будет обновляться из режима ядра и отладчик не будет прерывать выполнение по записи в память.
Адреса переменных меняются в разных сеансах отладки. По этой причине точки останова для данных автоматически отключаются в конце каждого сеанса отладки.
Если установить точку останова для данных на локальную переменную, точка останова для данных остается включенной, когда функция заканчивается. Однако, адрес памяти, на который она установлена, имеет теперь другое значение. Таким образом, результаты такой точки останова непредсказуемы. Если установить точку останова для данных на локальную переменную, рекомендуется удалить или отключить точку останова до конца функции.
Visual Studio поддерживает не более четырех точек останова для данных на решение.
Specify when a breakpoint breaks by hit count, expression evaluation, execution location, or data change
Contents
Печать в окне вывода с использованием точек трассировки
Точки трассировки — это еще один способ использования точек останова. Точка трассировки — это точка останова, которая выводит сообщение в окно Вывод. Точка трассировки может играть роль временного оператора трассировки в языке программирования.
Чтобы печатать сообщение в существующей точке останова, откройте контекстное меню для точки останова и выберите команду При попадании.
Сообщение для печати задается в диалоговом окне При попадании в точку останова.
Задание сообщения
В сообщение можно добавлять программные данные, используя синтаксис DebuggerDisplayAttribute (см. описание атрибута DebuggerDisplayAttribute). Вот несколько примеров:
In function '{$FUNC}', on thread '{$TID}'
Used variable: {varName}, function name: {functionName($FUNC)}
Можно использовать любое из ключевых слов, отображаемых в диалоговом окне При попадании в точку останова. Кроме того, доступно еще два ключевых слова, не отображаемых в диалоговом окне: ключевое слово $TICK, которое вставляет текущее значение счетчика тактов ЦП, и ключевое слово $FILEPOS, которое вставляет текущую позицию в файле.
Задание поведения точки трассировки
Чтобы приостановить выполнение при достижении точки трассировки, снимите флажок Продолжить выполнение. Если флажок Продолжить выполнение установлен, выполнение не останавливается. В обоих случаях выводится сообщение.
Отключение точки трассировки
Чтобы временно отключить точку трассировки, снимите флажок Напечатать сообщение.
Contents
Управление точками останова в окне "Точки останова"
- Export and import breakpoints • Label breakpoints
Практически все функции установки, настройки и управления точками останова, предоставляемые в окне Точки останова, доступны непосредственно по месту расположения отдельных точек останова в окнах исходного кода, в окне Стек вызовов и окне Дизассемблирование. Однако окно Точки останова дает возможность централизованно управлять сразу всеми точками останова, что особенно удобно при работе с программой большого объема или в сложных сценариях отладки, где точки останова имеют принципиально важное значение. Кроме того, если требуется сохранить или предоставить другим пользователям состояние и расположение набора точек останова, функция сохранения файлов точек останова и их импорта доступна только в окне Точки останова.
Manage breakpoints in the Breakpoints window
Contents
Установка меток для точек останова
Метки точек останова используются только в окне Точки останова. Они служат для сортировки и фильтрации списка точек останова. Для добавления метки к точке останова выберите строку точки останова, затем в контекстном меню выберите команду Метка.
Устранение неполадок точек останова
- The debugger can't determine the source file for a breakpoint • The debugger can't locate the correct version of the source file for a breakpoint • Breakpoints don't work in a DLL
Отладчик не может определить исходный файл для точки останова
Если два или более исходных файлов в проекте имеют одинаковые имена, отладчику, возможно, будет сложно определить, в какой файл следует установить точку останова. Как правило, подобная ситуация возникает в случае, если создается модуль с таким же именем, что и у компонента подключаемой библиотеки отладчика.
Чтобы устранить эту проблему, выделите точку останова в окне исходного кода и выберите в контекстном меню пункт Расположение.
Введите полный путь к нужному файлу в окне Файл.
Troubleshoot breakpoints
Contents
Отладчик не может найти правильную версию исходного файла для точки останова
Если исходный файл изменился и исходный код больше не соответствует отлаживаемому коду, отладчик может найти исходный файл, который соответствует точке останова, даже если исходный файл существует.
Если требуется, чтобы в Visual Studio отображался исходный код, не соответствующий отлаживаемой версии, выберите Отладка, Параметры и настройки. На странице Отладка, Общие снимите флажок Использовать только исходный код, который точно совпадает с исходной версией.
Также можно выполнять привязку точки останова к исходному файлу. Выделите точку останова и в контекстном меню выберите команду Расположение. Установите флажок Разрешить наличие отличий в исходном коде от первоначальной версии в диалоговом окне Точка останова в файле.
Troubleshoot breakpoints
Contents
Точки останова не работают в библиотеке DLL
Невозможно установить точку останова в исходном файле, если отладчик не загрузил отладочную информацию для модуля, в котором находится код. Признаком такой ситуации может быть, например, сообщение Невозможно задать точку останова. На месте точки останова появляется глиф предупреждения о точке останова. Эти глифы предупреждений о точке останова, однако, становятся фактическими точками останова после загрузки кода.
Troubleshoot breakpoints
Contents
Справочник по глифам точек останова
Расположение точек останова отображается в окне исходного кода и в окне Дизассемблирование в поле слева с помощью символов, которые называются глифами. Эти глифы описываются в следующей таблице.
Если задержать указатель мыши на глифе точки останова, появится подсказка с подробными сведениями о ней. Эта информация особенно полезна для точек останова ошибок и предупреждений.
Глиф |
Описание |
---|---|
Обычная точка останова. Залитый цветом глиф указывает, что точка останова включена. Пустой глиф указывает, что она отключена. |
|
Улучшенная точка останова. Активная или отключенная. Знак "+" означает, что к точке останова подключена по крайней мере одна дополнительная возможность (например, условие, число попаданий или фильтр). |
|
Сопоставленная точка останова. Активная или отключенная. Точка останова установлена в коде ASP/ASP.NET и сопоставлена точке останова на соответствующей HTML-странице или установлена в серверном файле скрипта и сопоставлена соответствующему клиентскому файлу скрипта. |
|
Точка трассировки. Активная или отключенная. При попадании на эту точку выполняется указанное действие, но выполнение программы не прерывается. |
|
Улучшенная точка трассировки. Активная или отключенная. Знак "+" означает, что к точке трассировки подключена по крайней мере одна дополнительная возможность (например, условие, число попаданий или фильтр). |
|
Сопоставленная точка трассировки. Активная или отключенная. Точка трассировки установлена в коде ASP/ASP.NET и сопоставлена с точкой трассировки на соответствующей HTML-странице. |
|
Ошибка точки останова или точки трассировки. Знак "X" означает, что точка останова или точка трассировки не может быть установлена из-за условия ошибки. |
|
Предупреждение точки останова или точки трассировки. Восклицательный знак указывает, что точка останова или точка трассировки не может быть установлена из-за временного условия. Обычно это означает, что не был загружен код, расположенный по месту установки точки останова или точки трассировки. Кроме того, это может означать, что при присоединении к процессу не удалось загрузить символы для этого процесса. При загрузке кода или символов точка останова будет включена и глиф изменится. |
Contents
См. также
Основные понятия
Запуск, приостановка, шаг, последовательное выполнение и остановка отладки в Visual Studio