前置准备
先配置好C++的运行环境,比如安装C++插件,先把C++代码跑起来,所以你需要先编译好源码,才能进行后续的debug。
关键配置
我选用的方式是配置 launch.json 文件进行debug,当你已经成功的编译并运行了源代码,这时候就可以配置 launch.json 文件了。具体为:
-
点击debug 模块,再点击创建 launch.json ,然后点击弹出的 debugger,选择推荐的第一个GDB debugger
-
选择gdb launch 模式
-
然后需要修改的就一个,将 program 参数的值设置为你已经编译好的可执行文件的地址,比如我的工作目录是 “D:\Desktop\C-Plus-Plus-master”,我的可执行文件的目录是 “D:\Desktop\C-Plus-Plus-master\backtracking\output\generate_parentheses.exe”,那就按照我图中的方式来改。需要注意路径的斜杠需要遵循图中的书写方式,还有就是miDebuggerPath参数,如果不知道 gdb 的路径,直接将这个注释掉就行了。
-
完整以上配置,只需要在源码里打上断点,直接启动debug就行了。
-
这时你就可以查看程序执行过程中的一些中间变量的值,也可以逐步的运行代码了。
再次更新~
上面写的方法虽然简单,但是有个缺陷,就是每次修改源代码就需要重新编译,对于需要不断修改源代码的调试就很不友好,这两天学习了使用 tasks.json 和 launch.json 自动化这些步骤!
下面将一步步教你如何实现:
- 修改代码后,一键调试
- 自动在调试前先编译(即 preLaunchTask)
- 报错时 VS Code 会自动跳转源码位置
项目结构假设
假设你的项目结构如下:
my-project/
├── CMakeLists.txt
├── src/
│ └── main.cpp
└── build/
你平时是这样编译的:
cd build
cmake ..
make
编写 task.json 和 launch.json
你需要:
- 在 .vscode/ 目录下新建或编辑 tasks.json,加入如下内容:
{
"version": "2.0.0",
"tasks": [
{
"label": "cmake",
"type": "shell",
"command": "cmake",
"args": [".."],
"options": {
"cwd": "${workspaceFolder}/build"
}
},
{
"label": "make",
"type": "shell",
"command": "make",
"args": [],
"options": {
"cwd": "${workspaceFolder}/build"
},
"problemMatcher": ["$gcc"]
},
{
"label": "build-cpp",
"dependsOn": ["cmake", "make"],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
字段解释:
字段 | 作用 |
---|---|
label | 任务的名字,可被其他任务或调试器引用 |
type: "shell" | 表示这是一个 shell 命令 |
command | 执行的命令,比如 cmake 或 make |
args | 给 command 传递的参数,例如 cmake .. 就是 command: "cmake" + args: [".."] |
options.cwd | 指定在哪个目录执行命令,避免手动 cd |
problemMatcher | 让 VS Code 识别错误信息并高亮 |
dependsOn | 表示这个任务依赖于多个子任务,会按顺序执行 |
最后我们创建了一个名为 build-cpp 的组合任务,它会自动先执行 cmake 再执行 make。
- 在 .vscode/ 目录下新建或编辑 launch.json,加入如下内容:
{
"version": "0.2.0",
"configurations": [
{
"name": "GDB Debug",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/main",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"preLaunchTask": "build-cpp",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
字段解释:
字段 | 作用 |
---|---|
name | 调试配置名称 |
type: cppdbg | 表示 C++ 调试器 |
request: launch | 启动调试模式(非 attach) |
program | 可执行文件路径(编译后生成的) |
cwd | 工作目录 |
preLaunchTask | 在调试前执行哪个任务,这里就是我们上面定义的 "build-cpp" |
MIMode | 指定调试器类型,比如 gdb |
setupCommands | 调试前的一些设置,比如启用 gdb 美化输出 |
加上 preLaunchTask 后,每次按 F5 调试前会自动编译,这样就不用手动编译了!
关键点总结
配置项 | 功能 |
---|---|
launch.json | 启动调试并自动构建 |
tasks.json | 编写自动构建任务 |
preLaunchTask | 将构建任务接入调试流程 |
problemMatcher | 自动解析错误并定位源代码 |
- 在launch.json中需要注意的就是 program 和 preLaunchTask 两个参数,后者就是 task.json 中的 label 参数,两者需对应才能关联起来。
- 在 task.json 中就是 dependsOn 和 label 两个参数,其中 dependsOn 表示这个任务依赖于多个子任务,会按顺序执行,每个子任务又会在这个 task 中定义,每个子任务里的参数可以这么理解:
type → options.cwd → command + args → problemMatcher → group 等其他元信息
这样每次修改源码后,如果进行 debug 都会先执行 preLaunchTask,而 preLaunchTask 就是 task 中设置的任务,他会执行 [“cmake”, “make”]两个子任务,这样就自动完成了编译。