日常工作中,不可避免的出现程序跑飞崩溃等情况.此时,我们需要coredump文件的支撑.但总有一些时候,莫名其妙的无法生成coredump.
本文,针对此问题,描述该如何生成一个coredump,需要具备哪些条件.
剩下的,请各位看官自行比对.

Coredump定义

Coredump叫做核心转储,它
是进程运行时在突然崩溃的那一刻的一个内存快照。操作系统在程序发生异常而异常在进程内部又没有被捕获的情况下,会把进程此刻内存、寄存器状态、运行堆栈等信息转储保存在一个文件里。

该文件也是二进制文件,可以使用gdb、elfdump、objdump或者windows下的windebug、solaris下的mdb进行打开分析里面的具体内容。

注:core是在半导体作为内存材料前的线圈,当时用线圈当做内存材料,线圈叫做core。用线圈做的内存叫做core memory。

Linux下 生成Core Dump文件的方法:

内核必须打开选项 CONFIG_ELF_CORE

一般默认都打开.

配置每个进程的RLIMIT_CORE资源为RLIM_INFINITY

ulimit -c unlimited

调试的进程,不能捕捉相关信号.

进程发生段错误时,如果当前进程有捕捉SIGSEGV信号,那么,不会生成coredump文件.否则,能够产生.

至此,coredump文件,可生成,

默认生成路径:输入可执行文件运行命令的同一路径下.
默认生成文件名称:文件名是core

在根文件系统的根目录下创建名为 .init_enable_core 的空文件:touch /.init_enable_core

此条件,实测不是必须的.

修改core文件的生成路径

为方便管理维护,一般会指定core文件的生成路径.

echo "/var/crash/coredump.%e.%p" > /proc/sys/kernel/core_pattern

core_pattern参数含义:
%% 单个%字符
%p 所dump进程的进程ID
%u 所dump进程的实际用户ID
%g 所dump进程的实际组ID
%s 导致本次coredump的信号
%t coredump的时间戳
%h 主机名
%e 程序文件名

即重定向 /proc/sys/kernel/core_pattern的内容到/var/crash/文件夹下,
当然,如果这个重定向的文件夹不存在,则需要创建.

详解,请参考Documentation/sysctl/kernel.txt中core_pattern部分。

Logo

更多推荐