Использование точек останова в отладчике Visual Studio
Точки останова — это один из важнейших инструментов разработчика для выполнения отладки. Точки останова устанавливаются везде, где нужно приостановить выполнение отладчика. Например, вы хотите просмотреть состояние переменных кода или стек вызовов в определенной точке останова. Если вы пытаетесь разрешить предупреждение или проблему при использовании точек останова, см. раздел Устранение неполадок точек останова в отладчике Visual Studio.
Примечание.
Если вам известна задача или проблема, которую вы пытаетесь решить, но вы не знаете, какой тип точки останова следует использовать, см. статью Часто задаваемые вопросы. Поиск нужной функции отладки в Visual Studio.
Установка точек останова в исходном коде
Можно установить точку останова в любой строке исполняемого кода. Например, в следующем коде C# можно задать точку останова в строке кода с присвоением значения переменной (int testInt = 1
), в цикле for
или любом коде в цикле for
. Точка останова не может быть задана в сигнатурах метода, объявлениях пространства имен или класса, а также в объявлениях переменной, не содержащих присваивания и методов задания или получения.
Чтобы задать точку останова в исходном коде, сделайте следующее:
- Щелкните в крайнем левом поле рядом с строкой кода. Можно также выбрать строку и нажать клавишу F9, выбрать команду Отладка>Переключить точку останова или щелкнуть правой кнопкой мыши и выбрать команду Точка останова>Вставить точку останова. В месте установки точки останова в левом поле появится красная точка.
Для большинства языков, включая C#, точка останова и текущие строки выполнения выделяются автоматически. Для кода C++ можно включить выделение точек останова и текущих строк, выбрав Инструменты (или Отладка) >Параметры>Отладка>Выделить всю исходную строку для точек останова и текущий оператор (только C++).
При отладке выполнение приостанавливается в точке останова до выполнения кода в этой строке. Символ точки останова отображается с желтой стрелкой.
В точке останова в следующем примере значение testInt
по-прежнему равно 3. Таким образом, значение не изменялось с момента инициализации переменной (задания значения 3), так как инструкция, выделенная желтым, еще не была выполнена.
В точке останова в следующем примере значение testInt
по-прежнему равно 1. Таким образом, значение не изменилось с момента инициализации переменной (значение 1), так как инструкция, выделенная желтым, еще не была выполнена.
Когда отладчик останавливается в точке останова, можно просмотреть текущее состояние приложения, включая значения переменных и стека вызова.
Ниже приведены некоторые общие инструкции по работе с точками останова.
Точка останова представляет собой переключатель. Можно щелкнуть ее, нажать клавишу F9 или выбрать Отладка>Переключить точку останова, чтобы удалить или снова вставить ее.
Чтобы отключить точку останова, не удаляя ее, наведите указатель мыши на нее или щелкните ее правой кнопкой мыши и выберите Отключить точку останова. Отключенные точки останова отображаются как пустые точки в левом поле или окне Точки останова. Чтобы повторно включить точку останова, наведите указатель мыши на нее или щелкните ее правой кнопкой мыши и выберите Включить точку останова.
Задайте условия и действия, добавьте и измените метки или экспортируйте точку останова, щелкнув ее правой кнопкой мыши и выбрав нужную команду или наведя на нее курсор и нажав на значок Параметры.
Действия и точки трассировки точки останова
Точка трассировки — это точка останова, которая выводит сообщение в окно вывода. Точка трассировки может играть роль временного оператора трассировки в языке программирования и не приостанавливает выполнение кода. Вы создаете точку трассировки, задавая особое действие в окне Параметры точки останова. Подробные инструкции см. в разделе Использование точек трассировки в отладчике Visual Studio.
Условия точки останова
Можно управлять тем, где и когда выполняется точка останова, задавая условия. Условие может быть любым допустимым выражением, которое распознает отладчик. Дополнительные сведения о допустимых выражениях см. в разделе Выражения в отладчике.
Задание условия для точки останова.
Щелкните правой кнопкой мыши символ точки останова и выберите пункт Условия (или нажмите клавиши ALT + F9, C). Или наведите курсор на символ точки останова, выберите значок Параметры, а затем выберите Условия в окне Параметры точки останова.
Вы также можете щелкнуть правой кнопкой мыши в дальнем левом поле рядом со строкой кода и выбрать Вставить условную точку останова в контекстном меню, чтобы создать условную точку останова.
Можно также задать условия в окне Точки останова, щелкнув правой кнопкой мыши точку останова и выбрав пункт Параметры, а затем Условия.
В раскрывающемся списке выберите Условное выражение, Количество обращений или Фильтр и задайте соответствующее значение.
Выберите Закрыть или нажмите клавиши CTRL+ВВОД, чтобы закрыть окно Параметры точки останова. Или в окне Точки останова выберите ОК, чтобы закрыть диалоговое окно.
Точки останова с установленными условиями отображаются с символом + в исходном коде и окне Точки останова.
Создание условного выражения
При выборе условного выражения можно выбрать между двумя условиями: значение true или при изменении. Выберите значение Имеет значение true, чтобы прервать выполнение при истинности выражения, или значение При изменении, если требуется прервать выполнение при изменении значения выражения.
В следующем примере задается применение точки останова, только если значение testInt
равно 4:
В следующем примере задается применение точки останова, только если значение testInt
меняется:
Если условие точки останова имеет недопустимый синтаксис, появится предупреждающее сообщение. Если указать условие для точки останова с недопустимой семантикой, но допустимым синтаксисом, предупреждающее сообщение появится при достижении точки останова в первый раз. В любом случае отладчик прерывает выполнение при попадании на недопустимую точку останова. Точка останова пропускается, только если условие допустимо и принимает значение false
.
Примечание.
Для поля При изменении отладчик не обрабатывает первое вычисление условия как изменение, поэтому при первом вычислении выражения точка останова не сработает.
Использование идентификаторов объектов в условных выражениях (только C# и F#)
Иногда возникает необходимость наблюдать за поведением определенного объекта. Например, может потребоваться выяснить, почему объект был вставлен в коллекцию несколько раз. В C# и F# можно создавать идентификаторы объектов для определенных экземпляров ссылочных типов и использовать их в условиях точек останова. Идентификатор объекта создается службами отладки среды CLR и связан с объектом.
Создание идентификатора объекта
Установите точку останова в коде после создания объекта.
Запустите отладку и, когда выполнение приостановится на точке останова, выберите Отладка>Windows>Локальные (или нажмите клавиши CTRL + ALT + V, L), чтобы открыть окно Локальные.
Найдите конкретный экземпляр объекта в окне Локальные, щелкните его правой кнопкой мыши и выберите Сделать идентификатор объекта.
В окне $ вы должны увидеть символ Локальные . Это и есть идентификатор объекта.
Добавьте новую точку останова в точке, которую нужно исследовать, например в точке добавления объекта в коллекцию. Щелкните правой кнопкой мыши точку останова и выберите пункт Условие.
Используйте идентификатор объекта в поле Условное выражение. Например, если переменная
item
является объектом, который должен быть добавлен в коллекцию, выберите Is true и введите item == $<n>, где <n> — идентификатор объекта.Выполнение прервется в точке добавления объекта в коллекцию.
Чтобы удалить идентификатор объекта, щелкните правой кнопкой мыши переменную в окне Локальные и выберите пункт Удалить идентификатор объекта.
Примечание.
Идентификаторы объектов создают слабые ссылки и не предотвращают сборку мусора для объекта. Они действительны только в рамках текущего сеанса отладки.
Установка условия количества обращений
Если есть подозрение, что цикл в коде начинает неправильно вести себя после определенного числа итераций, можно установить точку останова для остановки выполнения после указанного количества обращений, вместо того чтобы многократно нажимать клавишу F5 для достижения этой итерации.
В разделе Условия в окне Параметры точки останова выберите Количество обращений, а затем укажите число итераций. В следующем примере задается выполнение точки останова при каждой второй итерации:
Задание условия фильтра
Вы можете ограничить точку останова, сделав ее срабатывание возможным лишь на определенных устройствах или в определенных процессах или потоках.
В разделе Условия в окне Параметры точки останова выберите Фильтр, а затем введите одно или несколько из следующих выражений.
- MachineName = "имя"
- ProcessId = значение
- ProcessName = "имя"
- ThreadId = значение
- ThreadName = "имя"
Значения строк следует заключить в двойные кавычки. Для комбинации условий можно использовать знаки &
(И), ||
(ИЛИ), !
(НЕ) и скобки.
Установка точек останова функции
Выполнение можно прерывать при вызове функции. Это полезно, например, если известно имя функции, но не ее расположение. Это также полезно, если у вас есть функции с одинаковым именем и вы хотите приостановить их все (например, перегруженные функции или функции в разных проектах).
Установка точки останова функции:
Выберите Отладка>Создать точку останова>Точка останова функции или нажмите клавиши 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
В раскрывающемся списке Язык выберите язык функции.
Нажмите ОК.
Задание точки останова функции по адресу памяти (только в машинном коде 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
и выполнит прерывание, если какой-либо из этих байтов изменит значение.
Точки останова в данных не работают при следующих условиях.
- Процесс, для которого не выполняется отладка, производит запись в область памяти.
- Область памяти совместно используется двумя или более процессами.
- Область памяти обновляется в ядре. Например, если память передается в функцию
ReadFile
32-разрядной версии Windows, то память будет обновляться из режима ядра и отладчик не будет прерывать выполнение при обновлении. - Контрольное значение превышает 4 байта на 32-разрядном оборудовании и 8 байт на 64-разрядном оборудовании. Это ограничение архитектуры x86.
Примечание.
Точки останова в данных зависят от конкретных адресов памяти. Адрес переменной меняется между сеансами отладки, поэтому точки останова в данных автоматически отключаются в конце каждого сеанса отладки.
Если установить точку останова по данным на локальную переменную, точка останова остается включенной при завершении выполнения функции, но адрес памяти больше не применяется, поэтому поведение точки останова будет непредсказуемым. Если установить точку останова в данных на локальную переменную, рекомендуется удалить или отключить точку останова до окончания функции.
Ограничения оборудования точки останова данных
Ядро Windows и базовое оборудование имеют следующие ограничения при настройке точек останова данных. Ограничение относится к максимальному количеству точек останова данных, которые можно задать.
Архитектура процессора | Ограничение точки останова данных |
---|---|
x64 и x86 | 4 |
ARM64 | 2 |
ARM | 1 |
Добавление зависимой точки останова
Зависимые точки останова могут сработать только при условии срабатывания другой точки останова. Поэтому в сложном сценарии, таком как отладка многопоточного приложения, вы можете настроить дополнительные точки останова после первого срабатывания другой точки останова. Это упрощает отладку кода по часто используемым путям, например для игрового цикла или служебного API, так как точки останова в таких функциях можно настроить для включения только в случае вызова функции в определенной части приложения.
Чтобы задать зависимую точку останова, сделайте следующее:
Наведите указатель мыши на символ точки останова, щелкните значок Параметры, а затем выберите Включить только при срабатывании следующей точки останова в окне "Параметры точек останова".
В раскрывающемся списке выберите необходимую точку останова, от которой будет зависеть текущая точка останова.
Выберите Закрыть или нажмите клавиши CTRL+ВВОД, чтобы закрыть окно "Параметры точки останова". Или в окне "Точки останова" выберите ОК, чтобы закрыть диалоговое окно.
Чтобы задать зависимую точку останова, вы также можете воспользоваться контекстным меню по щелчку правой кнопкой мыши.
Щелкните правой кнопкой мыши в крайнем левом поле рядом со строкой кода и выберите в контекстном меню пункт Вставить зависимую точку останова.
- Зависимые точки останова не работают, если в приложении присутствует только одна точка останова.
- Зависимые точки останова преобразуются в обычные точки останова, если предварительная условная точка останова была удалена.
Добавление временной точки останова
Такая точка останова позволяет прервать выполнение кода только единожды. Отладчик Visual Studio приостанавливает выполняющееся приложение только один раз для этой точки, а после срабатывания немедленно удаляет ее.
Чтобы задать временную точку останова, сделайте следующее:
Наведите указатель мыши на символ точки останова, щелкните значок Параметры, а затем выберите Удалить точку останова после срабатывания в окне "Параметры точек останова".
Выберите Закрыть или нажмите клавиши CTRL+ВВОД, чтобы закрыть окно "Параметры точки останова". Или в окне "Точки останова" выберите ОК, чтобы закрыть диалоговое окно.
Чтобы задать временную точку останова, вы также можете воспользоваться контекстным меню по щелчку правой кнопкой мыши.
Щелкните правой кнопкой мыши в крайнем левом поле рядом со строкой кода и выберите в контекстном меню пункт Вставить временную точку останова.
Или просто используйте сочетание клавиш F9 + SHIFT+ ALT, T и задайте временную точку останова в строке.
Управление точками останова в окне точек останова
Используйте окно Точки останова для просмотра всех точек останова в вашем решении и управления ими. Это централизованное расположение особенно полезно в больших решениях или сложных сценариях отладки, в которых точки останова являются критически важными.
В окне Точки останова можно выполнять поиск, сортировку, фильтрацию, включение, отключение или удаление точек останова. Можно также задать условия и действия или добавить новую функцию или точку останова в данных.
Чтобы открыть окно Точки останова, выберите Отладка>Windows>Точки останова или нажмите клавиши CTRL+ALT+B.
Чтобы выбрать столбцы для отображения в окне Точки останова, выберите Показать столбцы. Выберите заголовок столбца, чтобы отсортировать список точек останова по этому столбцу.
Метки точки останова
Используйте метки для сортировки и фильтрации списка точек останова в окне Точки останова.
- Чтобы добавить метку к точке останова, щелкните правой кнопкой мыши точку останова в исходном коде или в окне Точки останова, а затем выберите Изменить метки. Добавьте новую метку или выберите существующую, а затем выберите ОК.
- Отсортируйте список точек останова в окне Точки останова, выбрав Метки, Условия или другие заголовки столбцов. Можно выбрать отображаемые столбцы, нажав Показать столбцы на панели инструментов.
Группы точек останова
Для сложных сценариев отладки может потребоваться создать группы точек останова для упорядочивания точек останова. Это позволяет быстро включить и отключить логические группировки точек останова на основе текущего сценария, который вы пытаетесь отлаживать.
Точки останова можно создать в окне точек останова, выбрав новую > группу точек останова и указав имя группы. Чтобы добавить точку останова в группу, щелкните правой кнопкой мыши точку останова и выберите "Добавить в группу> останова<>". Или перетащите точки останова в нужную группу.
Чтобы задать группу точек останова по умолчанию, щелкните правой кнопкой мыши группу и выберите "Задать как группу точек останова по умолчанию". При настройке группы точек останова по умолчанию вновь созданные точки останова автоматически добавляются в группу.
Экспорт и импорт точек останова
Чтобы сохранить или предоставить состояние и расположение точек останова, их можно экспортировать или импортировать.
Начиная с Visual Studio 2022 версии 17.12 (предварительная версия 3), группы точек останова также включаются в экспортированные и импортированные точки останова.
- Чтобы экспортировать одну точку останова в XML-файл, щелкните правой кнопкой мыши точку останова в исходном коде или окне Точки останова и выберите Экспорт или Экспорт выбранных. Выберите расположение экспорта и щелкните Сохранить. Расположением по умолчанию является папка решения.
- Чтобы экспортировать несколько точек останова, в окне Точки останова установите флажки рядом с точками останова или введите условия поиска в поле поиска. Нажмите на значок Экспортировать все точки останова, соответствующие текущим критериям поиска и сохраните файл.
- Чтобы экспортировать все точки останова, снимите все флажки и оставьте поле поиска пустым. Нажмите на значок Экспортировать все точки останова, соответствующие текущим критериям поиска и сохраните файл.
- Чтобы импортировать точки останова, в окне Точки останова выберите значок Импортировать точки останова из файла, перейдите к расположению XML-файла и нажмите Открыть.
Установка точек останова из окон отладчика
Можно также задать точки останова из окон отладчика Стек вызовов и Дизассемблирование.
Задание точки останова в окне стека вызовов
Чтобы прервать выполнение на инструкции или строке, к которой возвращается вызывающая функция, установите соответствующую точку останова в окне Стек вызовов.
Задание точки останова в окне стека вызовов
Чтобы открыть окно Стек вызовов, необходимо приостановить процесс отладки. Выберите Отладка>Windows>Стек вызовов или нажмите клавиши CTRL+ALT+C.
В окне Стек вызовов щелкните правой кнопкой мыши вызывающую функцию и выберите Точка останова>Вставить точку останова или нажмите F9.
В левом поле стека вызовов рядом с именем вызова функции появится символ точки останова.
В окне Точки останова точка останова стека вызова будет представлена как адрес с областью памяти, который соответствует следующей исполняемой инструкции в функции.
Отладчик приостанавливает выполнение на этой инструкции.
Дополнительные сведения о стеке вызовов см. в разделе Практическое руководство. Использование окна стека вызова.
Сведения о визуальном отслеживании точек останова во время выполнения кода см. в разделе Сопоставление методов в стеке вызовов при отладке.
Задание точки останова в окне дизассемблирования
Чтобы открыть окно Дизассемблирование, необходимо приостановить процесс отладки. Выберите Отладка>Windows>Дизассемблирование или нажмите клавиши CTRL+ALT+D.
В окне Дизассемблирование щелкните в левом поле инструкции, на которой нужно прервать выполнение. Можно также выбрать строку и нажать клавишу F9 или щелкнуть правой кнопкой мыши и выбрать Точка останова>Вставить точку останова.