Отладка кода
В C#, как и в других появившихся до .NET языках, главная методика по отладке состоит в добавлении точек останова и изучении того, что происходит в коде в конкретные моменты во время его выполнения.
Точки останова
Точку останова (breakpoint) в Visual Studio можно помещать на любую строку кода, которая в действительности выполняется. Самый простой способ — щелчок на необходимой строке в окне редактора кода внутри затененной области вдоль левого края окна документа (или выделение нужной строки и нажатие клавиши ). Это приводит к размещению в данной строке точки останова, которая вызывает прерывание процесса выполнения и передачу управления отладчику. Как и в предыдущих версиях Visual Studio, точка останова обозначается большим кружком слева от соответствующей строки в окне редактора кода. Кроме того, Visual Studio выделяет саму строку, отображая ее текст и фон разными цветами. Щелчок на кружке приводит к удалению точки останова.
Если останов на определенной строке каждый раз не подходит для решения имеющейся проблемы, можно создать так называемую условную точку останова. Для этого выберите в меню Debug (Отладка) пункт Windows — Breakpoints (Окнo — Точки останова). Откроется диалоговое окно, позволяющее указать желаемые детали для точки останова. В этом окне можно выполнять следующие действия:
- Указать, что выполнение должно прерываться лишь после прохождения точки останова определенное количество раз.
- Указать, что точка останова должна вступать в действие при каждом n-ном достижении строки, например, при каждом 20-м ее выполнении (это удобно при отладке больших циклов).
- Задать точки останова относительно переменных, а не команд. В таком случае наблюдение будет вестись за значением указанной переменной, и точки останова будут активизироваться при каждом изменении значения этой переменной. Однако этот вариант может сильно замедлить выполнение кода, поскольку на проверку, не изменилось ли значение отслеживаемой переменной после выполнения каждой очередной инструкции, будет тратиться дополнительное время процессора.
Слежения
После срабатывания точки останова обычно необходимо просмотреть значения переменных. Проще всего это сделать, наведя курсор мыши на имя интересующей переменной прямо в окне редактора кода. Это приводит к появлению небольшого всплывающего окошка, в котором показано значение данной переменной; это окошко можно развернуть, чтобы просмотреть дополнительные детали.
Для просмотра значений переменных можно также использовать окно Autos (Автоматические). Окно Autos представляет собой окно с вкладками, которое появляется лишь тогда, когда программа выполняется в режиме отладки. Если вы его не видите, попробуйте выбрать в меню Debug (Отладка) пункт Windows — Autos (Окна — Автоматические).
В этом окне рядом с переменными, которые являются классами или структурами, отображается пиктограмма с изображением знака «плюс», щелчок на которой позволяет развернуть представление переменной и просмотреть значения ее полей.
Три предлагаемых в этом окне вкладки предназначены для наблюдения за переменными трех разных категорий:
- Вкладка Autos (Автоматические) позволяет просматривать значения нескольких последних переменных, к которым осуществлялся доступ в процессе выполнения программы.
- Вкладка Locals (Локальные) позволяет просматривать значения переменных, к которым получается доступ в методе, выполняемом в текущий момент
- Вкладка Watch (Слежение) позволяет просматривать значения любых интересующих переменных за счет явного указания их имен непосредственно в окне Watch.
Исключения
Исключения являются замечательным средством для обеспечения надлежащей обработки ошибок в поставляемом приложении. В случае правильного применения они позволяют обрести уверенность в том, что приложению удастся справиться с трудностями, а перед пользователем никогда не появится диалоговое окно с техническим описанием неполадки. К сожалению, во время отладки исключения не столь замечательны. На то имеются :
- Если исключение возникает во время отладки, часто не нужно, чтобы оно обрабатывалось автоматически, особенно если это подразумевает аккуратное завершение программы. Напротив, отладчик должен помочь выяснить, по какой причине возникло это исключение. Конечно же, трудность состоит в том, что в случае написания качественного надежного и отказоустойчивого кода, программа будет автоматически обрабатывать практически все, в том числе и неполадки, которые требуется обнаружить.
- Если возникло исключение, для которого не было предусмотрено обработчика, исполняющая среда .NET все равно будет пытаться его найти. К сожалению, к моменту, когда она обнаружит, что обработчик не существует, выполнение программы будет завершаться. Никакого стека вызовов, следовательно, не останется, и просматривать значения каких-либо переменных будет невозможно, потому что все они будут находиться за пределами области видимости.
Конечно, можно устанавливать точки останова в блоках catch, но это часто особо не помогает, поскольку при достижении блока catch поток управления по определению покинет соответствующий блок try. Это означает, что переменные, значения которых, скорее всего, следовало изучить для выяснения того, что пошло не так, покинут область видимости. Не будет даже возможности просматривать трассировочные данные стека для выяснения, какой метод выполнялся во время срабатывания оператора throw, поскольку управление уже покинет этот метод. Разумеется, помещение точки останова в оператор throw позволит решить эту проблему, но надо учитывать, что при написании кода защищенным образом операторов throw будет в коде очень много. Как тогда угадать, какой из них срабатывает и приводит к генерации исключения?
На самом деле в Visual Studio предлагается очень действенное решение. Если заглянуть в меню Debug (Отладка), то можно будет обнаружить там пункт Exceptions (Исключения). В случае выбора этого пункта открывается диалоговое окно Exceptions (Исключения). Это окно позволяет указывать, что должно происходить при выдаче исключения. Здесь можно указать, что выполнение должно продолжаться или же останавливаться с переходом в режим отладки, в случае чего произойдет останов, а отладчик окажется прямо на самом операторе throw:

