1.简介:
corefile 是Linux下程序崩溃时生成的文件,可以用来分析程序崩溃的原因,因为它内部包含了程序崩溃时的堆栈信息。
2.corefile的设置
默认情况下,程序崩溃是不会生成corefile的,因为被操作系统限制。可以通过命令: ulimit -c 来查看,如果值为0则表示被限制了,所以不能生成corefile文件.
如果要使用corefile文件分析程序和系统异常信息,可以通过如下命令打开,其中unlimited表示corefile文件的大小无限制.
$ ulimit -c unlimited
这种设置方式虽然简单,但它却只是跟shell相关的,也就是说,如果我们关闭了当前shell再打开一个,则刚才的设置就失效了,这是很不方便的,可以将ulimit -c unlimited 放入/etc/profile中,然后执行source /etc/profile即可立即生效。
如果想配置只针对某一用户有效,则修改此用户的~/.bashrc或者~/.bash_profile文件:
$ ulimit -c unlimited $ source .bashrc
3.设置Core Dump的核心转储文件目录和命名规则
默认corefile是生成在程序的执行目录下或者程序启动调用了chdir之后的目录,我们可以通过设置生成corefile的格式来控制它,让其生成在固定的目录下。
/proc/sys/kernel/core_uses_pid可以控制产生的core文件的文件名中是否添加pid作为扩展,如果添加则文件内容为1,否则为0
/proc/sys/kernel/core_pattern可以设置格式化的core文件保存位置或文件名,比如原来文件内容是core-%e
# echo "/home/saneri/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
将会控制所产生的core文件会存放到corefile目录下,产生的文件名为core-命令名-pid-时间戳
或者
$ sysctl -w kernel.core_pattern=/corefile/core-%e-%p-%t
如果想让每次启动都保存设置,则需要写入配置文件中.
# echo "kernel.core_pattern=/home/saneri/corefile/core-%e-%p-%t" >> /etc/sysctl.conf # sysctl -p /etc/sysctl.conf kernel.core_pattern = /home/saneri/corefile/core-%e-%p-%t
关于格式的的控制有如下几个参数:
%%:相当于% %p:相当于<pid> %u:相当于<uid> %g:相当于<gid> %s:相当于导致dump的信号的数字 %t:相当于dump的时间 %e:相当于执行文件的名称 %h:相当于hostname
4.测试是否能生成core文件
$ kill -s SIGSEGV $$
查看 corefile目录下是否生成了core文件
5.用gdb查看core文件
gdb -c core文件路径 [应用程序的路径]
进去后输入where回车, 就可以显示程序在哪一行当掉的, 在哪个函数中.
原文地址:https://www.cnblogs.com/saneri/p/10280227.html