core dump详解

2839阅读 0评论2010-04-26 jimylion
分类:

core dump(转载)

一、什么是core?

        在使用半导体作为内存的材料前,人类是利用线圈当作内存的材料(发明者为王安),线圈就叫作core ,用线圈做的内存就叫作core memory。如今,半导体工业蓬勃发展,已经没有人用线圈当内存了。不过,在许多情况下,人们还是把内存叫作core。所以注意了:这里的core不是核心,而是内存。不过结合实际来看,好像也有点“内核所占内存”的意思。

二、什么是core dump?

       我们在开发(或使用)一个程序时,最怕的就是程序莫明其妙地崩溃(挂掉)。虽然系统没事,但我们下次仍可能遇到相同的问题。

        于是,这时操作系统就会把程序挂掉时的内存内容写入一个叫做core的文件里(这个写入的动作就叫dump,dump的英语意思是垃圾、倾倒。从这里来看,这些内存的内容是程序错误运行的结果,所以算是垃圾,把他弄出来就好比从大的内存池里“倾倒”),以便于我们调试。

        这个过程,因此叫做core dump

1.core文件的生成开关和大小限制
---------------------------------
1)使用ulimit -c命令查看core文件的生成开关。若结果为0,则表示关闭了此功能,不会生成core文件。若 结果为unlimited则表示生成的core文件大小不受限制。
2)使用ulimit -c filesize命令,可以限制core文件的大小(filesize的单位为kbyte)。若ulimit -c unlimited,则表示core文件的大小不受限制。如果生成的信息超过此大小,将会被裁剪,最终生成一个不完整的core文件。在调试此 core文件的时候,gdb会提示错误。


2.core文件的名称和生成路径
----------------------------
若系统生成的core文件不带其它任何扩展名称,则全部命名为core。新的core文件生成将覆盖原来的core文件。
1)/proc/sys/kernel/core_uses_pid可以控制core文件的文件名中是否添加pid作为扩展。文件内容为1,表示添加pid作为扩展名,生成的core文件格式为core.xxxx;为0则表示生成的core文件同一命名为core。
可通过以下命令修改此文件:
echo "1" > /proc/sys/kernel/core_uses_pid

2)proc/sys/kernel/core_pattern可以控制core文件保存位置和文件名格式。
可通过以下命令修改此文件:
echo "/corefile/core-%e-%p-%t" > 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 添加命令名

3.用gdb查看core文件:
下面我们可以在发生运行时信号引起的错误时发生core dump了.
发生core dump之后, 用gdb进行查看core文件的内容, 以定位文件中引发core dump的行.
gdb [exec file] [core file]
如:
gdb ./test test.core
在进入gdb后, 用bt命令查看backtrace以检查发生程序运行到哪里, 来定位core dump的文件->行。

三、有关设置

1、开启系统的Core Dump功能
   ulimit -c core_file_size_in_kb

这里core_file_size_in_kb是你要设置的core文件大小,以kb为单位,
    如果要关闭该功能core_file_size_in_kb为0就行了。

2、设置Core Dump的核心转储文件目录和命名规则
    文件的命名规则放在
    /proc/sys/kernel/core_name_format文件中
    使用sysctl -w "kernel.core_name_format=/coredump/%n.core"
    上例的core文件放在/coredump目录下,文件名是进程名+.core
    以下是一些命名的格式说明
    %P   The Process ID (current->pid) 
    %U   The UID of the process (current->uid) 
    %N   The command name of the process (current->comm) 
    %H   The nodename of the system (system_utsname.nodename) 
    %%   A "%"

3、分析核心转储文件
    程序如下:
#include 
int main()
{
    int i=0;
    int j=5;
    int tmp;
    for(; i < 10; i++, j--)
    {
        tmp=i/j;
        printf("%d/%d=%dn", i, j, tmp);
    }
}
该程序运行到i=5时,会发生浮点运算错误(被除数等于0,j=0)
编译上面的程序
gcc -g main.c -o eg
./eg
发生core-dump后,如果核心转储文件是core.2098,执行下面的命令
gdb eg core.2098
可以看到当时的信息,此出不方便录入。

4、杂项
    kill -l
    上面命令列出所有信号的名称和值
    kill -l val
    查询值为val的信号名称
    kill -l signame
    查询signame信号的值

上一篇:修改/etc/exports生效命令
下一篇:svn在linux下的使用(svn命令)