基本概念
程序运行过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为叫做 Core Dump(核心转储)。可以认为 Core Dump 是内存快照,实际上除了内存信息,还有关键的程序运行状态,如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息
开启 Core Dump
可以使用 ulimit 开启,也可以在程序中通过 setrlimit 系统调用开启
ulimit -c
,输出的结果为0,说明默认关闭 Core Dump- 使用
ulimit -c unlimited
开启 Core Dump 功能,并且不限制 Core Dump 文件的大小;如果需要限制文件大小,unlimited 改成想要生成 core 文件最大的大小(KB) - 以上命令只对当前终端环境有效,如果需要永久有效修改 /etx/profile 文件,添加 ulimit -c unlimited,命令
echo "ulimit -c unlimited" >> /etc/profile
修改 core 文件保存路径
- 默认生成的 core 文件保存在可执行文件所在目录,文件名为 core
- 修改 /proc/sys/kernel/core_uses_pid 可以让生成 core 文件名是否自动加上 pid 号,如
echo 1 > /proc/sys/kernel/core_uses_pid
,生成的 core 文件名将会变成 core.pid - 修改 /proc/sys/kernel/core_pattern 来控制生成 core 文件保存的位置和文件名格式,如
echo "/tmp/corefile-%e-%p-%t" > /proc/sys/kernel/core_pattern
设置生成的 core 文件保存在 /tmp/corefile 目录下,文件名格式为 core-命令名-pid-时间戳
参数 | 说明 |
---|---|
%p | Core进程的PID |
%u | Core进程的UID |
%s | 造成Core的signal号 |
%t | Core的时间,从1970-01-0100:00:00开始的秒数 |
%e | 出Core进程对应的可执行文件名 |
阅读 core 文件
在 Linux 下,一般读取 core 的命令为 gdb exec_file core_file (gdb core-file core) 使用 GDB,先从可执行文件中读取符号表信息,然后读取 core 文件(core 文件中没有符号表信息)
手动生成 core 文件
当程序接收到以下UNIX信号会产生core文件:
信号 | 说明 |
---|---|
SIGABRT | 异常终止(abort) |
SIGBUS | 硬件故障 |
SIGEMT | 硬件故障 |
SIGFPE | 算术异常 |
SIGILL | 非法硬件指令 |
SIGIOT | 硬件故障 |
SIGQUIT | 终端退出符 |
SIGSEGV | 无效存储访问 |
SIGSYS | 无效系统调用 |
SIGTRAP | 硬件故障 |
SIGXCPU | 超过CPU限制(setrlimit) |
SIGXFSZ | 超过文件长度限制(setrlimit) |
每一种信号又对应一个编号,用 kill -l 命令可以查看具体的对应列表 找到一种满足产生 core 文件的的信号,用 kill 命令对应用程序发送此信号即可