Linux系统下应用崩溃生成core dump的内部机制是什么
Linux Core Dump 相关问题解答
1. 应用程序的终止状态由谁负责追踪?
- Linux 内核负责全量追踪系统内所有进程的运行状态,自然也包含终止状态。进程触发终止逻辑时(无论是正常退出、被信号中断终止),内核会将终止原因、退出码、是否生成 core dump 等信息写入进程对应的任务结构体中,父进程可以通过
wait()、waitpid()等系统调用读取子进程的终止状态详情。
2. core dump 文件由谁生成?
- core dump 文件由Linux 内核直接生成,不属于用户态工具的默认能力范畴。只有当进程接收到默认行为为生成 core dump 的信号时(比如段错误触发的
SIGSEGV、断言失败触发的SIGABRT、算术异常触发的SIGFPE等),内核才会启动 core dump 生成逻辑,将进程的地址空间数据、寄存器状态、运行时上下文等信息持久化到存储中。
3. core dump 的具体生成流程是怎样的?能否手动触发生成core dump?
生成流程:
- 第一步:进程收到触发 core dump 的信号后,内核首先校验该进程的 core 资源限制(即
ulimit -c的配置值),如果值为0,直接终止进程,跳过 core 生成逻辑。 - 第二步:内核进一步校验进程权限、
PR_SET_DUMPABLE标志位状态,如果是特权进程、或者标志位关闭,同样不生成 core 文件。 - 第三步:内核读取
/proc/sys/kernel/core_pattern配置的文件命名和存储规则,创建 core 文件,按规则依次写入进程的虚拟内存内容、寄存器状态、信号上下文、打开的文件描述符信息等运行时数据。 - 第四步:写入完成后内核正式终止进程,将终止状态标记为已生成 core dump,向父进程发送通知。
手动触发方式:
可以通过给运行中的进程发送触发 core dump 的信号手动生成,常用命令如下:
# 给指定PID的进程发送SIGABRT信号,默认会触发core dump生成 kill -SIGABRT <进程PID> # 也可发送SIGQUIT信号,前台进程也可以通过快捷键Ctrl+\触发该信号 kill -SIGQUIT <进程PID>
触发前需要确认进程所属 shell 的ulimit -c配置为unlimited,且进程的PR_SET_DUMPABLE标志位处于开启状态。
4. 该过程内部需要依赖哪些软件包?
- 原生 core dump 生成逻辑完全由内核实现,不需要额外安装任何用户态软件包。如果需要自定义 core dump 的存储、压缩、上报等扩展逻辑,才需要额外安装用户态辅助工具,比如
systemd-coredump(systemd 系列发行版默认预装)、abrt(红帽系发行版常用的崩溃上报工具)等。 - 后续分析 core dump 文件通常需要用到
gdb调试工具包,该工具不属于 core dump 生成过程的依赖。
内容的提问来源于stack exchange,提问作者ram
相关产品推荐
相关产品推荐

