Руководство. Отладка кода C++ с помощью Visual Studio
В этой статье представлены функции отладчика Visual Studio в пошаговом руководстве. При отладке приложения обычно запускается приложение с подключенным отладчиком. Отладчик предоставляет множество способов изучения того, что делает ваш код во время выполнения программы. Вы можете выполнить шаги по коду и просмотреть значения, хранящиеся в переменных, и задать контроль над переменными, чтобы увидеть, когда значения изменяются. Отладчик помогает проверить путь выполнения кода и подтвердить выполнение ветви кода.
В этом руководстве вы:
- Запустите отладчик и приостановите выполнение на точках останова
- Изучите команды для пошаговой работы с кодом в отладчике
- Просмотр переменных в подсказках и окнах отладчика
- Изучите стек вызовов
Если вы не знакомы с отладкой, вам стоит прочитать "Отладка для абсолютных начинающих" перед началом руководства. Если требуется представление функций отладчика выше уровня, см. Первый взгляд на отладчик.
Необходимые условия
Visual Studio 2022 версии 17.12 или более поздней с установленным рабочим набором Разработка классических приложений с использованием C++.
- Чтобы установить Visual Studio бесплатно, перейдите на страницу истории выпусков и сборок, чтобы узнать больше.
Если у вас уже есть Visual Studio, можно установить рабочую нагрузку из интерактивной среды разработки (IDE):
Выберите Средства>Получить средства и компоненты.
В установщике Visual Studio выберите вкладку рабочие нагрузки.
Выберите рабочую нагрузку «Разработка для настольных систем с использованием C++», затем выберите «Изменить».
Следуйте инструкциям и завершите установку.
В этом руководстве используется демонстрационное приложение C++ и снимок экрана, на котором представлен синтаксис C++. Большинство демонстраций функций также применимы к C#, Visual Basic, F#, Python, JavaScript и другим языкам, поддерживаемым Visual Studio. Существует несколько ограничений, которые следует учитывать:
F#: функция редактирования и продолжения не поддерживается.
F# и JavaScript: окно Авто не поддерживается.
Создание проекта
Выполните следующие действия, чтобы создать проект консольного приложения C++ в Visual Studio. Тип проекта предоставляет все файлы шаблонов, чтобы быстро начать работу.
В окне запуска Visual Studio (окно запуска>файла) выберите Создать проект:
Задайте фильтр языкаC++ и установите фильтр платформыWindows.
В поле поиска введите консольи выберите шаблон "Консольное приложение" в списке результатов:
Заметка
Если вы не видите шаблон консольного приложения, его можно установить из окна Создание нового проекта. Найдите раздел Не можете найти то, что вы ищете?, который следует за результатами поиска, и выберите Установить больше инструментов и функций. В установщике Visual Studio выберите рабочую нагрузку Разработка настольных приложений на C++ и обновите установку. Дополнительные сведения см. в разделе Предварительные требования.
Выберите Далее, чтобы перейти на страницу конфигурации.
Введите get-started-debugging в качестве имени проекта и имени решения для вашего нового приложения. Выберите папку по умолчанию или укажите другой путь в вашей среде.
Выберите Создать, чтобы создать проект Node.js.
Visual Studio создает новый проект и открывает иерархию проектов в обозревателе решений . Файл get-started-debugging.cpp открыт в редакторе кода.
Создание приложения
Создайте приложение для проекта, изменив файл get-started-debugging.cpp в редакторе кода.
Замените содержимое по умолчанию, предоставленное шаблоном, следующим кодом:
#include <string>
#include <vector>
#include <iostream>
void SendMessage(const std::wstring& name, int msg)
{
std::wcout << L"Hello, " << name << L"! Count to " << msg << std::endl;
}
int main()
{
std::vector<wchar_t> letters = { L'f', L'r', L'e', L'd', L' ', L's', L'm', L'i', L't', L'h' };
std::wstring name = L"";
std::vector<int> a(10);
std::wstring key = L"";
for (int i = 0; i < letters.size(); i++)
{
name += letters[i];
a[i] = i + 1;
SendMessage(name, a[i]);
}
std::wcin >> key;
return 0;
}
Запуск отладчика
Теперь вы готовы начать отладку обновленного кода:
Запустите сеанс отладки, выбрав F5 или Отладка > Начать отладку. Вы также можете выбрать начать отладку
(сплошной зеленый значок со стрелкой) на панели инструментов отладки.
Сочетание клавиш F5 запускает приложение с отладчиком, подключённым к процессу приложения, но у вас еще нет ничего особенного для изучения в коде. Приложение просто загружается и отображается вывод консоли:
Hello, f! Count to 1 Hello, fr! Count to 2 Hello, fre! Count to 3 Hello, fred! Count to 4 Hello, fred ! Count to 5 Hello, fred s! Count to 6 Hello, fred sm! Count to 7 Hello, fred smi! Count to 8 Hello, fred smit! Count to 9 Hello, fred smith! Count to 10
Далее в руководстве вы более подробно изучите это приложение в отладчике и изучите другие функции отладки.
Остановите отладчик, выбрав Stop
(значок в виде красного квадрата) на панели инструментов отладки. Вы также можете использовать сочетание клавиш Shift + F5.
В окне консоли для запущенного приложения нажмите любую клавишу и затем выберите ВВОД, чтобы закрыть окно.
Установка точки останова и запуск отладчика
Попробуйте задать точку останова и приостановку в выбранной точке отладчика:
Вернитесь к файлу get-started-debugging.cpp в редакторе кода и найдите цикл
for
функцииmain
:for (int i = 0; i < letters.size(); i++) { name += letters[i]; a[i] = i + 1; SendMessage(name, a[i]); }
Задайте точку останова в строке, содержащей инструкцию кода
name += letters[i];
, выбрав в левой области в строке инструкции. Visual Studio добавляет красный кругв гамме, чтобы указать точку останова.
Совет
Вы также можете поместить курсор в строку кода и выбрать F9, чтобы переключить точку останова для этой строки.
Точки останова являются одной из самых основных и важнейших функций надёжной отладки. Точка останова указывает, где требуется, чтобы Visual Studio приостанавливала выполнение кода. При приостановке выполнения можно просмотреть значения переменных, проверить поведение памяти или проверить, выполняется ли ветвь кода.
Запустите приложение в отладчике, выбрав F5 или Начать отладку.
Visual Studio запускает выполнение приложения. Когда отладчик достигает заданной точки останова, процесс отладки приостанавливается.
Visual Studio добавляет желтую стрелку к красному кругу точки останова в гутере, чтобы представить инструкцию кода, в которой отладчик приостановлен. Выполнение программы приостановлено, и указанная инструкция ожидает обработки.
Заметка
Действие F5 относится к текущему состоянию выполнения вашего приложения. Если приложение не запущено, и вы выбираете F5, отладчик запускает приложение и продолжает выполнение до тех пор, пока не достигнет первой точки останова. Это поведение сопоставляется с командой отладки>Начать отладку. Если приложение уже запущено, и вы выбираете F5, выполнение приложения продолжается до тех пор, пока отладчик не достигнет следующей точки останова или окончания программы. Это поведение сопоставляется с командой Отладка>Продолжить.
Точки останова — это полезная функция, когда вы знаете строку кода или раздел кода, которую вы хотите подробно изучить. Сведения о различных типах точек останова, которые можно задать, например условные точки останова, см. в разделе Использовать правильный тип точки останова.
Пошаговое выполнение кода в отладчике
Удобный способ просмотра кода в отладчике — использовать команд шага. Эти команды позволяют перейти в, шагнуть черези выйти из раздела кода, а также вернуться назад в процессе выполнения приложения.
В следующей процедуре показано, как использовать сочетания клавиш с командами шага, чтобы быстро работать с кодом. (Эквивалентные действия меню отображаются в скобках.)
Запустите приложение в отладчике, выбрав F5 или Начать отладку.
Пока отладчик приостановлен в цикле
for
в функцииmain
, выберите F11 (Отладка > шаг в) дважды, чтобы перейти к вызову методаSendMessage
.После двойного выбора F11 выполнение продолжается к кодовому выражению
SendMessage(name, a[i]);
.Выберите F11 еще раз, чтобы перейти к методу
SendMessage
.Обратите внимание, что желтый указатель перемещается в метод
SendMessage
:Сочетание клавиш F11 инициирует команду Шаг Внутрь, которая выполняет одну инструкцию приложения за раз. Это хороший способ изучить поток выполнения в наиболее подробной форме. По умолчанию отладчик пропускает неиспользуемый код. Дополнительные сведения см. в разделе Just My Code. Далее в руководстве вы узнаете, как быстрее перемещаться по коду.
После изучения метода
SendMessage
можно продолжить отладку с помощью команды Step Out. Выберите Shift + F11 (Отладка > Выход из подпрограммы).Эта команда возобновляет выполнение приложения (и перемещает отладчик), пока текущий метод или функция не возвращается.
По завершении команды отладчик приостанавливается в цикле
for
методаmain
при вызове методаSendMessage
.Выберите F11 несколько раз, пока не вернеесь к вызову метода
SendMessage
.Пока отладчик остановлен на вызове метода, выберите F10 (Отладка > Шаг с обходом).
Обратите внимание, что отладчик не переходит в метод
SendMessage
. Ярлык F10 позволяет отладчику продолжать выполнение, не заходя в функции или методы в коде приложения (при этом код по-прежнему выполняется). При выборе F10 в вызове методаSendMessage
(вместо F11) вы выполняете код реализации дляSendMessage
. Этот подход полезен для обхода кода, который вам сейчас не нужно проверять. Дополнительные сведения о различных способах перемещения по коду см. в разделе Навигация по коду вотладчика.
Обзор кода с помощью функции "Нажмите для выполнения"
Еще одним способом работы с кодом в отладчике может быть использована функция Выполнить до щелчка. Это действие аналогично настройке временной точки останова.
Перейдите к сеансу отладки:
Выберите F5, чтобы перейти к точке останова в коде.
В редакторе кода прокрутите страницу до определения метода
SendMessage
и наведите указатель мыши на функциюstd::wcout
.Наведите указатель мыши, пока слева от оператора кода не появится значок "Запустить для щелчка"
(зеленый значок со стрелкой). Если навести указатель мыши на значок, появится подсказка "Выполнить выполнение здесь":
Выберите Запустить, чтобы щелкнуть
.
Отладчик перемещает выполнение до указанной позиции. В этом примере отладчик достигает вызова функции
std::wcout
.
Действие "Run to Click" удобно для быстрого перемещения в пределах видимого участка кода приложения. Функцию можно использовать в любом файле, открытом в редакторе кода.
Быстро перезапустите приложение
Быстро перезапустите приложение, выбрав Перезапустить (значок круговой стрелки) в панели отладки. Вы также можете выбрать Отладка > перезапуск или использовать сочетание клавиш CTRL + SHIFT + F5.
Функция Перезапуска эффективнее, чем остановка приложения и запуск отладчика еще раз.
При выборе перезапускаотладчик приостанавливается на первой точке останова, на которую он наталкивается во время выполнения. В этом примере отладчик снова останавливается в точке останова, заданной внутри цикла for
.
Просмотр переменных с помощью всплывающих подсказок
Функции, помогающие проверять переменные, являются одним из наиболее полезных преимуществ работы с отладчиком. Часто при отладке проблемы вы пытаетесь определить, хранят ли переменные ожидаемые значения в определенный момент времени. Visual Studio предоставляет несколько способов для выполнения этой задачи.
Перейдите к сеансу отладки:
Пока отладчик приостановлен на инструкции
name += letters[i]
, наведите указатель мыши на переменнуюletters
. Выберите стрелку развертывания/свертывания слева от имени переменной и просмотрите его свойства во всплывающем меню.Датасоветы показывают все элементы, которые содержит переменная. Обратите внимание, что значение по умолчанию
size={10}
:Затем наведите указатель мыши на переменную
name
и обратите внимание на текущее значение, пустую строку (""
).Выберите несколько раз F5 (Отладка>Продолжить), чтобы произвести несколько итераций через цикл
for
. Каждый раз, когда отладчик приостанавливается в точке останова, наведите указатель мыши на переменнуюname
и проверьте текущее значение:Значение переменной изменяется с каждой итерацией цикла
for
, отображая значенияf
, а затемfr
, а затемfre
и т. д.
Проверка переменных с помощью окон "Авто" и "Локальные"
Другим способом проверки переменных и значений является использование окон Autos и Locals. По умолчанию эти окна отображаются под редактором кода в интегрированной среде разработки Visual Studio при отладке приложения:
Обратите внимание на окно Autos под редактором кода.
Если окно не отображается во время сеанса отладки, выберите Отладка>Windows>Автозапуск, чтобы открыть окно.
В окне Autos отображаются все переменные, которые используются в текущей или предыдущей строке, вместе с их текущими значениями. Помните, что определенные языки программирования могут продемонстрировать уникальное поведение для переменных и свойств. Дополнительные сведения см. в руководстве по языку Visual Studio.
Затем просмотрите окно Локальные. По умолчанию это окно выравнивается рядом с окном Автомобили.
Если окно не отображается во время сеанса отладки, выберите Отладка>Windows>Локальные, чтобы открыть окно
В окне Локальные разверните переменную
letters
, чтобы отобразить элементы, содержащиеся в ней.В окне локальные отображаются переменные, находящиеся в текущей области области, то есть текущий контекст выполнения.
Просмотр переменной
Если вы заинтересованы в просмотре поведения определенной переменной, можно задать смотреть:
В редакторе кода щелкните правой кнопкой мыши на переменной name
и выберите Добавить слежение. Откроется окно "Просмотр" под редактором кода. Для указания переменной (или выражения), которые вы хотите отслеживать, можно использовать окно Watch.
При просмотре переменной name
во время выполнения приложения в отладчике можно увидеть изменение его значения. В отличие от других окон переменных, окно Watch всегда показывает переменные, которые вы отслеживаете. Если отслеживаемая переменная не находится в зоне видимости, имя переменной затенено.
Изучите стек вызовов
Окно стека вызовов в Visual Studio показывает порядок вызова методов и функций. Это окно похоже на режим отладки в некоторых средах разработки, таких как Eclipse. По умолчанию стек вызовов отображается в правой нижней области во время сеанса отладки под редактором кода.
Пока отладчик приостановлен в цикле
for
, выберите окно стека вызовов , чтобы просмотреть текущую структуру вызовов.Если окно не отображается во время сеанса отладки, выберите Отладка>Windows>стек вызовов, чтобы открыть окно.
Выберите F11 (Отладка>Вход в) несколько раз, пока отладчик не приостановит выполнение в методе
SendMessage
.Снова просмотрите окно стека вызовов:
В окне стек вызовов в верхней строке показана текущая функция (метод
SendMessage
в этом приложении). Вторая строка показывает, что методSendMessage
был вызван из методаmain
и т. д.
Стек вызовов — это хороший способ проверить и понять поток выполнения приложения:
Дважды щелкните строку кода, чтобы перейти к исходному коду. Это действие также изменяет текущую область, которую исследует отладчик, но не продвигает его.
Получите доступ к контекстным меню для программных элементов в окне стека вызовов , щелкнув правой кнопкой мыши. Например, можно вставить точки останова в указанные функции, продвигать отладку с помощью Выполнить до курсораи перейти в исходный код. Дополнительные сведения см. в разделе «Просмотр стека вызовов и использование окна стека вызовов отладчика».
Изменение потока выполнения
Еще одной функцией отладчика в Visual Studio является возможность изменить поток выполнения приложения:
Выберите F11 (Отладка>шаг) дважды, чтобы запустить функцию
std::wcout
.Пока отладчик приостановлен в вызове метода
SendMessage
, выберите и перетащите желтую стрелку (указатель выполнения) влево от переменной и переместите стрелку в предыдущую инструкцию кода,std::wcout
.Снова выберите F11.
Отладчик повторно запускает функцию
std::wcout
. Вы можете отслеживать процесс в выходных данных терминала.Изменив поток выполнения, можно выполнять такие действия, как тестирование различных путей выполнения кода или повторного запуска кода без перезапуска отладчика.
Осторожность
Внимательно обратите внимание при работе с этой функцией. При выборе желтой стрелки Visual Studio отображает предупреждение в подсказке, указывающее, что изменение выполнения может иметь непредвиденные последствия. Кроме того, в зависимости от вашего сценария могут отображаться другие предупреждения. Помните, что перемещение указателя не может вернуть приложение в более раннее состояние приложения.
Выберите F5, чтобы завершить выполнение приложения.