Linux core dumps 的生成

简介:
     在程序开发过程中,我们可以通过assert,log, 单元测试,单步调试这些手段来排除bug,解决异常,提升代码质量。在发布版中,程序被异常终止了,只能通过当时的日志追踪程序当时运行的情景,如果没有core dumps 文件,在查找解决bug的时候,困难提高了几个数量级。
     当程序在运行过程中遇到异常,操作系统为了安全期间,会将异常程序关闭,并生成崩溃文件。崩溃文件一般是程序崩溃地址前的堆栈快照信息。通过崩溃文件运行与之匹配的程序,就可以找到程序异常事故现场,找到相应的代码片段,解决问题。本篇文章教你如何打开core dumps 开关,在程序崩溃时,生成崩溃文件。


Core dumps开关:
     Centos系统core dumps默认 是关闭的,很显然Linux的思维方式就是定制你个人的私有操作系统,如果你对哪里不满意,或者你只需要某些应用或者服务,好的自己去安装,或者自己去打开。而不是霸道的为你做主。安全方面是列外,比如iptables是默认打开,这方面还是可以理解的。
     通过ulimit命令可以方便的查看core dumps文件是否打开:

     
ulimit -c

     如果输出为0,说明core dumps开关未打开。
     打开 生成core dumps 文件开关,执行

ulimit -c ulimited

     打开开关,ulimited 的意思是成成dump文件大小无限制,如果想对大小限制,可以换成数字,单位是kb。可是限制大小生成的dump文件是残缺的,用gdb调试可能会失败。所以最好还是开启为ulimited。
     执行命令后,系统生成core dumps的开关是打开了,等待下次系统重启的时候还是会默认为0,如果想以后系统重启,还是可以生成dump 文件,需要修改系统配置文件(/etc/profile):
     如果已经有:

ulimit -c 0 > /dev/null 2>&1

     可以修改为下面命令,如果没有可以添加此命令

ulimit -c unlimited >/dev/null 2>&1

linux 几乎所有东西都是通过文件来描述的,ulimit 来设置和查看一些系统配置的命令。通过
ulimit -a
可以查看,设置那些变量, 其中core file size,就是通过-c选项来描述的。/dev/null 你可以理解为黑洞,任何文件,或信息导入它,都会被吞噬。linux 用0来描述标准输入,1来描述标准输出,2来描述标准错误。>为导入符。整个意思就是在执行 ulimit -c命令的时候,无论是输出,还是错误都导入都忽略掉。

Core dumps生成规则:
     如果只打开dump开关,生成的dump文件路径为当前程序崩溃路径,dump文件名称为:core.19021,19021为进程号。如何定制自己想要的文件名和路径:打开文件:/etc/sysctl.conf

     添加下面命令:
     kernel.core_uses_pid = 1
     kernel.cre_pattern = ./core-%e-%s-%p-%t
     fs.suid_dumpable=2 
     第一条是配置是让生成的dump 文件加上进程号     第二条配置为在程序运行目录生成崩溃文件,其中:     %e 为程序名     %s 为程序崩溃时收到的信号数,对于信号不熟悉的同学可以看这里     %p 为程序运行时进程号     %t 为程序崩溃时时间(不过是秒数,如果想看具体时间,可以写个小程序,读出来)     我自己其实只用到了%e,这个选项,其它选项可以通过其它命令看到。     第三条是设置文件如果设置了+u权限, 也可以生成dump 文件。     在看下面提到的资料,最后一条是要在文件:/etc/sysconfig/init 里追加一条命令,但在Redhat系列操作系统不用加,因为其它系统里在设置ulimit -c 的时候用到了这个环境变量,如果你是其它系统,按照上面的教程不能生成dump文件,你可以考虑设置下这个变量。
     echo “DAEMON_COREFILE_LIMIT=‘unlimited’” >> /etc/sysconfig/init


为了让上面的配置生效,最后需要重新加载配置文件:

sysctl -p

建议:
1、dump 文件大小不要设置限制,虽然生成dump文件会很大,但压缩比是非常高的,压缩后可以很容易copy到本地。
2、如果想重启后不重新设置core dump 开关,需要将命令写在系统配置里。


参考资料:
http://www.cyberciti.biz/tips/linux-core-dumps.html
原文地址:https://www.cnblogs.com/fengju/p/6174310.html