Как настроить отладку C++ в VSCode с помощью Makefile

Как настроить отладку C++ в VSCode с помощью Makefile

26 апреля 2023 г.

VSCode имеет несколько фантастических функций отладки, которые позволяют разбивать код и выполнять построчное выполнение. Раньше я работал с ним, используя Java и Python, однако мне потребовалось больше предварительной настройки, чтобы настроить его для C++.

В этом руководстве я покажу, как настроить VSCode. для компиляции и отладки C++ таким образом, чтобы он каждый раз вызывал целевую компиляцию make-файла.

Я буду использовать следующие инструменты:

* ВСКод * Git Bash (с использованием MinGW-w64) * g++ (часть Коллекции компиляторов GNU (GCC)) * GNU Make

Использование терминала Git-bash

Начните с установки VSCode и Git Bash, если вы еще этого не сделали.

Откройте новый каталог с помощью VSCode и нажмите Ctrl-` или View→Terminal, чтобы открыть терминал.

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

* нажмите Ctrl-Shift-P и найдите «Терминал: выбор профиля по умолчанию» * выберите git-bash в качестве терминала по умолчанию * (у меня он был найден в «C:Program FilesGitbinbash.exe»).

Установка g++, Make и gdb в Git-Bash

Git-bash использует MingW в качестве среды по умолчанию. MingW предоставляет ряд функций и частей библиотеки GCC, которые можно использовать для компиляции ваших программ на C++.

Чтобы начать их установку:

  • введите /c/MinGW/bin/mingw-get.exe, чтобы открыть программу установки MingW
  • щелкните правой кнопкой мыши каждый из следующих элементов и выберите «отметить для установки»:
  • mingw32-gcc-g++, класс "bin"
  • mingw32-gdb, класс "bin"
  • mingw32-make, класс "bin"
  • В левом верхнем углу выберите «Установка» → «Применить изменения» → «Применить».
  • Дождитесь завершения установки и закройте окно.

Теперь вы сможете запустить каждую из этих программ в git-bash, набрав:

  • /c/MinGW/bin/g++
  • /c/MinGW/bin/gdb
  • /c/MinGW/bin/mingw32-make.exe

Рассмотрите возможность добавления «C:MinGWbin» в переменную PATH, чтобы вам не нужно каждый раз вводить полный путь к этим программам.

Создание простой программы на C++ с помощью Makefile

Давайте начнем с создания простой программы на C++, которая выводит список строк. Создайте два новых файла:

main.cpp

#include <iostream>
#include <vector>
#include <string>

int main() {
    std::vector<std::string> testStrings {"this", "is", "just", "a", "test"};

    for(auto testString : testStrings) {
        std::cout << testString << std::endl;
    }
}

Создать файл

CC="/c/MinGW/bin/g++.exe"

main.exe: main.cpp
    ${CC} -g main.cpp

(обратите внимание, что я включил флаг ‘-g’ для g++, который позже позволяет отлаживать символы для gdb)

Запустите цель make main.exe, затем запустите исполняемый файл, чтобы убедиться, что все работает:

$ /c/MinGW/bin/mingw32-make.exe main.exe
$ ./main.exe

Предполагая, что компиляция прошла успешно, вы должны увидеть наш список строк, распечатанный в терминале:

$ ./main.exe 
this
is
just
a
test

Настройка отладчика VSCode

Откройте боковую панель «Выполнить и отладить» в левой части экрана (Ctrl-Shift-D или Вид→Выполнить)

При открытом файле main.cpp

  • нажмите «создать файл launch.json»
  • выберите «C++ (GDB/LLDB)»

запуск.json

Это создаст новый файл в папке .vscode/launch.json, который позволит нам добавить конфигурации отладки. Заполните его следующим содержанием:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/main.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "C:MinGWbingdb.exe",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "Set Disassembly Flavor to Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "run the makefile"
        }
    ]
}

Убедитесь, что путь к gdb указан правильно в разделе «miDebuggerPath», а основной исполняемый файл вашей программы указан в разделе «program».

tasks.json

PreLaunchTask в файле launch.json ссылается на задачу с именем «запустить make-файл», которую нам нужно создать сейчас. Создайте новый файл с именем .vscode/tasks.json со следующим содержимым:

{
    "tasks": [
        {
            "type": "shell",
            "label": "run the makefile",
            "command": "/c/MinGW/bin/mingw32-make.exe",
            "args": ["main.exe"],
            "problemMatcher": [],
        }
    ],
    "version": "2.0.0"
}

(необязательно) протестировать задачу сборки

Вы можете убедиться, что tasks.json правильно отформатирован, попробовав его напрямую:

  • нажмите Ctrl + Shift + P и выберите "Задачи: выполнить задачу".
  • выберите «запустить make-файл»

Это должно автоматически открыть терминал со следующим текстом:

*  Executing task: /c/MinGW/bin/mingw32-make.exe main.exe 

mingw32-make: 'main.exe' is up to date.
 *  Terminal will be reused by tasks, press any key to close it. 

Вы можете удалить main.exe и снова запустить задачу, чтобы убедиться, что компиляция работает правильно, но на данный момент мне этого достаточно.

Запуск отладчика

  • Нажмите F5 или "Выполнить" → "Начать отладку", после чего ваша программа автоматически скомпилируется с помощью make и запустится.

* Нажмите Ctrl-Shift-Y или View→"Debug Console", чтобы просмотреть вывод программы, который должен выглядеть примерно так:

=thread-group-added,id="i1"
GNU gdb (GDB) 7.6.1
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "mingw32".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Warning: Debuggee TargetArchitecture not detected, assuming x86_64.
=cmd-param-changed,param="pagination",value="off"
=cmd-param-changed,param="args",value="2>CON 1>CON <CON"
[New Thread 18240.0x8db0]
[New Thread 18240.0x81c]
[New Thread 18240.0xa3e8]
[New Thread 18240.0x8ea4]
Loaded 'C:WINDOWSSysWOW64kernel32.dll'. Symbols loaded.
Loaded 'C:WINDOWSSysWOW64KernelBase.dll'. Symbols loaded.
Loaded 'C:WINDOWSSysWOW64msvcrt.dll'. Symbols loaded.
Loaded 'C:MinGWbinlibgcc_s_dw2-1.dll'. Symbols loaded.
Loaded 'C:MinGWbinlibstdc++-6.dll'. Symbols loaded.
this
is
just
a
test
The program 'C:pathtomain.exe' has exited with code 0 (0x00000000).

Строки распечатаны, это хороший знак.

Отладка

Вы можете щелкнуть строку 9, чтобы установить точку останова в середине цикла for и снова запустить отладчик, а затем нажать клавишу F10, чтобы переходить по одной строке во время выполнения программы.

Нажмите здесь, чтобы узнать больше об использовании отладчика VSCode.


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE