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 回车, 就可以显示程序在哪一行当掉的, 在哪个函数中.
来源: http://www.bubuko.com/infodetail-2923537.html