浅谈linux下core文件

何谓core文件

    当一个程序崩溃时,在进程当前工作目录的core文件中复制了该进程的存储图像。core文件仅仅是一个内存映象(同时加上调试信息),主要是用来调试的。

何时生成core文件

    当程序接收到某些UNIX信号并崩溃时产生core文件。具体哪些信号会产生core文件,在《unix环境高级编程》这本书的第十章第10.2节有介绍的。请查阅。

core文件的作用

    几乎所有C程序员都出现过的错误就是“segmentation fault”了。也是最难查出问题原因的一个错误。由于程序崩溃时会生成复制了程序的存储镜像的core文件,这个文件会记录下程序出现崩溃的地方,用来供我们调试代码。

使用core文件调试代码

示例代码:

#include<stdlib.h>
char *str = "test";

void test()
{
    str[1] = 'T';
}

void main()
{
    test();

    return;
}


编译连接:

root@ubuntu:/home/yl/share/code/apue/chap10# gcc -g core_dump_test.c -o core_dump_test
如果需要调试程序的话,使用gcc编译时加上-g选项,这样调试core文件的时候比较容易找到错误的地方。


执行程序:

root@ubuntu:/home/yl/share/code/apue/chap10# ./core_dump_test
Segmentation fault (core dumped)
可以看到出现了“段错误”,查看当前目录下没有生成core文件,这是因为系统默认core文件的大小为0,所以没有创建。可以用ulimit命令查看和修改core文件的大小。


用ulimit修改对core文件的设置为不要对其进行限制:

root@ubuntu:/home/yl/share/code/apue/chap10# ulimit -c unlimited
root@ubuntu:/home/yl/share/code/apue/chap10# ulimit -c
unlimited

这个时候可以看到当前目录下生成了core文件:

root@ubuntu:/home/yl/share/code/apue/chap10# ls
core_dump_test   core   core_dump_test.c


调式core文件
       core文件是个二进制文件,需要用相应的工具来分析程序崩溃时的内存映像。先查看下这个文件的属性:

root@ubuntu:/home/yl/share/code/apue/chap10# file core
core: ELF 32-bit LSB core file Intel 80386, version 1 (SYSV), SVR4-style, from './core_dump_test'


用gdb调试工具调试:

root@ubuntu:/home/yl/share/code/apue/chap10# gdb core_dump_test core
GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /home/yl/share/code/apue/chap10/core_dump_test...done.
[New LWP 3091]

warning: Can't read pathname for load map: Input/output error.
Core was generated by `./core_dump_test'.
Program terminated with signal 11, Segmentation fault.
#0  0x080483bf in test () at core_dump_test.c:6
6           str[1] = 'T';
(gdb) where
#0  0x080483bf in test () at core_dump_test.c:6
#1  0x080483cc in main () at core_dump_test.c:11
(gdb) 

GDB中键入where,就会看到程序崩溃时堆栈信息(当前函数之前的所有已调用函数的列表(包括当前函数),gdb只显示最近几个),我们很容易找到我们的程序在最后崩溃的时候调用了core_dump_test.c 第7行的代码,导致程序崩溃。注意:在编译程序的时候要加入选项-g。您也可以试试其他命令, 如 fram、list等。更详细的用法,请查阅GDB文档。

core文件创建在什么位置
       在进程当前工作目录的下创建。通常与程序在相同的路径下。但如果程序中调用了chdir函数,则有可能改变了当前工作目录。这时core文件创建在chdir指定的路径下。有好多程序崩溃了,我们却找不到core文件放在什么位置。和chdir函数就有关系。当然程序崩溃了不一定都产生core文件。

什么时候不产生core文件
在下列条件下不产生core文件:
( a )进程是设置-用户-ID,而且当前用户并非程序文件的所有者;
( b )进程是设置-组-ID,而且当前用户并非该程序文件的组所有者;
( c )用户没有写当前工作目录的许可权;
( d )文件太大。core文件的许可权(假定该文件在此之前并不存在)通常是用户读/写,组读和其他读。


利用GDB调试core文件,当遇到程序崩溃时我们不再束手无策。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值