目录
[4.1.单文件 C++ 项目](#4.1.单文件 C++ 项目)
[4.2.多文件 C++ 项目](#4.2.多文件 C++ 项目)
[4.3.CMake 项目](#4.3.CMake 项目)
1.简介
Windows下有VS系列,调试很方便,但是Linux下没有很好的集成开发环境,这也是Linux开发的硬伤;不过随着vscode的推出,Linux开发不在麻烦。大家都知道Linux基本上是用gdb调试,gdb功能强大,但对于大多数开发者来说,纯命令行界面看复杂的嵌套结构、追踪多线程调用栈、频繁跳转源代码,还是有不小的难度。VS Code 可以解决这些问题:
-
把复杂的 GDB 指令转化为可视化的断点、变量监视窗口和调用堆栈树。
-
VS Code 启动非常快,内存占用相对较低,非常适合在资源有限的虚拟机或远程服务器运行。
-
配合 Remote-SSH 插件,VS Code 可以在 Windows 的界面调试运行在 Linux 服务器的 C++ 代码。
先明白一件事:VS Code 本身没有调试 C++ 代码的能力。
VS Code 只是一个前端代理:
-
C/C++ 插件:把界面上点击"设置断点"或"单步执行"的操作,翻译成 GDB 的指令。
-
GDB (GNU Debugger) :Linux 系统底层控制程序的运行、挂起和内存读取。
-
VS Code 通过 Debug Adapter Protocol 跟 GDB 进行通信,并把 GDB 返回的二进制信息重新渲染成源码和变量值。
Linux 下用 VS Code 调试 C++,本质上是为强大的 GDB 引擎套上一个美观、高效的图形化外壳。
2.环境准备
调试 C++ 依赖两个核心工具:编译器(g++)、调试器(gdb),以及 VS Code 的插件支持。
1.安装编译器和调试器
打开 Linux 终端,执行以下命令安装(以 Ubuntu/Debian 为例,CentOS/Fedora 替换为 yum):
cpp
# 更新软件源(可选但建议)
sudo apt update
# 安装g++(编译器)、gdb(调试器)和基础编译工具
sudo apt install build-essential gdb
验证安装是否成功:
cpp
g++ --version # 输出g++版本即成功
gdb --version # 输出gdb版本即成功
2.VS Code 安装必备插件
打开 VS Code,点击左侧活动栏的"扩展"图标(或按 Ctrl+Shift+X),搜索并安装以下插件:
-
C/C++ (Microsoft) :必装。提供语法高亮、代码补全、 GDB 调试适配器。
-
C/C++ Extension Pack:推荐,是一个插件包,包含 C/C++ 基础插件、CMake 工具、Doxygen 文档支持。
-
CMake Tools :自动识别
CMakeLists.txt,一键配置、编译和调试,不用手动编写tasks.json。

3.配置VSCode
VS Code 调试的自动化是通过项目根目录下 .vscode 文件夹的 JSON 配置文件实现的。
1.tasks.json:调用编译器生成可执行文件。
2.launch.json:调用调试器运行生成的文件。
4.具体场景配置
4.1.单文件 C++ 项目
适合新手练手(如单个 main.cpp),是最基础的配置场景。
1.新建 main.cpp 文件,写入测试代码:
cpp
#include <iostream>
using namespace std;
int main() {
int a = 10;
int b = 20;
int sum = a + b;
cout << "sum = " << sum << endl; // 后续在此处设断点
return 0;
}
2.配置编译规则文件(tasks.json)
tasks.json 告诉 VS Code「如何编译代码生成可执行文件」,重点是加 -g 参数(生成调试信息)。
生成 tasks.json:
- 打开
main.cpp,按下Ctrl+Shift+B(或顶部菜单「终端」→「运行生成任务」); - 选择「C/C++: g++ build active file」(「active file」指当前打开的文件);
- VS Code 会自动在
.vscode文件夹下生成tasks.json,核心内容如下(已加详细注释):
cpp
{
"version": "2.0.0",
"tasks": [
{
"label": "C/C++: g++ 生成活动文件", // 任务名称(后续 launch.json 要引用,必须准确)
"type": "shell",
"command": "g++", // 编译命令(固定为 g++)
"args": [ // 编译参数(核心!逐行解释)
"-g", // 必加:生成调试信息,无此参数无法调试
"-O0", // 可选但建议:关闭编译器优化(调试时变量值更准确)
"-std=c++17", // 可选:指定 C++ 标准(c++11/c++14/c++17 按需选)
"${file}", // 当前打开的 cpp 文件(如 main.cpp)
"-o", // 指定输出可执行文件
"${fileDirname}/${fileBasenameNoExtension}" // 可执行文件路径(如 main.cpp → main)
],
"options": {
"cwd": "${fileDirname}" // 编译工作目录(当前文件所在文件夹)
},
"problemMatcher": ["$gcc"], // 识别 g++ 编译错误
"group": {
"kind": "build",
"isDefault": true // 设为默认编译任务(按 Ctrl+Shift+B 直接执行)
},
"detail": "编译器: /usr/bin/g++"
}
]
}
关键参数说明:
| 参数 | 作用 |
|---|---|
-g |
生成调试信息(必加),否则 GDB 无法识别断点、变量 |
-O0 |
关闭优化(调试专用),优化后变量可能被合并 / 删除,导致调试信息不准确 |
-std=c++17 |
指定 C++ 标准,根据项目需求改(如 c++11、c++20) |
${file} |
动态变量,指代当前打开的 .cpp 文件 |
${fileBasenameNoExtension} |
动态变量,指代当前文件的「文件名(无后缀)」(如 main.cpp → main) |
3.配置调试规则(launch.json)
launch.json 告诉 VS Code「如何启动 GDB 调试可执行文件」,核心是关联编译任务、指定可执行文件路径。
生成 launch.json:
- 点击左侧「运行和调试」图标(Ctrl+Shift+D);
- 点击「创建 launch.json 文件」;
- 选择「C++ (GDB/LLDB)」→「g++ - 生成和调试活动文件」;
- 自动生成
.vscode/launch.json,核心内容如下:
cpp
{
"version": "0.2.0",
"configurations": [
{
"name": "g++ - 调试活动文件", // 调试配置名称(自定义,如「调试 main.cpp」)
"type": "cppvsdbg", // 调试类型(Linux 下自动适配 GDB,无需改)
"request": "launch", // 启动调试(而非附加到已运行进程)
"program": "${fileDirname}/${fileBasenameNoExtension}", // 要调试的可执行文件路径
"args": [], // 程序运行参数(如命令行参数,格式:["arg1", "arg2"])
"stopAtEntry": false, // 是否在 main 函数入口暂停(新手建议设为 true)
"cwd": "${fileDirname}", // 调试工作目录
"environment": [], // 环境变量(如 LC_ALL=zh_CN.UTF-8 解决乱码)
"externalConsole": false, // 是否打开外部终端(建议 false,用 VS Code 内置终端)
"MIMode": "gdb", // 指定调试器为 GDB
"miDebuggerPath": "/usr/bin/gdb", // GDB 路径(自动识别,可省略)
"preLaunchTask": "C/C++: g++ 生成活动文件", // 调试前先执行的编译任务(必须和 tasks.json 的 label 一致!)
"setupCommands": [ // 优化 GDB 显示(可选)
{
"description": "为 GDB 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
注意:
preLaunchTask的值必须和 tasks.json 中的label完全一致(包括空格、标点),否则调试时会提示「找不到任务」;program路径必须和 tasks.json 中-o指定的可执行文件路径一致,否则提示「找不到可执行文件」;stopAtEntry: true适合新手:启动调试后自动停在main函数第一行,方便逐步跟踪。
4.2.多文件 C++ 项目
实际项目多是多文件(如 main.cpp + utils.cpp + utils.h),需修改 tasks.json 适配多文件编译。创建多文件结构:
cpp
cpp_multi/ # 项目根目录
├── .vscode/ # 配置文件夹(自动生成)
├── main.cpp # 主文件
├── utils.cpp # 工具函数实现
└── utils.h # 工具函数声明
1.修改 tasks.json
单文件的 tasks.json 中 ${file} 只编译当前文件,多文件需改为「所有源文件路径」,有两种方式:
1)手动列出所有源文件(精准控制)
修改 tasks.json 的 args 部分,将 ${file} 替换为所有 .cpp 文件:
cpp
"args": [
"-g",
"-O0",
"-std=c++17",
"main.cpp", // 主文件
"utils.cpp", // 工具文件
"-o",
"${fileDirname}/main" // 输出可执行文件(固定名称 main)
]
2)用通配符(适合文件多的场景)
用 *.cpp 匹配所有 .cpp 文件(注意:仅匹配当前目录,子目录需用 src/*.cpp):
cpp
"args": [
"-g",
"-O0",
"-std=c++17",
"*.cpp", // 匹配当前目录所有 .cpp 文件
"-o",
"${fileDirname}/main"
]
2.调整 launch.json
只需确保 program 指向多文件编译后的可执行文件(如 ${fileDirname}/main),其余参数不变:
cpp
"program": "${fileDirname}/main", // 固定指向编译后的 main 可执行文件
4.3.CMake 项目
大型 C++ 项目常用 CMake 管理编译,VS Code 配置需结合 CMakeLists.txt 和 launch.json。
CMake项目结构:
cpp
cpp_cmake/
├── .vscode/ # 配置文件夹
├── CMakeLists.txt # CMake 编译规则
├── src/
│ ├── main.cpp
│ └── utils.cpp
└── include/
└── utils.h
1.编写 CMakeLists.txt
在项目根目录创建 CMakeLists.txt,关键是开启调试模式(CMAKE_BUILD_TYPE=Debug):
cpp
cmake_minimum_required(VERSION 3.10)
project(cpp_cmake_demo) # 项目名称
# 关键:设置编译类型为 Debug(生成调试信息),Release 模式无调试信息!
set(CMAKE_BUILD_TYPE Debug)
set(CMAKE_CXX_STANDARD 17) # 指定 C++ 标准
# 包含头文件目录
include_directories(include)
# 收集所有源文件
file(GLOB SOURCES "src/*.cpp")
# 生成可执行文件
add_executable(main ${SOURCES})
2.编译 CMake 项目
打开 VS Code 终端(Ctrl+`),创建 build 目录并编译:
cpp
mkdir build && cd build
cmake .. # 生成 Makefile
make # 编译生成可执行文件(build/main)
或用 VS Code 的 CMake Tools 插件:点击底部「CMake: [Debug]」→「Build」,自动编译)
3.自定义 CMake Tools 配置(可选)
若需自定义编译路径、可执行文件名称等,在项目根目录创建 .vscode/settings.json:
cpp
{
// 指定 CMake 编译目录(默认 build/)
"cmake.buildDirectory": "${workspaceFolder}/cmake-build-debug",
// 指定默认编译目标(可执行文件名称)
"cmake.defaultBuildTarget": "main",
// 强制 Debug 模式
"cmake.buildType": "Debug",
// 指定 C++ 编译器
"cmake.configureSettings": {
"CMAKE_CXX_COMPILER": "/usr/bin/g++"
}
}
4.配置 launch.json
重点是指定 CMake 编译后的可执行文件路径:
cpp
{
"version": "0.2.0",
"configurations": [
{
"name": "CMake - 调试 C++ 项目",
"type": "cppvsdbg",
"request": "launch",
"program": "${workspaceFolder}/build/main", // CMake 生成的可执行文件路径
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"MIMode": "gdb",
"miDebuggerPath": "/usr/bin/gdb",
"setupCommands": [
{
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
5.调试传参 / 环境变量
若程序需要命令行参数或自定义环境变量,修改 launch.json:
cpp
{
"configurations": [
{
// ... 其他配置不变
// 1. 命令行参数(如 ./main -f test.txt -v)
"args": ["-f", "${workspaceFolder}/test.txt", "-v"],
// 2. 自定义环境变量
"environment": [
{"name": "LD_LIBRARY_PATH", "value": "${workspaceFolder}/lib"}, // 动态库路径
{"name": "LOG_LEVEL", "value": "DEBUG"} // 自定义环境变量
]
}
]
}
5.总结
- 调试前必须完成:安装
g++/gdb、VS Code 安装 C/C++ 插件,配置tasks.json(编译,加-g参数)和launch.json(调试,preLaunchTask与 tasks.json 标签一致); - 基础调试靠断点 + 步进 + 变量 / 监视面板,高效调试可使用条件断点、日志点(减少暂停次数);
- 多文件调试需修改
tasks.json包含所有源文件,core dump 调试可快速定位程序崩溃原因。