Visual Studio известно обо всех классах исключений, которые доступны в базовых классах .NET, и о многих таких исключениях, которых могут выдаваться за пределами среды .NET. Распознавать автоматически специальные классы исключений, создаваемые разработчиками, Visual Studio не умеет, но позволяет вручную добавлять такие классы исключений в список и, следовательно, указывать, какие из таких исключений должны приводить к немедленному прекращению выполнения приложения. Для этого необходимо щелкнуть на кнопке Add (Добавить), которая активизируется при выборе самого верхнего узла в дереве, и ввести имя специального класса исключения.
Дополнительные команды отладки исходного кода
Компиляция практически всего коммерческого программного обеспечения на стадии отладки и на стадии подготовки окончательной версии продукта должна проводиться немного по-разному. Среда Visual Studio способна понимать это, поскольку сохраняет информацию обо всех параметрах, которые ей надлежит передавать компилятору. Для поддержки разных вариантов компоновки проекта Visual Studio потребуется сохранять подобную информацию в более чем одном экземпляре. Разные экземпляры такой информации называются конфигурациями. При создании проекта Visual Studio автоматически предлагает на выбор две таких конфигурации, которые называются, соответственно, Debug (Отладка) и Release (Выпуск):
- Конфигурация Debug обычно указывает, что никакие операции по оптимизации выполняться не должны, в исполняемом коде должна присутствовать дополнительная отладочная информация, а компилятор должен предполагать, что в коде определен препроцессорный символ отладки Debug, если только он не был явно отменен с помощью директивы #undefined.
- Конфигурация Release указывает, что компилятор должен проводить в отношении компилируемого кода оптимизацию, в исполняемом коде не должно присутствовать никакой дополнительной информации, а компилятор не должен предполагать наличие препроцессорного символа Debug.
Можно также определять собственные конфигурации. Это необходимо, например, для компоновки приложения с несколькими отличающимися версиями. Раньше из-за проблем, связанных с поддержкой кодировки Unicode в Windows NT, но не в Windows 95, для многих проектов на С++ было принято создавать две конфигурации — одну для Unicode, а вторую для (multibyte character set — набор многобайтных символов).
Краткое руководство. Отладка кода C++ с помощью отладчика Visual Studio
Область применения:
Visual Studio Visual Studio для Mac
Visual Studio Code ![]()
Отладчик Visual Studio реализует множество эффективных функций для отладки приложений. В этой статье вы ознакомитесь с некоторыми основными возможностями.
Создание нового проекта
- Откройте Visual Studio и создайте проект. Нажмите клавишу ESC, чтобы закрыть окно запуска. Нажмите CTRL+Q, чтобы открыть поле поиска, введите c++, выберите Шаблоны и затем Create new Console App project (Создание проекта консольного приложения). В появившемся диалоговом окне выберите Создать. Если шаблон проекта Консольное приложение Windows отсутствует, перейдите в меню Инструменты>Получить инструменты и компоненты. , после чего запустится Visual Studio Installer. Запускается Visual Studio Installer. Выберите рабочую нагрузку Разработка классических приложений на C++, а затем нажмите Изменить. Visual Studio создаст проект.
- В файле MyDbgApp.cpp замените следующий код
int main()
следующим кодом (не удаляйте #include «stdafx.h» ):
#include #include using namespace std; void doWork() < list c1; c1.push_back(10); c1.push_back(20); const list c2 = c1; const int &i = c2.front(); const int &j = c2.front(); cout int main()
Установка точки останова
Точка останова указывает, где Visual Studio следует приостановить выполнение кода, чтобы вы могли проверить значения переменных или поведение памяти, либо выполнение ветви кода. Эта возможность чаще всего используется при отладке.
- Чтобы задать точку останова, щелкните в области слева от вызова функции doWork (или выберите строку кода и нажмите клавишу F9).

- Нажмите клавишу F5 (или выберите Отладка > Начать отладку).
Отладчик приостановит выполнение в заданной точке останова. Инструкция, в которой отладчик приостановил выполнение приложения, обозначается желтой стрелкой. Строка, содержащая вызов функции doWork , пока еще не выполнена.
Совет При наличии точки останова в цикле или рекурсии либо большого числа точек останова, которые вы часто будете просматривать пошагово, используйте условную точку останова, которая позволяет приостанавливать код только при выполнении определенных условий. Использование условных точек останова позволяет сэкономить время и упростить отладку проблем, которые сложно воспроизвести.
Навигация по коду
Чтобы продолжить работу отладчика, можно использовать различные команды. Здесь описываются полезные новые команды для навигации по коду, доступные с версии Visual Studio 2017.

При приостановке в точке останова наведите указатель мыши на инструкцию c1.push_back(20) , пока не появится зеленая кнопка"Запустить", а затем нажмите кнопку "Выполнить", чтобы нажать кнопку.

Выполнение приложения продолжится путем вызова doWork и будет приостановлено в той строке, в которой вы нажмете эту кнопку.
В процессе пошагового выполнения кода обычно используются клавиши F10 и F11. Более подробные инструкции см. в статье Знакомство с отладчиком Visual Studio.
Проверка переменных в подсказке по данным

- В текущей строке кода, отмеченной желтым указателем выполнения, наведите указатель мыши на объект c1 , чтобы просмотреть подсказку по данным. Подсказка по данным содержит текущее значение переменной c1 и позволяет проверить ее свойства. Если во время отладки отображается значение, которое вы не ожидали увидеть, возможно, в предыдущей или вызывающей строке кода имеется ошибка.
- Разверните подсказку по данным, чтобы просмотреть текущие значения свойств объекта c1 .
- Чтобы закрепить подсказку по данным и иметь возможность постоянно просматривать значение переменной c1 во время выполнения, щелкните небольшой значок булавки. (При необходимости вы можете переместить закрепленную подсказку по данным в удобное положение.)
Изменение кода и продолжение отладки
Вы можете сделать это во время сеанса отладки, если вам потребуется внести изменения в код.
- Щелкните второй экземпляр c2.front() и измените c2.front() на c2.back() .
- Нажмите клавишу F10 (или выберите команду Отладка > Шаг с обходом) несколько раз, чтобы пройти вперед и выполнить измененный код. При нажатии клавиши F10 отладчик каждый раз переходит вперед на одну инструкцию, однако при этом минует функции, не заходя в них (пропускаемый код в таком случае по-прежнему выполняется).
Дополнительные сведения об этом режиме и его ограничениях см. в статье Изменить и продолжить.
Следующие шаги
В этом руководстве вы узнали, как запускать отладчик, осуществлять пошаговое выполнение кода и проверять переменные. Возможно, вы захотите получить более полное представление о функциях отладчика, а также воспользоваться ссылками на дополнительные сведения.
Отладчик Microsoft Visual Studio
Начнем с того, что разберемся что такое отладка программы и обсудим зачем и когда необходимо пользоваться отладчиком.
Отладка программы – это тот этап разработки программы, на котором программист ищет и устраняет всевозможные ошибки кода. Особенно нас интересуют ошибки, которые возникают на этапе выполнения программы, а не на этапе компиляции. Именно они могут привести к серьезным проблемам и сбоям программы, обнаружить причину которых бывает непросто.
Иногда, чтобы найти ошибку и посмотреть, что к ней приводит, надо пройти какой-то участок кода по шагам, по которым программа проходит в момент выполнения.
Так же интересно увидеть, как при этом меняются данные программы (значения переменных): какие значения они принимают в определённые моменты времени. В Microsoft Visual Studio для такой работы, к счастью, есть отладчик. В этой статье будут рассмотрены основы работы с отладчиком.
Допустим, надо проанализировать и отладить следующий код:
Работа с отладчиком Microsoft Visual Studio
using namespace std ;
int var55 = 55 ;
for ( int i = 3 ; i >= 0 ; i -- )
cout << var55 / i << endl ;
Наберите его в Visual Studio. В этом коде нет синтаксических ошибок, которые не пропустил бы компилятор до начала выполнения программы. Программа начнет выполняться, проделает определенный участок работы и возникнет ошибка:

Начнем отладку и посмотрим, в следствии чего произошла ошибка на этапе выполнения. Для этого, находясь в Visual Studio, надо нажать клавишу F10 . Программа начнет выполнятся и остановится на первой выполняемой строке. Вы увидите жёлтую стрелку возле той строки программы, которая выполняется в данный момент:

Чтобы перейти к выполнению следующего шага, надо снова нажать на F10 . Желтая стрелка переместится на другую строку:

Теперь посмотрите вниз экрана в Visual Studio – там есть вкладка в которой можно отслеживать, как изменяются данные переменных в реальном времени.

Тут переменная только создается и хранит какой-то мусор. При следующем нажатии на F10 стрелка переместится в строку 8. Во вкладке уже будет видно, что объявлена переменная i, а также какое значение приобрела переменная var55 .

Нажимайте на F10 и смотрите, как изменяются данные. Когда вы будете проходить отладчиком по циклу четвертый раз, переменная i примет значение 0. Это и приводит к ошибке выполнения программы так как на 0 делить нельзя.


Для выхода из режима отладки – нажмите Shift+F5 . Если код большой и вам надо отладить его с какой-то определенной строки, а не с самого начала – просто установите курсор в нужную строку и нажмите Сtrl+F10 .
Точка останова (breakpoint) и Умная точка останова
На сайте msdn есть такое определение точки останова:

Если надо выполнить программу до определённого места в коде и только достигнув его, запустить отладчик – используют точку останова.
Использование точек останова в отладчике Visual Studio
Область применения:
Visual Studio Visual Studio для Mac
Visual Studio Code ![]()
Точки останова — это один из важнейших инструментов разработчика для выполнения отладки. Точки останова устанавливаются везде, где нужно приостановить выполнение отладчика. Например, вы хотите просмотреть состояние переменных кода или стек вызовов в определенной точке останова. Если вы пытаетесь разрешить предупреждение или проблему при использовании точек останова, см. раздел Устранение неполадок точек останова в отладчике 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). Или наведите курсор на символ точки останова, выберите значок Параметры, а затем выберите Условия в окне Параметры точки останова.
Вы также можете щелкнуть правой кнопкой мыши в дальнем левом поле рядом со строкой кода и выбрать Вставить условную точку останова в контекстном меню, чтобы создать условную точку останова.
Можно также задать условия в окне Точки останова, щелкнув правой кнопкой мыши точку останова и выбрав пункт Параметры, а затем Условия.


