Unix/Linux使用core文件调试程序

Linux系统中在应用程序运行过程中经常会遇到程序突然崩溃,提示:Segmentation fault,这是因为应用程序收到了SIGSEGV信号。这个信号提示当进程发生了无效的存储访问,当接收到这个信号时,缺省动作是:终止w/core。 终止w/core的含义是:在进程当前目录生成core文件,并将进程的内存映象复制到core文件中,core文件的默认名称就是“core”(这是Unix类系统的一个由来已久的功能)。

事实上,并不是只有SIGSEGV信号产生coredump,还有下面一些信号也产生:

SIGFSZ

超过晚间长度限制

.       .

 .      .

终止w/core

SIGABRT

异常终止(abort)

  .       .

  .      .

终止w/core

SIGBUS

硬件故障

          .

  .      .

终止w/core

SIGEMT

硬件故障

 

  .      .

终止w/core

SIGFPE

算术异常

  .       .

  .      .

终止w/core

SIGILL

非法硬件指令

  .       .

  .      .

终止w/core

SIGIOT

硬件故障

 

  .      .

终止w/core

SIGQUIT

终端退出符

          .

  .      .

终止w/core

SIGSEGV

无效存储访问

  .       .

  .      .

终止w/core

SIGSYS

无效系统调用

 

  .      .

终止w/core

SIGTRAP

硬件故障

 

  .      .

终止w/core

SIGXCPU

超过CPU限制(setrlimit)

 

  .      .

终止w/core


使用core文件调试程序:
程序实例:使用比较简单的例子算数异常(SIGFPE)来学习怎么调试程序。
代码如下:
/*core_dump_test.c*/
#include <stdio.h>
int main(){
  int p=2;   
  int q=1;
  printf("result=%d\n",p/q);
  return 0;
}

编译:

gcc –g core_dump_test.c -o core_dump_test

如果需要调试程序的话,使用gcc编译时加上-g选项,这样调试core文件的时候比较容易找到错误的地方。

执行:

./core_dump_test

显示:Floating exception (core dumped)。

运行core_dump_test程序出现了“算数除法异常”,但没有产生core文件。这是因为系统默认core文件的大小为0,所以没有创建。可以用ulimit命令查看和修改core文件的大小。

ulimit -c 0
ulimit -c 1000
ulimit -c 1000

-c 指定修改core文件的大小,1000指定了core文件大小。也可以对core文件的大小不做限制,如:

ulimit -c unlimited
ulimit -c unlimited

调式core文件

core文件是个二进制文件,需要用相应的工具来分析程序崩溃时的内存映像。

file core

core:           ELF 32-bit LSB core file 80386 Version 1, from 'core_dump_test'
显示产生core文件的进程名称: core_dump_test。

然后在Linux下可以用GDB来调试core文件:

gdb core_dump_test core
GNU gdb 6.6
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-pc-solaris2.10"...
Reading symbols from /usr/lib/libc.so.1...done.
Loaded symbols for /usr/lib/libc.so.1
Reading symbols from /lib/ld.so.1...done.
Loaded symbols for /lib/ld.so.1
Core was generated by `./core_dump_test'.
Program terminated with signal 8, Arithmetic exception.
#0  0x080506d5 in main () at core_dump_test.c:6
6         printf("result=%d\n",p/q);
(gdb) 
显示相关的版本信息及出现错误的文件名称及位置,然后查看错误修改即可。









你可能感兴趣的:(Unix/Linux使用core文件调试程序)