Linux进程在运行中异常中止或者崩溃,Linux会将进程当时的内存信息、寄存器信息、函数调用堆栈等信息存储到文件系统的一个文件中,这个过程叫做core dump, 生成的core文件可以使用gdb来分析诊断程序存在的问题。最近对core dump的生成过程及相应进程退出的过程有些疑惑。究竟是崩溃进程的内核task退出前生成core文件还是崩溃的task先退出之后kernel检测到进程崩溃后额外来生成的呢?带着这个疑问去做些了实验和代码分析。
默认情况下,core dump文件被命名为core.pid, 如core.12345。内核参数/proc/sys/kernel/core_pattern可以定义core dump文件名模板。具体模板参数可以参考文档。但内核有个小巧特性,如果core_pattern的第一个字符为管道符:|, 内核会执行|之后的配置的可执行程序,并通过pipe将core dump内容传给这个用户态程序。
ABRT:Automated Bug Reporting Tool服务收集应用崩溃的core文件就是使用这个机制,abrt-ccpp服务会将core_pattern设置为:
1 | |/usr/libexec/abrt-hook-ccpp %s %c %p %u %g %t e %P %I %h |