Точки останова с установленными условиями отображаются с символом + в исходном коде и окне Точки останова.
Создание условного выражения
При выборе условного выражения можно выбрать между двумя условиями: значение true или при изменении. Выберите значение Имеет значение true, чтобы прервать выполнение при истинности выражения, или значение При изменении, если требуется прервать выполнение при изменении значения выражения.
В следующем примере задается применение точки останова, только если значение testInt равно 4:


В следующем примере задается применение точки останова, только если значение testInt меняется:


Если условие точки останова имеет недопустимый синтаксис, появится предупреждающее сообщение. Если указать условие для точки останова с недопустимой семантикой, но допустимым синтаксисом, предупреждающее сообщение появится при достижении точки останова в первый раз. В любом случае отладчик прерывает выполнение при попадании на недопустимую точку останова. Точка останова пропускается, только если условие допустимо и принимает значение false .
Для поля При изменении отладчик не обрабатывает первое вычисление условия как изменение, поэтому при первом вычислении выражения точка останова не сработает.
Использование идентификаторов объектов в условных выражениях (только C# и F#)
Иногда возникает необходимость наблюдать за поведением определенного объекта. Например, может потребоваться выяснить, почему объект был вставлен в коллекцию несколько раз. В C# и F# можно создавать идентификаторы объектов для определенных экземпляров ссылочных типов и использовать их в условиях точек останова. Идентификатор объекта создается службами отладки среды CLR и связан с объектом.
Создание идентификатора объекта
- Установите точку останова в коде после создания объекта.
- Запустите отладку и, когда выполнение приостановится на точке останова, выберите Отладка>Windows>Локальные (или нажмите клавиши CTRL + ALT + V, L), чтобы открыть окно Локальные. Найдите конкретный экземпляр объекта в окне Локальные, щелкните его правой кнопкой мыши и выберите Сделать идентификатор объекта. В окне $ вы должны увидеть символ Локальные . Это и есть идентификатор объекта.
- Добавьте новую точку останова в точке, которую нужно исследовать, например в точке добавления объекта в коллекцию. Щелкните правой кнопкой мыши точку останова и выберите пункт Условие.
- Используйте идентификатор объекта в поле Условное выражение. Например, если переменная item является объектом, который должен быть добавлен в коллекцию, выберите Is true и введите item == $ , где — идентификатор объекта. Выполнение прервется в точке добавления объекта в коллекцию. Чтобы удалить идентификатор объекта, щелкните правой кнопкой мыши переменную в окне Локальные и выберите пункт Удалить идентификатор объекта.
Идентификаторы объектов создают слабые ссылки и не предотвращают сборку мусора для объекта. Они действительны только в рамках текущего сеанса отладки.
Установка условия количества обращений
Если есть подозрение, что цикл в коде начинает неправильно вести себя после определенного числа итераций, можно установить точку останова для остановки выполнения после указанного количества обращений, вместо того чтобы многократно нажимать клавишу F5 для достижения этой итерации.
В разделе Условия в окне Параметры точки останова выберите Количество обращений, а затем укажите число итераций. В следующем примере задается выполнение точки останова при каждой второй итерации:


Задание условия фильтра
Вы можете ограничить точку останова, сделав ее срабатывание возможным лишь на определенных устройствах или в определенных процессах или потоках.
В разделе Условия в окне Параметры точки останова выберите Фильтр, а затем введите одно или несколько из следующих выражений.
- MachineName = "имя"
- ProcessId = значение
- ProcessName = "имя"
- ThreadId = значение
- ThreadName = "имя"
Значения строк следует заключить в двойные кавычки. Для комбинации условий можно использовать знаки & (И), || (ИЛИ), ! (НЕ) и скобки.
Установка точек останова функции
Выполнение можно прерывать при вызове функции. Это полезно, например, если известно имя функции, но не ее расположение. Это также полезно, если у вас есть функции с одинаковым именем и вы хотите приостановить их все (например, перегруженные функции или функции в разных проектах).
Установка точки останова функции:
- Выберите Отладка>Создать точку останова>Точка останова функции или нажмите клавиши CTRL + K, B. Можно также выбрать Создать>Точка останова функции в окне Точки останова.
- В диалоговом окне Новая точка останова функции заполните поле Имя функции. Чтобы уточнить функцию, сделайте следующее.
- Используйте полное имя функции. Пример: Namespace1.ClassX.MethodA()
- Добавьте типы параметров перегруженной функции. Пример: MethodA(int, string)
- Используйте символ "!", чтобы указать модуль. Пример: App1.dll!MethodA
- Используйте оператор контекста в машинном коде C++. [+] Пример: +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 Core не будут работать для следующих элементов:
- Свойства, которые не могут быть расширены в подсказках, окнах "Локальные", "Видимые" или "Контрольные значения"
- Статические переменные
- Классы с атрибутом DebuggerTypeProxy
- Поля внутри структур
Задание точек останова в данных (только машинный код C++)
Точки останова в данных приостанавливают выполнение, когда изменяется значение, хранящееся в указанном адресе памяти. Если значение только считывается, но не изменяется, выполнение программы не прерывается.
Задание точки останова в данных
- В проекте C++ начните отладку и подождите, пока не будет достигнута точка останова. В меню Отладка выберите команду Создать точку останова>Точка останова в данных. Можно также выбрать Создать>Точка останова в данных в окне Точки останова или щелкнуть правой кнопкой мыши элемент Видимые, Контрольные значения или Локальные и выбрать Прервать выполнение при изменении значения в контекстном меню.
- В поле Адрес введите адрес памяти или выражение, результатом вычисления которого будет адрес памяти. Например, для прерывания при изменении содержимого переменной &avar введите avar .
- В раскрывающемся списке Счетчик байтов введите количество байтов, за которыми должен наблюдать отладчик. Например, если выбрать 4, отладчик будет наблюдать за четырьмя байтами начиная с &avar и выполнит прерывание, если какой-либо из этих байтов изменит значение.
Точки останова в данных не работают при следующих условиях.
- Процесс, для которого не выполняется отладка, производит запись в область памяти.
- Область памяти совместно используется двумя или более процессами.
- Область памяти обновляется в ядре. Например, если память передается в функцию ReadFile 32-разрядной версии Windows, то память будет обновляться из режима ядра и отладчик не будет прерывать выполнение при обновлении.
- Контрольное значение превышает 4 байта на 32-разрядном оборудовании и 8 байт на 64-разрядном оборудовании. Это ограничение архитектуры x86.
- Точки останова в данных зависят от конкретных адресов памяти. Адрес переменной меняется между сеансами отладки, поэтому точки останова в данных автоматически отключаются в конце каждого сеанса отладки.
- Если установить точку останова по данным на локальную переменную, точка останова остается включенной при завершении выполнения функции, но адрес памяти больше не применяется, поэтому поведение точки останова будет непредсказуемым. Если установить точку останова в данных на локальную переменную, рекомендуется удалить или отключить точку останова до окончания функции.
Добавление зависимой точки останова
Зависимые точки останова могут сработать только при условии срабатывания другой точки останова. Поэтому в сложном сценарии, таком как отладка многопоточного приложения, вы можете настроить дополнительные точки останова после первого срабатывания другой точки останова. Это упрощает отладку кода по часто используемым путям, например для игрового цикла или служебного API, так как точки останова в таких функциях можно настроить для включения только в случае вызова функции в определенной части приложения.
Чтобы задать зависимую точку останова, сделайте следующее:
- Наведите указатель мыши на символ точки останова, щелкните значок Параметры, а затем выберите Включить только при срабатывании следующей точки останова в окне "Параметры точек останова".
- В раскрывающемся списке выберите необходимую точку останова, от которой будет зависеть текущая точка останова.

Выберите Закрыть или нажмите клавиши CTRL+ВВОД, чтобы закрыть окно "Параметры точки останова". Или в окне "Точки останова" выберите ОК, чтобы закрыть диалоговое окно.
Чтобы задать зависимую точку останова, вы также можете воспользоваться контекстным меню по щелчку правой кнопкой мыши.

- Щелкните правой кнопкой мыши в крайнем левом поле рядом со строкой кода и выберите в контекстном меню пункт Вставить зависимую точку останова.
- Зависимые точки останова не работают, если в приложении присутствует только одна точка останова.
- Зависимые точки останова преобразуются в обычные точки останова, если предварительная условная точка останова была удалена.
Добавление временной точки останова
Такая точка останова позволяет прервать выполнение кода только единожды. Отладчик Visual Studio приостанавливает выполняющееся приложение только один раз для этой точки, а после срабатывания немедленно удаляет ее.
Чтобы задать временную точку останова, сделайте следующее:

- Наведите указатель мыши на символ точки останова, щелкните значок Параметры, а затем выберите Удалить точку останова после срабатывания в окне "Параметры точек останова".
- Выберите Закрыть или нажмите клавиши CTRL+ВВОД, чтобы закрыть окно "Параметры точки останова". Или в окне "Точки останова" выберите ОК, чтобы закрыть диалоговое окно.
Чтобы задать временную точку останова, вы также можете воспользоваться контекстным меню по щелчку правой кнопкой мыши.

- Щелкните правой кнопкой мыши в крайнем левом поле рядом со строкой кода и выберите в контекстном меню пункт Вставить временную точку останова.
Или просто используйте сочетание клавиш F9 + SHIFT+ ALT, T и задайте временную точку останова в строке.
Управление точками останова в окне точек останова
Используйте окно Точки останова для просмотра всех точек останова в вашем решении и управления ими. Это централизованное расположение особенно полезно в больших решениях или сложных сценариях отладки, в которых точки останова являются критически важными.
В окне Точки останова можно выполнять поиск, сортировку, фильтрацию, включение, отключение или удаление точек останова. Можно также задать условия и действия или добавить новую функцию или точку останова в данных.
Чтобы открыть окно Точки останова, выберите Отладка>Windows>Точки останова или нажмите клавиши CTRL+ALT+B.


Чтобы выбрать столбцы для отображения в окне Точки останова, выберите Показать столбцы. Выберите заголовок столбца, чтобы отсортировать список точек останова по этому столбцу.
Метки точки останова
Используйте метки для сортировки и фильтрации списка точек останова в окне Точки останова.
- Чтобы добавить метку к точке останова, щелкните правой кнопкой мыши точку останова в исходном коде или в окне Точки останова, а затем выберите Изменить метки. Добавьте новую метку или выберите существующую, а затем выберите ОК.
- Отсортируйте список точек останова в окне Точки останова, выбрав Метки, Условия или другие заголовки столбцов. Можно выбрать отображаемые столбцы, нажав Показать столбцы на панели инструментов.
Экспорт и импорт точек останова
Чтобы сохранить или предоставить состояние и расположение точек останова, их можно экспортировать или импортировать.
- Чтобы экспортировать одну точку останова в XML-файл, щелкните правой кнопкой мыши точку останова в исходном коде или окне Точки останова и выберите Экспорт или Экспорт выбранных. Выберите расположение экспорта и щелкните Сохранить. Расположением по умолчанию является папка решения.
- Чтобы экспортировать несколько точек останова, в окне Точки останова установите флажки рядом с точками останова или введите условия поиска в поле поиска. Нажмите на значок Экспортировать все точки останова, соответствующие текущим критериям поиска и сохраните файл.
- Чтобы экспортировать все точки останова, снимите все флажки и оставьте поле поиска пустым. Нажмите на значок Экспортировать все точки останова, соответствующие текущим критериям поиска и сохраните файл.
- Чтобы импортировать точки останова, в окне Точки останова выберите значок Импортировать точки останова из файла, перейдите к расположению XML-файла и нажмите Открыть.
Установка точек останова из окон отладчика
Можно также задать точки останова из окон отладчика Стек вызовов и Дизассемблирование.
Задание точки останова в окне стека вызовов
Чтобы прервать выполнение на инструкции или строке, к которой возвращается вызывающая функция, установите соответствующую точку останова в окне Стек вызовов.
Задание точки останова в окне стека вызовов
- Чтобы открыть окно Стек вызовов, необходимо приостановить процесс отладки. Выберите Отладка>Windows>Стек вызовов или нажмите клавиши CTRL+ALT+C.
- В окне Стек вызовов щелкните правой кнопкой мыши вызывающую функцию и выберите Точка останова>Вставить точку останова или нажмите F9. В левом поле стека вызовов рядом с именем вызова функции появится символ точки останова.
В окне Точки останова точка останова стека вызова будет представлена как адрес с областью памяти, который соответствует следующей исполняемой инструкции в функции.
Отладчик приостанавливает выполнение на этой инструкции.
Сведения о визуальном отслеживании точек останова во время выполнения кода см. в разделе Сопоставление методов в стеке вызовов при отладке.
Задание точки останова в окне дизассемблирования
- Чтобы открыть окно Дизассемблирование, необходимо приостановить процесс отладки. Выберите Отладка>Windows>Дизассемблирование или нажмите клавиши CTRL+ALT+D.
- В окне Дизассемблирование щелкните в левом поле инструкции, на которой нужно прервать выполнение. Можно также выбрать строку и нажать клавишу F9 или щелкнуть правой кнопкой мыши и выбрать Точка останова>Вставить точку останова.
См. также
- Что такое отладка?
- Улучшение кода C# с помощью Visual Studio
- Первое знакомство с отладкой
- Устранение неполадок с точками останова в отладчике Visual Studio
