Bootstrap

core dump文件

在程序运行过程中,发生segmentation fault,如果系统提示core dumped,说明为产生core文件。core文件会保存程序运行时的信息,如内存镜像、堆栈调用、寄存器等等,利用相关的工具如gdb可以还原程序发生问题时的情况,便于定位问题代码。

core文件是否生成,以及在哪里生成和文件名等情况,涉及如下文件/proc/sys/kernel/core_uses_pid、/proc/sys/kernel/core_pattern、/proc/sys/kernel/core_pile_limit、/proc/sys/fs/suid_dumpable。首先执行ulimit -c,如果输出结果为0表明系统不能生产core文件,这时可以执行ulimit -c unlimited,使得可以生产core文件,并且不限制core文件的大小。生成的core的文件名则由core_pattern和core_uses_pid共同决定。其中core_pattern有两种模式,一直是直接决定文件名和路径,比如/data/core/core.%e.%p.%s,表明core文件保存在data下面的core目录下,且文件名的格式是core后面加程序名pid号和引发错误的段信号值。

  • %% 单个%字符
  • %p 所dump进程的进程ID
  • %u 所dump进程的实际用户ID
  • %g 所dump进程的实际组ID
  • %s 导致本次core dump的信号
  • %t core dump的时间 (由1970年1月1日计起的秒数)
  • %h 主机名
  • %e 程序文件名

core_pattern的另一个模式是管道模式,以“|”开头,然后跟要执行的程序的绝对路径,如在ubuntu 12.04中,core_parttern文件的内容是“|/usr/share/apport/apport %p %s %c”且core_pipe_limit为0。当通过管道将内存镜像保存时,进程/proc/pid下面的内容不能立即删除,必须等到apport程序保存完内存信息后才可删除,否则信息流失不利于问题定位,这时core_pipe_limit的值决定了 系统中运行并发访问/proc/pid的进程数,如果为0表示不限制并发进程数量。/usr/share/apport/apport是Python脚本,带入的参数由上面的流程的符号意义可知,是进程ID号、导致本次core dump的信号和core文件是否限制limit的值。suid_dumpable文件的值可能为0、1和2。意义不同,0是表明不能产生core文件,1表明debug模式,任何进程都可以产生core,2表明生成的core文件只有root用户可读。

;