Chinaunix首页 | 论坛 | 博客
  • 博客访问: 303947
  • 博文数量: 82
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 490
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-13 10:58
文章分类

全部博文(82)

文章存档

2018年(2)

2017年(9)

2016年(71)

我的朋友

分类: 嵌入式

2017-03-11 11:32:26

一、产生coredump文件的配置条件

1. echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
其中/corefile/是产生coredump文件的路径,core-%e-%p-%tcoredump文件的名称格式,其中的%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_pidecho "2" > /proc/sys/kernel/core_uses_pid结果和echo "1" > /proc/sys/kernel/core_uses_pid是一样的。

二、
产生coredump文件的方法

1. 在终端中产生core文件(centOS 6.5)

1)在终端中输入以下两行,开启core文件生成

  1. [root@localhost ~]# echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
  2. [root@localhost ~]# ulimit -c unlimited
注意:可以将以上两句话加入到/etc/profile 或者 /etc/rc.local中,以后终端产生的进程都可以生成core文件(系统启动时的进程不会产生core文件)

2)测试

  1. [root@localhost ~]# sleep 1000 &
  2. [1] 2871
  3. [root@localhost ~]#
  4. [root@localhost ~]# kill -11 2871
  5. [root@localhost ~]#
  6. [1]+ Segmentation fault (core dumped) sleep 1000
  7. [root@localhost ~]#
  8. [root@localhost ~]# ls /corefile/
  9. core-sleep-2871-1488283849


2
使系统启动时的后台进程产生core文件(centOS 6.5)

1)编辑/etc/rc.d/rc.local文件,在其中添加下列代码后重启系统

  1. echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
  2. ulimit -c unlimited
  3. sleep 1000 &

2)测试,重启系统后进入终端

  1. [root@localhost ~]#
  2. [root@localhost ~]# ps -ef | grep sleep
  3. root 2920 2169 0 20:14 pts/0 00:00:00 sleep 1000
  4. root 2924 2169 0 20:15 pts/0 00:00:00 grep sleep
  5. [root@localhost ~]#
  6. [root@localhost ~]#
  7. [root@localhost ~]# kill -11 2920
  8. [root@localhost ~]#
  9. [1]+ Segmentation fault (core dumped) sleep 1000
  10. [root@localhost ~]#
  11. [root@localhost ~]# ls /corefile/
  12. core-sleep-2871-1488283849
  13. [root@localhost ~]#

注意:

上边的sleep 1000 &进程是系统启动时的进程,并非终端进程。在每个进程的启动脚本中加入ulimit -c unlimited(就是ulimit -c unlimited和启动进程的shell代码在同一个脚本中),那么该进程启动后出现错误时就会产 生core文件,方便调试。


3如果程序运行时的uideuid(或者gidegid)不相等,那么就不会产生core文件。解决方法是将/proc/sys/fs/suid_dumpable 的值设置成1

1)/bin/sleepusergroup设置成root用户aaron后,设置SUID位,这时以root身份运行/bin/sleep时将导致uideuid(或者gidegid)不一致。此时无法生成core文件,设置/proc/sys/fs/suid_dumpable1后,也能生成core文件。

  1. [root@localhost ~]# echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
  2. [root@localhost ~]# ulimit -c unlimited
  3. [root@localhost ~]#
  4. [root@localhost ~]# chown aaron:aaron /bin/sleep
  5. [root@localhost ~]#
  6. [root@localhost ~]# chmod u+s /bin/sleep
  7. [root@localhost ~]#
  8. [root@localhost ~]# sleep 1000 &
  9. [1] 11842
  10. [root@localhost ~]#
  11. [root@localhost ~]# kill -11 11842
  12. [root@localhost ~]#
  13. [1]+ Segmentation fault sleep 1000
  14. [root@localhost ~]#
  15. [root@localhost ~]# ls /corefile/
  16. [root@localhost ~]#
  17. [root@localhost ~]# echo "1" > /proc/sys/fs/suid_dumpable
  18. [root@localhost ~]#
  19. [root@localhost ~]# sleep 1000 &
  20. [1] 11848
  21. [root@localhost ~]#
  22. [root@localhost ~]# kill -11 11848
  23. [root@localhost ~]#
  24. [1]+ Segmentation fault (core dumped) sleep 1000
  25. [root@localhost ~]#
  26. [root@localhost ~]# ls /corefile/
  27. core-sleep-11848-1488436654
  28. [root@localhost ~]#


4
使系统所有进程都能产生coredump文件,待学习?

三、什么时候不产生core文件

1)进程uid不等于euid

2)进程gid不等于guid

3)用户没有写当前工作目录的许可权

4)文件太大

四、使用gdb测试core文件

1.测试代码main.c

  1. int func(int *p)
  2. {
  3.     int y = *p;
  4.     return y;
  5. }

  6. int main()
  7. {
  8.     int *p = NULL;
  9.     return func(p);
  10. }
2.编译测试
  1.    [root@localhost coredump]# gcc -o main main.c -gdwarf-2
  2.    [root@localhost coredump]#
  3.    [root@localhost coredump]# ./main
  4.    Segmentation fault (core dumped)
  5.    [root@localhost coredump]#
  6.    [root@localhost coredump]# gdb main /corefile/core-main-3313-1488352663
  7.    GNU gdb (GDB) Red Hat Enterprise Linux (7.2-90.el6)
  8.    Copyright (C) 2010 Free Software Foundation, Inc.
  9.    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
  10.    This is free software: you are free to change and redistribute it.
  11.    There is NO WARRANTY, to the extent permitted by law. Type "show copying"
  12.    and "show warranty" for details.
  13.    This GDB was configured as "i686-redhat-linux-gnu".
  14.    For bug reporting instructions, please see:
  15.    <http://www.gnu.org/software/gdb/bugs/>...
  16.    Reading symbols from /home/aaron/study/coredump/main...done.
  17.    [New Thread 3313]
  18.    Missing separate debuginfo for
  19.    Try: yum --enablerepo='*-debug*' install /usr/lib/debug/.build-id/5f/7d4ef6f6ba15505d3c42a7a09e2a7ca9ae5ba6
  20.    Reading symbols from /lib/libc-2.12.so...Reading symbols from /usr/lib/debug/lib/libc-2.12.so.debug...done.
  21.    done.
  22.    Loaded symbols for /lib/libc-2.12.so
  23.    Reading symbols from /lib/ld-2.12.so...Reading symbols from /usr/lib/debug/lib/ld-2.12.so.debug...done.
  24.    done.
  25.    Loaded symbols for /lib/ld-2.12.so
  26.    Core was generated by `./main

注意:1.要显示文件出错的位置,必须将可执行文件main和源文件main.c放到同一目录

2.编译选项使用-gdwarf-2是为了保证gcc的兼容性,我这里gcc使用的是gcc 4.8.1gdb 7.2相对较老(这是来自网上的回答)。如果使用-g会导致gdb调试时无法生成程序出错的准确位置。

阅读(3096) | 评论(0) | 转发(0) |
0

上一篇:C测试程序

下一篇:lua中添加打印

给主人留下些什么吧!~~