Skip to content

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-filegcore 不受 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 交互模式。

基于 VitePress 构建