Linux下使用VSCode配置C++调试环境
1. 简介
最近我意识到,调试是一个非常有用的手段。我记得我们当初学习 C++ 语言时,都是使用一个 IDE(比如 CodeBlocks、Dev-C++) 来进行编程和调试;然而随着学习的深入,我发现很多 Debug 工作直接用 printf
就能完成,还是自己接触的工作太少太简单,于是就没太学习调试这方面的知识;直到我开始尝试阅读一个比较大的项目源码。
一个大的项目源码,往往包含一堆的源代码、头文件、配置文件、脚本文件,它们往往又都是通过 Makefile 文件来进行组织维护的。虽然 Makefile 有写明编译的目标和其对应的依赖,但对于大项目来说,错综复杂的依赖关系即使去认真阅读 Makefile 文件也不是那么容易理清,更何况大项目的 Makefile 文件往往为了书写方便进行了大量封装,阅读起来实在困难。
而这时,调试的作用就体现出来了。调试不仅仅可以用来 Debug,我觉得更重要的是它能帮你理清一个程序它是从何而始、至何而终以及它整个执行路线是什么。这便是我这篇文章为什么要介绍配置调试环境的原因。
2. 配置
要让 VSCode 具备 C++ 的调试工能,首先需要安装 MicroSoft 官方的 C++ 工具插件,直接在扩展插件中搜索 C/C++
即可找到。安装完后,需要进一步进行配置才能使用:
-
首先用 VSCode 打开你要调试的项目目录,然后可以看到左侧栏出现一个调试按键,点击一下会弹出如下提示:
这是告诉你目前没有任何的配置文件来供编译调试,这里点击
Create a launch.json file
创建一个新的配置文件。注意,点击
Create a launch.json file
创建新的配置文件时,VSCode 主窗口要处在打开某一个 C++ 文件状态下,这样它才能自动识别你是要进行 C++ 项目的编译调试工作。 -
创建新的配置文件后,VSCode 会自动打开该
launch.json
文件:你需要给出对应的配置参数才能开始进行编译调试。好在这个插件已经给出了一般的配置模板,点击
Add Configuration
,VSCode 会询问我们要选择何种调试工具,Linux 上一般都预装了 gdb,所以我们就选C/C++: (gdb) Launch
即可。生成的配置模板大致如下所示:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "enter program name, for example ${workspaceFolder}/a.out",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"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
}
]
}
]
} -
最后,我们只需要修改模板中相应的参数即可,主要是
"program"
和"args"
字段。"program"
字段用来指定要调试的二进制可执行文件,"args"
用来指定传给二进制可执件文件的输入参数。完成这两项后,就可以开始基本的调试了。如果你的项目还需要用到环境变量,比如LD_LIBRARY_PATH
环境变量来指定项目依赖的链接库目录,则可以设置environment
字段,environment
字段是key-value
的列表,每个key-value
的设置如下:1
2
3
4{
"name": "LD_LIBRARY_PATH", // 环境变量名
"value": "xxx/lib", // 环境变量值
}如果你的项目只包含源代码,那么你需要先将源代码编译一遍。一般来说有 Makefile 文件的可以直接
make
编译,没有 Makefile 文件的可以找找是否有 CMakeLists 文件或者 Configure 脚本,然后使用它们生成 Makefile 文件后再make
编译,在项目中的 README 中一般也会说明如何编译。不过编译时需要注意的是,确保 Makefile 文件中的CFLAGS
和CXXFLAGS
变量包含-g
参数,如果没有则加上,-g
参数是为了保证编译出来的二进制文件包含调试信息(也即俗称的 Debug 版本二进制文件),这样我们才能使用调试工具进行调试。