最来在项目中遇到大型程序呈现SIGSEGV ,一向不知道用core dump东西来调试程序,花了近一周的时刻,才定位问题,老迈很气愤,成果很严重,呵呵,过后细心学习了这块的常识,了解一点core dump的常识。
在运用半导体作为内存的资料前,人类是运用线圈当作内存的资料(发明者为王安),线圈就叫作core ,用线圈做的内存就叫作“core memory”。(线圈的单词应该是coil,呵呵)现在,半导体工业澎勃开展,现已没有人用线圈当内存了,不过,在许多情况下,人们仍是把内存叫作“core”。 所以留意了:这儿的core不是中心,而是内存。不过结合实际来看,如同也有点“内核所占内存”的意思。
core dump又是什么东东? 咱们在开发(或运用)一个程序时,最怕的便是程序莫明其妙地挂掉。尽管体系没事,但咱们下次仍或许遇到相同的问题。所以,这时操作体系就会把程序挂掉时的 内存内容写入一个叫做core的文件里(这个写入的动作就叫dump,dump的英语意思是废物、倾倒。从这儿来看,这些内存的内容是程序过错运转的成果,所以算是废物,把他弄出来就比如从大的内存池里“倾倒”。),以便于咱们调试。这个进程,因而叫做core dump。
1. 在嵌入式体系中,有时core dump直接从串口打印出来,结合objdump查找ra和epa地址,运用栈回溯,能够找到程序犯错的当地。
2. 在一般Linux体系中,默许是不会产生core dump文件的,经过ulimit -c来查看core dump文件的巨细,一般开端是0,能够设置core文件巨细,ulimit -c 1024(kbytes单位)或许ulimit -c unlimited。
3. core dump文件输出设置,一般默许是当时目录,能够在/proc/sys/kernel中找到core-user-pid,经过
echo “1” > /proc/sys/kernel/core-user-pid使core文件名加上pid号,还能够用
mkdir -p /root/corefile
echo “/root/corefile/core-%e-%p-%t” > /proc/sys/kernel/core-pattern操控core文件保存方位和文件名格局。
以下是参数列表:
%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 增加指令名
4. 用gdb查看core文件:
下面咱们能够在产生运转时信号引起的过错时产生core dump了.编译时加上-g
产生core dump之后, 用gdb进行查看core文件的内容, 以定位文件中引发core dump的行.
gdb [exec file] [core file]
如:
gdb ./test test.core
在进入gdb后, 用bt指令查看backtrace以查看产生程序运转到哪里, 来定位core dump的文件行.
5. 给个比如
test.c
void a()
{
char *p = NULL;
printf(“%d/n”, *p);
}
int main()
{
a();
return 0;
}
编译 gcc -g -o test test.c
运转 ./test
报segmentaTIon fault(core dump)
gdb ./test test.core假如生成的是test.core.