Использование правильного типа точки останова
В этой статье показано, как использовать различные типы точек останова в Visual Studio для повышения эффективности отладки. В нем рассматриваются различные сценарии, в которых можно применять точки останова, такие как приостановка выполнения кода, ведение журнала и отслеживание изменений в состояниях переменных. В этой статье объясняется, как задать условные точки останова, точки трассировки, точки останова данных, зависимые точки останова и временные точки останова. Она также содержит подробные инструкции по настройке точек останова функций. Это руководство важно для разработчиков, желающих использовать точки останова для эффективной отладки в Visual Studio.
Если вы не знакомы с точками останова в Visual Studio, прочитайте Познакомьтесь с точками останова перед тем, как перейти к этой статье.
Для лучшего взаимодействия с этой документацией выберите предпочитаемый язык разработки или среду выполнения из списка в верхней части статьи.
Сценарии
В следующей таблице показаны распространенные сценарии отладки для точек останова и рекомендуемый тип точки останова для сценария.
Сценарий | Описание |
---|---|
Как приостановить выполнение кода для проверки строки кода, которая может содержать ошибку? | Задайте точку останова. Дополнительные сведения см. в статье Начало работы с точками останова. |
Имеет ли переменная непредвиденное значение? Или же я хочу проверить приложение, когда оно достигает определенного состояния? | Попробуйте использовать условную точку останова, чтобы контролировать, где и когда точка останова активируется с помощью условной логики. Щелкните правой кнопкой мыши по точке останова, чтобы добавить условие. Задайте условие true, если переменная равна неожиданному значению. Дополнительные сведения см. в условиях точки останова. |
Как регистрировать информацию в окне вывода при настраиваемых условиях, не изменяя и не останавливая код? | Точки трассировки позволяют регистрировать сведения в окне вывода при настраиваемых условиях без изменения или остановки кода. Дополнительные сведения см. в разделе Использование точек трассировки в отладчикеVisual Studio. |
Как узнать, когда изменяется значение переменной? | Для C++ задайте точку останова данных . Для приложений с помощью .NET Core 3 и более поздних версий можно также задать точку останова данных. В противном случае только для C# и F# можно отслеживать идентификатор объекта с помощью условной точки останова. |
Как прервать выполнение только в том случае, если достигнута другая точка останова? | Установите зависимую точку останова, которая прерывает выполнение только в том случае, если сначала срабатывает другой точка останова. Дополнительные сведения см. в разделе Зависимые точки останова. |
Можно ли попасть в точку останова только один раз? | Установите временную точку останова, которая позволяет разорвать код только один раз. Дополнительные сведения см. во временной точке останова . |
Можно ли приостановить код внутри цикла при определенной итерации? | Установите зависимую точку останова, которая прерывает выполнение только тогда, когда сначала сработает другая точка останова. Дополнительные сведения см. в разделе счетчик попаданий. |
Можно ли приостановить код в начале функции, когда я знаю имя функции, но не его расположение? | Это можно сделать с помощью точки останова функции. Дополнительные сведения см. в разделе Установка точек останова функций. |
Можно ли приостановить код в начале нескольких функций с одинаковым именем? | При наличии нескольких функций с одинаковым именем (перегруженные функции или функции в разных проектах) можно использовать точку останова функции. |
Действия точек останова и точки трассировки
Точка трассировки — это точка останова, которая выводит сообщение в окно выходных данных. Точка трассировки может выступать как временная инструкция трассировки на языке программирования и не приостанавливает выполнение кода. Вы создаете точку трассировки, задав специальное действие в окне параметров точки останова. Подробные инструкции см. в разделе "Использование точек трассировки в отладчике Visual Studio".
Условия точки останова
Вы можете контролировать, когда и где выполняется точка останова, задав условия. Условие может быть любым допустимым выражением, распознаваемое отладчиком. (Дополнительные сведения о допустимых выражениях см. в разделе Выражения в отладчике.)
Установить условие точки останова:
Щелкните правой кнопкой мыши символ точки останова и выберите Условия (или нажмите клавиши Alt + F9, C). Или наведите указатель мыши на символ точки останова, щелкните значок параметров , а затем выберите условия в окне параметров точки останова .
Вы также можете щелкнуть правой кнопкой мыши в крайнем левом поле рядом с строкой кода и выбрать Вставить условную точку останова в контекстном меню, чтобы установить новую условную точку останова.
Вы также можете задать условия в окне точек останова, щелкнув правой кнопкой мыши точку останова и выбрав настройки, а затем выберите Условия.
точки останова
В раскрывающемся списке выберите условное выражение, счетчик попаданийили фильтри задайте соответствующее значение.
Нажмите кнопку Закрыть или нажмите клавиши CTRL+ВВОД, чтобы закрыть окно параметров точки останова. Или в окне точек останова выберите ОК, чтобы закрыть диалог.
Точки останова с условиями отображаются с символом + в исходном коде и в окнах Точек остановки.
Создание условного выражения
При выборе условного выражения , можно выбрать два условия: Истина или Когда изменяется. Выберите Истина, чтобы прервать выполнение, если выражение удовлетворено, или При изменении, чтобы прервать, когда изменяется значение выражения.
В следующем примере точка останова достигается только в том случае, если значение testInt
равно 4:
В следующем примере точка останова достигается только в том случае, если значение testInt
изменяется:
Если задать условие точки останова с недопустимым синтаксисом, появится предупреждение. Если вы укажете условие точки останова с допустимым синтаксисом, но недопустимой семантикой, предупреждающее сообщение появится в первый раз, когда достигнете этой точки останова. В любом случае отладчик прерывается при попадании в недопустимую точку останова. Точка останова пропускается только в том случае, если условие является допустимым и принимает значение false
.
Заметка
Для поля , когда меняется поле, отладчик не считает первую проверку условия изменением, поэтому не останавливается на точке останова при первой проверке.
Используйте идентификаторы объектов в условных выражениях (только C# и F#)
Иногда требуется наблюдать за поведением определенного объекта. Например, может потребоваться узнать, почему объект был вставлен в коллекцию несколько раз. В C# и F# можно создавать идентификаторы объектов для конкретных экземпляров ссылочных типов и использовать их в условиях точки останова. Идентификатор объекта создается службами отладки среды CLR и связан с объектом.
Создание идентификатора объекта:
Установите точку останова в коде после создания объекта.
Запустите отладку, и когда выполнение приостановится в точке останова, выберите Отладка>Windows>Локальные (или нажмите клавиши Ctrl + Alt + V, L) для открытия окна Локальные.
Найдите конкретный экземпляр объекта в окне Локальные, щелкните правой кнопкой мыши и выберите Создать идентификатор объекта.
Вы должны увидеть $ плюс число в окне Locals. Это идентификатор объекта.
Добавьте новую точку останова в точку, которую вы хотите исследовать; Например, когда объект должен быть добавлен в коллекцию. Щелкните правой кнопкой мыши точку останова и выберите Условия.
Используйте идентификатор объекта в поле условного выражения. Например, если переменная
item
является объектом, добавляемым в коллекцию, выберите равно true и введите item == $<n>, где <n> является идентификатором объекта.Выполнение прервется в тот момент, когда этот объект будет добавлен в коллекцию.
Чтобы удалить идентификатор объекта, щелкните правой кнопкой мыши переменную в окне Локальные и выберите Удалить идентификатор объекта.
Заметка
Идентификаторы объектов создают слабые ссылки и не препятствуют сбору мусора объекта. Они допустимы только для текущего сеанса отладки.
Установить условие по количеству срабатываний
Если вы подозреваете, что цикл в вашем коде начинает неправильно работать после определенного количества итераций, можно установить точку останова, чтобы прекратить выполнение после заданного количества срабатываний, а не многократно нажимать F5, чтобы дойти до этой итерации.
В разделе Условия в окне параметров точки останова выберите Счетчик срабатываний, а затем укажите количество итераций. В следующем примере точка останова устанавливается для каждой другой итерации:
Установка условия фильтра
Можно ограничить точку останова только на указанных устройствах или в указанных процессах и потоках.
В разделе Условия в окне Параметры точки останова выберите Фильтр, а затем введите одно или несколько из следующих выражений:
- MachineName = "name"
- ProcessId = значение
- ProcessName = "name"
- ThreadId = значение
- ThreadName = "name"
Заключайте строковые значения в двойные кавычки. Предложения можно объединить с помощью &
(AND), ||
(OR), !
(NOT) и круглые скобки.
Установка точек останова функции
При вызове функции можно прервать выполнение. Это полезно, например, если вы знаете имя функции, но не его расположение. Это также полезно, если у вас есть функции с одинаковым именем, и вы хотите разбить их все (например, перегруженные функции или функции в разных проектах).
Установка точки останова функции:
Выберите Отладка>Создать точку останова>функцииили нажмите клавиши CTRL + K, B.
Кроме того, в окне можно выбрать точку останова "Создать>функции".
В диалоговом окне Новая точка останова функции введите имя функции в поле Имя функции.
Чтобы сузить спецификацию функции, выполните следующие действия.
Используйте полное имя функции.
Пример:
Namespace1.ClassX.MethodA()
Добавьте типы параметров перегруженной функции.
Пример:
MethodA(int, string)
Используйте символ "!", чтобы указать модуль.
Пример:
App1.dll!MethodA
Используйте оператор контекста в собственном языке C++.
{function, , [module]} [+<line offset from start of method>]
Пример:
{MethodA, , App1.dll}+2
В раскрывающемся списке языка выберите язык функции.
Выберите OK.
Установка точки останова функции с помощью адреса памяти (только для машинного языка C++)
Адрес объекта можно использовать для задания точки останова функции в методе, вызываемом определенным экземпляром класса. Например, учитывая адресный объект типа my_class
, можно задать точку останова функции в методе my_method
, вызываемом экземпляром.
Установите точку останова где-то после создания экземпляра класса.
Найдите адрес экземпляра (например,
0xcccccccc
).Выберите Отладка>Создать функциональную точку останова>или нажмите Ctrl + K, B.
Добавьте в поле имя функции и выберите язык C++.
((my_class *) 0xcccccccc)->my_method
Установка точек останова данных (.NET Core 3.x или .NET 5+)
Точки останова данных прерывают выполнение при изменении свойства определенного объекта.
Чтобы задать точку останова данных, выполните приведенные действия.
В проекте .NET Core или .NET 5+ начните отладку и дождитесь достижения точки останова.
В окне Автомобили, Отслеживаниеили Локальные щелкните правой кнопкой мыши по свойству и выберите Остановить при изменении значения в контекстном меню.
Точки останова данных для .NET Core и .NET 5+ не будут работать:
- Свойства, которые недоступны для расширения во всплывающей подсказке, в окнах 'Локальные', 'Авто' или 'Контрольные значения'.
- Статические переменные
- Классы с атрибутом DebuggerTypeProxy
- Поля внутри структур
Максимальное число, которое можно установить, см. в разделе Ограничения оборудования для точек останова данных.
Установка точек останова данных (только для нативного C++)
Точки останова данных прерывают выполнение при изменении значения, хранящегося в указанном адресе памяти. Если значение считывается, но не изменяется, выполнение не прерывается.
Чтобы задать точку останова данных, выполните приведенные действия.
В проекте C++ запустите отладку и дождитесь достижения точки останова. В меню Отладка выберите Новая точка остановки>Точка останова данных.
Вы также можете выбрать "Создать>точки останова данных" в окне точек останова или щелкнуть правой кнопкой мыши элемент в Автос, смотретьили локальные и выбрать Разрыв при изменении значения в контекстном меню.
В поле Адрес введите адрес памяти или выражение, вычисляемое как адрес памяти. Например, введите
&avar
, чтобы остановить выполнение при изменении содержимого переменнойavar
.В раскрывающемся списке число байтов выберите количество байтов, которые требуется отслеживать отладчику. Например, если выбрать 4, отладчик будет наблюдать за четырьмя байтами, начиная с
&avar
и остановки, если любой из этих байт изменится.
Точки останова данных не работают в следующих условиях:
- Процесс, который не отлаживается, записывает в область памяти.
- Область памяти разделяется между двумя или более процессами.
- Расположение памяти обновляется в ядре. Например, если память передается в 32-разрядную функцию Windows
ReadFile
, память будет обновлена из режима ядра, поэтому отладчик не будет прерывать обновление. - Если наблюдаемое выражение превышает 4 байта на 32-разрядном оборудовании и 8 байтов на 64-разрядном оборудовании. Это ограничение архитектуры x86.
Заметка
Точки останова данных зависят от определенных адресов памяти. Адрес переменной изменяется с одного сеанса отладки на следующий, поэтому точки останова данных автоматически отключаются в конце каждого сеанса отладки.
Если установить точку останова данных в локальной переменной, точка останова по-прежнему включена, когда функция заканчивается, но адрес памяти больше не применим, поэтому поведение точки останова непредсказуемо. Если установить точку останова данных в локальной переменной, необходимо удалить или отключить точку останова перед завершением функции.
Аппаратные ограничения точек останова данных
Ядро Windows и базовое оборудование имеют следующие ограничения при настройке точек останова данных. Ограничение относится к максимальному количеству точек останова данных, которые можно задать.
Архитектура процессора | Ограничение точки останова данных |
---|---|
x64 и x86 | 4 |
ARM64 | 2 |
РУКА | 1 |
Установка зависимой точки останова
Зависимые точки останова прерывают выполнение только в том случае, если сначала была достигнута другая точка останова. Таким образом, в сложном сценарии, например при отладке многопоточных приложений, можно настроить дополнительные точки останова после первого попадания другой точки останова. Это может сделать отладку кода в общих сценариях, таких как цикл игры или API служебной программы, гораздо проще, так как можно настроить точку останова в этих функциях для включения только в случае, если функция вызывается из определенной части приложения.
Установка зависимой точки останова:
Наведите указатель мыши на символ точки останова, выберите значок Параметры, а затем в окне настроек точек останова установите включение только при достижении следующей точки останова.
В раскрывающемся списке выберите нужную точку останова, от которой должна зависеть текущая точка останова.
Нажмите кнопку Закрыть или нажмите клавиши Ctrl+Enter, чтобы закрыть окно параметров точек останова. Или в окне точек останова нажмите кнопку ОК, чтобы закрыть диалоговое окно.
Вы также можете использовать контекстное меню правой кнопкой мыши для задания зависимой точки останова.
Щелкните правой кнопкой мыши по левому полю рядом со строкой кода и выберите Вставить зависимую точку останова в контекстном меню.
- Зависимые точки останова не работают, если в приложении существует только одна точка останова.
- Зависимые точки останова преобразуются в обычную точку останова строки при удалении необходимой точки останова.
Установка временной точки останова
Эта точка останова позволяет разорвать код только один раз. При отладке отладчик Visual Studio приостанавливает приложение один раз, когда срабатывает эта точка останова, а затем сразу же удаляет её.
Установка временной точки останова:
Наведите указатель мыши на символ точки останова, щелкните значок параметров, а затем щелкните Удалить точку останова после нажатия в окне "Параметры точки останова".
Нажмите кнопку Закрыть или нажмите клавиши Ctrl+Enter, чтобы закрыть окно настроек точки останова. Или в окне брейкпоинтов выберите ОК, чтобы закрыть диалоговое окно.
Вы также можете использовать контекстное меню правой кнопкой мыши, чтобы задать временную точку останова.
Щелкните правой кнопкой мыши поле в левом углу рядом с строкой кода и выберите Вставить временную точку останова в контекстном меню.
Или просто используйте ярлык F9 + SHIFT+ ALT, T и задайте временную точку останова в строке.