一、产生coredump文件的配置条件
1. echo
"/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
其中/corefile/是产生coredump文件的路径,core-%e-%p-%t是coredump文件的名称格式,其中的%xxxx意义如下:
%p - insert pid into filename 添加pid
%u - insert current uid into
filename 添加当前uid
%g - insert current gid into
filename 添加当前gid
%s - insert signal that caused the
coredump into the filename 添加导致产生core的信号
%t - insert UNIX time that the
coredump occurred into filename 添加core文件生成的unix时间
%h - insert hostname where the
coredump happened into filename 添加主机名
%e - insert
coredumping executable name into filename 添加命令名
2. ulimit –c unlimited
限制core文件的大小unlimited表示不限制,ulimit –c
10表示限制core文件的大小为10K
注意:网上有人说必须设置echo
"1" > /proc/sys/kernel/core_uses_pid,才能使产生的core文件是/proc/sys/kernel/core_pattern文件中的格式。但我实验过,echo
"0" > /proc/sys/kernel/core_uses_pid和echo "2"
> /proc/sys/kernel/core_uses_pid结果和echo "1"
> /proc/sys/kernel/core_uses_pid是一样的。
二、产生coredump文件的方法
1. 在终端中产生core文件(centOS 6.5)
1)在终端中输入以下两行,开启core文件生成
-
[root@localhost ~]# echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
-
[root@localhost ~]# ulimit -c unlimited
注意:可以将以上两句话加入到/etc/profile 或者 /etc/rc.local中,以后终端产生的进程都可以生成core文件(系统启动时的进程不会产生core文件)。
2)测试
-
[root@localhost ~]# sleep 1000 &
-
[1] 2871
-
[root@localhost ~]#
-
[root@localhost ~]# kill -11 2871
-
[root@localhost ~]#
-
[1]+ Segmentation fault (core dumped) sleep 1000
-
[root@localhost ~]#
-
[root@localhost ~]# ls /corefile/
-
core-sleep-2871-1488283849
2. 使系统启动时的后台进程产生core文件(centOS 6.5)
1)编辑/etc/rc.d/rc.local文件,在其中添加下列代码后重启系统
-
echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
-
ulimit -c unlimited
-
sleep 1000 &
2)测试,重启系统后进入终端
-
[root@localhost ~]#
-
[root@localhost ~]# ps -ef | grep sleep
-
root 2920 2169 0 20:14 pts/0 00:00:00 sleep 1000
-
root 2924 2169 0 20:15 pts/0 00:00:00 grep sleep
-
[root@localhost ~]#
-
[root@localhost ~]#
-
[root@localhost ~]# kill -11 2920
-
[root@localhost ~]#
-
[1]+ Segmentation fault (core dumped) sleep 1000
-
[root@localhost ~]#
-
[root@localhost ~]# ls /corefile/
-
core-sleep-2871-1488283849
-
[root@localhost ~]#
注意:
上边的sleep 1000 &进程是系统启动时的进程,并非终端进程。在每个进程的启动脚本中加入ulimit -c unlimited(就是ulimit -c
unlimited和启动进程的shell代码在同一个脚本中),那么该进程启动后出现错误时就会产 生core文件,方便调试。
3. 如果程序运行时的uid和euid(或者gid和egid)不相等,那么就不会产生core文件。解决方法是将/proc/sys/fs/suid_dumpable 的值设置成1。
1)将/bin/sleep的user和group设置成root用户aaron后,设置SUID位,这时以root身份运行/bin/sleep时将导致uid和euid(或者gid和egid)不一致。此时无法生成core文件,设置/proc/sys/fs/suid_dumpable为1后,也能生成core文件。
-
[root@localhost ~]# echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
-
[root@localhost ~]# ulimit -c unlimited
-
[root@localhost ~]#
-
[root@localhost ~]# chown aaron:aaron /bin/sleep
-
[root@localhost ~]#
-
[root@localhost ~]# chmod u+s /bin/sleep
-
[root@localhost ~]#
-
[root@localhost ~]# sleep 1000 &
-
[1] 11842
-
[root@localhost ~]#
-
[root@localhost ~]# kill -11 11842
-
[root@localhost ~]#
-
[1]+ Segmentation fault sleep 1000
-
[root@localhost ~]#
-
[root@localhost ~]# ls /corefile/
-
[root@localhost ~]#
-
[root@localhost ~]# echo "1" > /proc/sys/fs/suid_dumpable
-
[root@localhost ~]#
-
[root@localhost ~]# sleep 1000 &
-
[1] 11848
-
[root@localhost ~]#
-
[root@localhost ~]# kill -11 11848
-
[root@localhost ~]#
-
[1]+ Segmentation fault (core dumped) sleep 1000
-
[root@localhost ~]#
-
[root@localhost ~]# ls /corefile/
-
core-sleep-11848-1488436654
-
[root@localhost ~]#
4. 使系统所有进程都能产生coredump文件,待学习?
三、什么时候不产生core文件
(1)进程uid不等于euid
(2)进程gid不等于guid
(3)用户没有写当前工作目录的许可权
(4)文件太大
四、使用gdb测试core文件
1.测试代码main.c
-
int func(int *p)
-
{
-
int y = *p;
-
return y;
-
}
-
-
int main()
-
{
-
int *p = NULL;
-
return func(p);
-
}
2.编译测试
-
[root@localhost coredump]# gcc -o main main.c -gdwarf-2
-
[root@localhost coredump]#
-
[root@localhost coredump]# ./main
-
Segmentation fault (core dumped)
-
[root@localhost coredump]#
-
[root@localhost coredump]# gdb main /corefile/core-main-3313-1488352663
-
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-90.el6)
-
Copyright (C) 2010 Free Software Foundation, Inc.
-
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
-
This is free software: you are free to change and redistribute it.
-
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
-
and "show warranty" for details.
-
This GDB was configured as "i686-redhat-linux-gnu".
-
For bug reporting instructions, please see:
-
<http://www.gnu.org/software/gdb/bugs/>...
-
Reading symbols from /home/aaron/study/coredump/main...done.
-
[New Thread 3313]
-
Missing separate debuginfo for
-
Try: yum --enablerepo='*-debug*' install /usr/lib/debug/.build-id/5f/7d4ef6f6ba15505d3c42a7a09e2a7ca9ae5ba6
-
Reading symbols from /lib/libc-2.12.so...Reading symbols from /usr/lib/debug/lib/libc-2.12.so.debug...done.
-
done.
-
Loaded symbols for /lib/libc-2.12.so
-
Reading symbols from /lib/ld-2.12.so...Reading symbols from /usr/lib/debug/lib/ld-2.12.so.debug...done.
-
done.
-
Loaded symbols for /lib/ld-2.12.so
-
Core was generated by `./main
注意:1.要显示文件出错的位置,必须将可执行文件main和源文件main.c放到同一目录
2.编译选项使用-gdwarf-2是为了保证gcc的兼容性,我这里gcc使用的是gcc 4.8.1,gdb 7.2相对较老(这是来自网上的回答)。如果使用-g会导致gdb调试时无法生成程序出错的准确位置。
阅读(3182) | 评论(0) | 转发(0) |