在Linux系统中,若程序异常终止,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为叫做Core Dump(中文一般译为“核心转储”)。实际上,除内存信息之外,核心转储还会记录程序的一些关键运行状态,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息等。核心转储对于程序员调试程序非常有益,因为有些程序错误是很难重现的,例如指针异常,而核心转储文件可以重现程序出错时的情景。
但传统的gdb 调试有个问题是不够直观,工程师必须学习gdb命令且只能在命令行中调试。所幸的是由于这几年技术的发展,VsCode已经可以支持调试c++的功能了,用户可以VsCode中边看代码边调试程序(包括服务器程序、嵌入式arm板子上的程序、甚至是linux内核等)
传统gdb调试
gdb bin文件 core_dump文件

vscode gdb调试

使用 VSCode 调试 Linux 核心转储(core dump)涉及一些配置步骤。以下是使用 VSCode 进行核心转储调试的详细步骤。
1. 安装必要的工具
确保你已经安装了以下工具:
- VSCode:安装适用于你的操作系统的版本。
- C/C++ 插件:在 VSCode 中安装微软的 C/C++ 插件。
- gdb:GNU 调试器,用于调试程序。
- gdbserver(可选):如果需要远程调试。
- docker插件
- Remote Development插件或remote container插件
- cmake插件
2. 生成核心转储
首先,你需要生成一个核心转储文件。为了让系统生成核心转储文件,确保以下设置已经配置:
bash ulimit -c unlimited # 允许生成核心转储
运行导致程序崩溃的应用程序时,它将生成一个核心转储文件,通常命名为 core 或 core.<PID>。
在我的Docker内部,使用命令:cat /proc/sys/kernel/core_pattern查看核心转储文件的生成位置及文件名格式,得到的结果为:/apollo/data/core/core_%e.%p,表明Docker内部的核心转储文件被保存在/apollo/data/core目录下,文件名格式:core_进程名.进程PID。
3.VSCode远程链接容器
打开VSCode,选中Docker图标,出现已启动的镜像,如图所示:

右键选中Apolloauto/apollo:dev-x86_64-xxx 镜像,选中Attach visual studio code。
4. 在 VSCode 中配置调试器
创建或打开一个现有的 VSCode 项目,并确保其目录包含可执行文件和核心转储文件。
- 打开
**launch.json**文件:如果没有这个文件,可以通过Ctrl+Shift+P打开命令面板,输入Debug: Open launch.json,并选择C++ (GDB/LLDB)作为调试配置。 - 配置调试设置:将
launch.json文件配置为调试核心转储。一个典型的配置如下:
{
"version": "0.2.0",
"configurations": [
{
"name": "GDB Debug Core Dump",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/your_executable", // 你的可执行文件
"coreDumpPath": "${workspaceFolder}/core", // 核心转储文件路径
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"miDebuggerPath": "/usr/bin/gdb", // gdb 的路径
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"stopAtEntry": false
}
]
}
**program**: 设置为你的可执行文件的路径。**coreDumpPath**: 设置为核心转储文件的路径。**miDebuggerPath**: 指定 gdb 的路径,通常是/usr/bin/gdb。
5. 开始调试
- 启动调试:选择刚才配置的
GDB Debug Core Dump,点击 VSCode 的调试图标或按F5开始调试。 - 分析核心转储:现在可以在 VSCode 中使用断点、变量检查、调用堆栈和其他调试功能来分析核心转储文件。

6. 核心转储分析技巧
- 查看调用堆栈:在调试过程中,查看调用堆栈以找出程序崩溃的位置。
- 检查变量:在调试过程中检查关键变量的值以确定问题的根源。
- 设置断点:在感兴趣的代码位置设置断点,逐步执行代码以深入理解问题。
914





