Chinaunix首页 | 论坛 | 博客
  • 博客访问: 899282
  • 博文数量: 119
  • 博客积分: 2493
  • 博客等级: 大尉
  • 技术积分: 2363
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-03 14:00
文章分类

全部博文(119)

文章存档

2013年(19)

2012年(100)

分类: LINUX

2012-08-28 20:42:25

一,什么是core文件?什么是core dump?为什么要提出这?



Gdb手册上是这么描述core文件的定义的A core file or core dump is a file 

that records the memory image of a running process and its process 

status(register values etc...)



Core文件理解:当一个进程崩溃时,在该进程会在指定目录生成一个core文件

用来记录该进程崩溃时的内存映像,并附带了一些调试信息。该文件主要供

调试使用。



  (1)在软件开发中,很多bug只能在特定的环境和条件下才能出现,重现的时机

和条件都很难把握。有可能出现很多次测试后该问题才重现一次。这就给调试带

来了很多不便。

  (2)还有一种情形,就是软件的代码量比较大,如果靠设断点和单步跟踪也很

麻烦,起码很费时间。

    为了解决上面的两个问题,就提出了core dump技术,在程序崩溃的时候,将

程序的内存映像保存到一个core文件中去,然后通过分析这个core文件来找到程序

崩溃的原因。
----------------------------------------------------------------


二,怎么查看系统是否打开生成core文件的功能?没有开启又该如何开启?



可以使用ulimit命令查看。

#ulimit -a

core file size (blocks, -c) 0

data seg size (kbytes, -d) unlimited

file size (blocks, -f) unlimited

max locked memory (kbytes, -l) 4

max memory size (kbytes, -m) unlimited

open files (-n) 2048

pipe size (512 bytes, -p) 8

stack size (kbytes, -s) 10240

cpu time (seconds, -t) unlimited

max user processes (-u) 7168

virtual memory (kbytes, -v) unlimited



core file size (blocks, -c) 0说明core文件的最大大小为0,说明core dump

没有开启。可以使用ulimit -c unlimited来开启core dump

---------------------------------------------------------------


三,如何设置core dump文件名及其文件位置?



/proc/sys/kernel/core_uses_pid 这个文件内容为0的话,所有core dump文件

名都是core,没有扩展名;内容为1的话,文件名编程core.pid,即加上进程号作

为扩展名。



  sudo echo "1" > /proc/sys/kernel/core_uses_pid 修改该参数。




还可以通过修改/proc/sys/kernel/core_pattern来指定core dump文件位置和文件名,

此文件内容改为/tmp/coredumpfile/core-%e-%p-%t,表示所有的core dump都放在/tmp/coredumpfile目录下,文件名为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 添加命令名
----------------------------------------------------------------------------

四,如何使用gdb来调试core文件?



gdb [选项被调试的可执行文件 core文件


执行该命令,gdb会产生生成该core文件的进程名,中断该进程的信号等。



     当进程接收到一下UNIX信号时会产生core文件。




    SIGABRT :调用abort函数产生该信号,进程异常终止。

    SIGFPE:该信号表示一个算术运算异常,例如除以0,浮点数溢出等。

    ...

-----------------------------------------------------------------------------


五,实例:(通过除数为0制造出core dump)


  1. #include <stdio.h>

  2. int wib(int no1, int no2)
  3. {
  4.   int result, diff;
  5.   diff = no1 - no2;
  6.   result = no1 / diff;
  7.   return result;
  8. }

  9. int main(int argc, char *argv[])
  10. {
  11.   int value, div, result, i, total;

  12.   value = 10;
  13.   div = 6;
  14.   total = 0;

  15.   for(i = 0; i < 10; i++)
  16.   {
  17.     result = wib(value, div);
  18.     total += result;
  19.     div++;
  20.     value--;
  21.   }
  22.   
  23.   printf("%d wibed by %d equals %d\n", value, div, total);
  24.   return 0;
  25. }

  1. root@linux:/home/linux/dir# gdb -q a.out core.2075
  2. Reading symbols from /home/linux/dir/a.out...(no debugging symbols found)...done.
  3. [New LWP 2075]
  4. Core was generated by `./a.out'.
  5. Program terminated with signal 8, Arithmetic exception.
  6. #0 0x080483e1 in wib ()
  7. (gdb) lbt
  8. Undefined command: "lbt". Try "help".
  9. (gdb) bt
  10. #0 0x080483e1 in wib ()
  11. #1 0x0804842b in main ()
  12. (gdb)
通过调试core文件,可以很清楚地看到。是由signal 8这信号将进程中断了,


中断的原因是 Arithmetic exception


而且通过bt指令可以看到出现异常的函数是在执行wib函数时出现的。

--------------------------------------------------------------------------------

参考:

http://blog.163.com/hancker_31/blog/static/3558736120103752651164/
















阅读(3446) | 评论(2) | 转发(0) |
1

上一篇:GCC编译选项

下一篇:tcpdump

给主人留下些什么吧!~~

zhe_wang2012-09-11 09:21:50

licong0527: 如果不修改配置文件,那么core文件在那个目录下呢?.....
当前目录

licong05272012-09-11 09:10:54

如果不修改配置文件,那么core文件在那个目录下呢?