核心转储调试必须使用cppdbg类型,因VSCode通过GDB加载可执行文件与core文件实现内存快照分析;需在launch.json中同时指定program(未strip且带-g的二进制)和core字段,type值必须为"cppdbg",不可用python或coreclr。

核心转储调试必须用 cppdbg 类型,不是 python 或 coreclr
VSCode 调试 core dump 文件本质是用 GDB 加载可执行文件 + 内存快照,所以调试器类型必须设为 cppdbg。常见错误是误选 python 配置(比如看到 Python 项目里有 justMyCode 就照搬),结果启动时直接报错:Cannot debug core dumps with this debugger type。
确认方式:打开 .vscode/launch.json,检查 "type" 字段值是否为 "cppdbg";若为 "python" 或 "coreclr",删掉重配。
- 只对 C/C++ 编译生成的二进制有效,Python/Node.js 等语言崩溃产生的
core文件无法用此方式加载 - 调试前必须确保可执行文件与 core dump 是同一构建产物(符号未剥离、未被 strip、编译时带
-g) - 如果 core 文件是容器内生成的(如
/apollo/data/core/core_worldserver.12345),需把该文件和对应未 strip 的worldserver二进制一起复制到本地工作区
program 和 core 必须同时指定,且路径要绝对或基于 workspace
VSCode 的 GDB 调试器靠 gdb <executable> <corefile> 启动,因此 launch.json 中必须显式提供两个路径:
-
"program":指向原始可执行文件(如"${workspaceFolder}/build/bin/worldserver") -
"core":新增字段,指向 core dump 文件(如"${workspaceFolder}/core/core_worldserver.12345") - 不能用
args拼接,也不能省略core字段——否则会变成普通进程调试,不加载内存快照
示例关键片段:
{
"name": "Debug Core Dump",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/bin/worldserver",
"core": "${workspaceFolder}/core/core_worldserver.12345",
"MIMode": "gdb",
"miDebuggerPath": "/usr/bin/gdb",
"stopAtEntry": false,
"cwd": "${workspaceFolder}"
}
容器内生成的 core 文件常因路径/权限/格式失效
Docker 默认限制 core dump 生成,即使设置了 ulimit -c unlimited,也可能因 core_pattern 写入权限或挂载路径不可写导致文件为空或缺失。典型现象:
- 运行
cat /proc/sys/kernel/core_pattern得到/apollo/data/core/core_%e.%p,但宿主机看不到该路径下文件 → 容器未挂载该目录到宿主机 - core 文件存在,但 VSCode 提示
No symbol table loaded→ 容器内二进制被 strip 过,或未用-g编译 - GDB 启动后立即退出,控制台显示
Core was generated by `xxx'但无堆栈 → core 文件损坏或架构不匹配(如 x86_64 容器生成的 core 在 ARM 主机上加载)
验证方法:在容器内手动执行 gdb ./worldserver ./core/core_worldserver.12345,能正常进入 (gdb) 提示符再回退,说明 core 可用;否则先解决容器侧生成问题。
setupCommands 加 set solib-search-path 才能加载共享库符号
core dump 中若涉及动态链接库(如 libmysqlclient.so、libboost_system.so),GDB 默认找不到它们的调试符号,导致调用栈显示为 ??、变量无法展开。必须通过 setupCommands 显式设置搜索路径:
- 添加命令:
{"text": "set solib-search-path ${workspaceFolder}/build/lib:/usr/lib/x86_64-linux-gnu"} - 路径需覆盖所有依赖库所在目录,多个路径用
:分隔(Linux)或;(Windows) - 不要依赖
LD_LIBRARY_PATH环境变量——它对 core dump 加载无效
如果不确定依赖哪些库,可在生成 core 的容器中运行:ldd ./worldserver | grep '=> /',提取真实路径补入 solib-search-path。
file ./worldserver 和 file ./core/core_worldserver.12345 输出是否一致,再执行 readelf -n ./core/core_worldserver.12345 | grep -A2 BUILD_ID 对比。


















