一、什么是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信号的值