Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
В этом руководстве описана отладка приложения C++ с помощью отладчика 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и т. д.
Стек вызовов — это хороший способ проверить и понять поток выполнения приложения:
- Дважды щелкните строку кода, чтобы перейти к исходному коду. Это действие также изменяет текущую область, которую исследует отладчик, но не продвигает его.
- Получите доступ к контекстным меню для программных элементов в окне стека вызовов , щелкнув правой кнопкой мыши. Например, можно вставить точки останова в указанные функции, продвигать отладку с помощью Выполнить до курсораи перейти в исходный код. Дополнительные сведения см. в разделе «Просмотр стека вызовов и использование окна стека вызовов отладчика».
Изменение потока выполнения
Еще одна мощная функция отладчика — это возможность изменять поток выполнения во время отладки:
Выберите F11 (Отладка>шаг) дважды, чтобы запустить функцию
std::wcout.Пока отладчик приостановлен в вызове метода
SendMessage, выберите и перетащите желтую стрелку (указатель выполнения) влево от переменной и переместите стрелку в предыдущую инструкцию кода,std::wcout.Снова выберите F11.
Отладчик повторно запускает функцию
std::wcout. Вы можете отслеживать процесс в выходных данных терминала.Изменив поток выполнения, можно выполнять такие действия, как тестирование различных путей выполнения кода или повторного запуска кода без перезапуска отладчика.
Осторожность
Внимательно обратите внимание при работе с этой функцией. При выборе желтой стрелки Visual Studio отображает предупреждение в подсказке, указывающее, что изменение выполнения может иметь непредвиденные последствия. Кроме того, в зависимости от вашего сценария могут отображаться другие предупреждения. Помните, что перемещение указателя не может вернуть приложение в более раннее состояние приложения.
Выберите F5, чтобы завершить выполнение приложения.
Передача аргументов командной строки
Задайте аргументы командной строки для приложения в свойствах проекта. Это полезно, если вы хотите проверить поведение приложения с различными аргументами командной строки.
Начиная с Visual Studio 2026, можно задать аргументы командной строки для приложения в раскрывающемся списке панели инструментов командной строки. Эта функция доступна для проектов Visual Studio C++, проектов Unreal Engine .uproject и проектов CMake. В настоящее время он находится в предварительной версии и подлежит изменению до окончательного выпуска.
Измените приложение, чтобы принять аргументы командной строки, заменив код в get-started-debugging.cpp файле следующим образом:
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
void SendMessage(const std::wstring& name, int msg)
{
std::wcout << L"Hello, " << name << L"! Count to " << msg << std::endl;
}
int main(int argc, char* argv[])
{
// Detect if the /u command-line argument was passed to the application.
bool uppercase = false;
for (int i = 1; i < argc; ++i)
{
if (std::string(argv[i]) == "/u")
{
uppercase = true;
break;
}
}
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;
std::wstring nameToSend = name;
if (uppercase) // Convert the name to uppercase if the /u argument was passed.
{
std::transform(nameToSend.begin(), nameToSend.end(), nameToSend.begin(), ::towupper);
}
SendMessage(nameToSend, a[i]);
}
return 0;
}
Эта обновленная версия приложения принимает аргумент /u командной строки, который преобразует имя в верхний регистр перед выводом.
Чтобы передать /u аргумент командной строки приложению при запуске отладки, выполните следующие действия.
На панели инструментов "Стандартный " текстовое поле аргументов командной строки введите
/u:
Поместите точку останова в строке 19,
uppercase = true;щелкнув левую полосу на этой строке.
Начните отладку приложения, нажав кнопку "Начать отладку " или нажав клавишу F5.
Отладчик попадает в точку останова, так как
/uбыл передан в качестве аргумента командной строки:
Выберите 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
Аргументы командной строки сохраняются в раскрывающемся списке в порядке их ввода и отображаются в раскрывающемся списке для дальнейшего использования. Существует ограничение в пять командных строк, которые можно добавить до удаления самого старого, чтобы освободить место для нового.
Вы можете выбрать стрелку раскрывающегося списка, чтобы просмотреть список ранее используемых аргументов командной строки.
Передача аргументов командной строки в разных типах проектов
Раскрывающийся список аргументов командной строки содержит конкретный параметр типа проекта, чтобы открыть классический способ задания аргументов, которые отладчик передает в программу. Для .vcxproj проектов используется страница свойств параметров проекта. Для проектов CMake это путем редактирования vs.launch.json файла. Для проектов Unreal Engine это путем редактирования .uproject файла.
Тип проекта Visual Studio (.vcxproj)
В проекте Visual Studio (.vcxproj) параметр отображается в раскрывающемся списке аргументов командной строки, чтобы изменить страницы свойств:
Выберите "Изменить в страницах свойств" , чтобы открыть окно свойств проекта на странице свойств отладки , где аргументы командной строки передаются при отладке приложения:
Изменения аргументов команд отражаются в раскрывающемся списке аргументов командной строки для будущих сеансов отладки.
Тип проекта CMake
Для проектов CMake в раскрывающемся списке аргументов командной строки отображается значение Edit in launch.vs.json:
Нажмите кнопку "Изменить" launch.vs.json, чтобы открыть launch.vs.json файл и задать аргументы командной строки для передачи при отладке приложения в элементе "args" :
Изменения в файле отражаются в раскрывающемся списке аргументов командной строки для будущих сеансов отладки.
Тип проекта Unreal Engine (.uproject)
Для проектов Unreal Engine параметр отображается в раскрывающемся списке аргументов командной строки, чтобы изменить в UETargetProperties.json:
Нажмите кнопку "Изменить" UETargetProperties.json, чтобы открыть UETargetProperties.json файл, в котором заданы аргументы командной строки для передачи при отладке приложения в элементе args:
Изменения в файле отражаются в раскрывающемся списке аргументов командной строки для будущих сеансов отладки.