core dump[打开及调试]

来源:互联网 发布:java else 编辑:程序博客网 时间:2024/06/07 00:01

本文系统为centos6.5(vmware中)

1. 开启或关闭core文件的生成
用以下命令来阻止系统生成core文件:
ulimit -c 0
下面的命令可以检查生成core文件的选项是否打开:
ulimit -a
该命令将显示所有的用户定制,其中选项-a代表“all”。

也可以修改系统文件来调整core选项
在/etc/profile通常会有这样一句话来禁止产生core文件,通常这种设置是合理的:
# No core files by default
ulimit -S -c 0 > /dev/null 2>&1
但是在开发过程中有时为了调试问题,还是需要在特定的用户环境下打开core文件产生的设置
在用户的~/.bash_profile里加上ulimit -c unlimited来让特定的用户可以产生core文件
如果ulimit -c 0 则也是禁止产生core文件,而ulimit -c 1024则限制产生的core文件的大小不能超过1024kb

2.设置Core Dump的核心转储文件目录和命名规则
/proc/sys/kernel/core_uses_pid可以控制产生的core文件的文件名中是否添加pid作为扩展,如果添加则文件内容为1,否则为0
/proc/sys/kernel/core_pattern可以设置格式化的core文件保存位置或文件名,比如原来文件内容是core-%e
可以这样修改:
echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
将会控制所产生的core文件会存放到/corefile目录下,产生的文件名为core-命令名-pid-时间戳
以下是参数列表:
    %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 添加命令名

具体操作如下:

[root@root soft_spc]# cd

[root@root ~]# mkdir -p /home/data/corefile

[root@root ~]# chmod 777 /home/data/corefile
[root@root ~]# echo "ulimit -S -c unlimited > /dev/null 2>&1" >> /etc/profile
[root@root ~]# source /etc/profile
[root@root ~]# echo "1" > /proc/sys/kernel/core_uses_pid
[root@root ~]# echo "/home/data/corefile/core-%e-%p_%t" > /proc/sys/kernel/core_pattern
[root@root ~]# echo "1" > /proc/sys/fs/suid_dumpable

[root@root ~]# 


3.测试 

先编译将cpp文件编译、链接成能运行的文件(此步骤要 -g,方便后面的调试),比如main,输入 ./main运行,若的段错误,则会生成一个core dump文件,按照前文的设置办法,此文保留在/home/data/corefile目录下,我们打开此目录,

可以看到生成的core-main文件,在执行./main的黑框中,输入gdb ./main  /home/data/core/

core-main-24444_1503018001, 最后面这个参数为core dump文件的绝对路径+文件名。此时就能看到具体的段错误原因了。。。。