GDB 生成 Coredump 文件
背景
线上进程异常但未崩溃时,需要在不重启进程的前提下获取内存快照用于离线分析。GDB 的 generate-core-file 命令可以在 attach 到运行中进程后直接生成 coredump,等同于进程崩溃时系统自动生成的 core 文件。
方法一:GDB 交互模式
bash
# attach 到目标进程
gdb -p <PID>
# 生成 coredump(可指定文件名)
(gdb) generate-core-file /tmp/core.myapp
# 不指定文件名则默认 core.<PID>
# 生成完毕后 detach 退出
(gdb) detach
(gdb) quit 方法二:一行命令(非交互)
bash
gdb -p <PID> -batch -ex "generate-core-file /tmp/core.myapp" -ex "detach" 适合脚本化批量操作,不需要进入 GDB 交互界面。
方法三:gcore(无需 GDB)
bash
# 直接在 shell 中生成,不需要 attach
gcore -o /tmp/core.myapp <PID> gcore 本质上是 GDB 的封装,效果相同,但使用更简洁。
注意事项
- 进程暂停:生成 coredump 期间进程会被暂停(STOP),大进程耗时较长,生产环境慎用
- 磁盘空间:coredump 文件大小约等于进程的 RSS,确保目标路径有足够空间
- 权限要求:需要对该进程有 ptrace 权限(同用户或 root)
- 进程恢复:生成完成后进程自动恢复运行,不受影响
- ulimit 限制:
generate-core-file和gcore不受ulimit -c限制,它们直接写文件,不走内核的 core dump 机制
离线分析
生成后用 GDB 离线分析:
bash
gdb /path/to/binary /tmp/core.myapp
# 常用分析命令
(gdb) bt # 查看调用栈
(gdb) info threads # 查看所有线程
(gdb) thread apply all bt # 所有线程调用栈 总结
| 方法 | 优点 | 缺点 |
|---|---|---|
| GDB 交互 | 可在生成前先检查进程状态 | 需要手动操作 |
| GDB -batch | 可脚本化,一行搞定 | 无法先检查 |
| gcore | 最简洁,无需 GDB 交互 | 功能单一 |
推荐:日常排查用 gcore,需要先观察进程状态再用 GDB 交互模式。