Linux Core Dump

1,311 阅读2分钟

基本概念

程序运行过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为叫做 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-时间戳
参数说明
%pCore进程的PID
%uCore进程的UID
%s造成Core的signal号
%tCore的时间,从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 命令对应用程序发送此信号即可