基本概念
程序运行过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为叫做 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 命令对应用程序发送此信号即可