在Linux下产生并调试core文件(转)

 

先看看我用的是个什么机器:

 

$ uname -a

Linux dev 2.4.21-9.30AXsmp #1 SMP Wed May 26 23:37:09 EDT 2004 i686 i686 i386 GNU/Linux

 

在一般Linux系统中,默认是不会产生core dump文件的。

通过ulimit -c来查看core dump文件的大小,一般core file size是0,程序出错时不会产生core文件。

可以设置core文件大小,ulimit -c 1024(kbytes单位)或者ulimit -c unlimited。

 

 

$ 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文件是不是会被产生。 $ more foo.c #include <stdio.h> static void sub(void); int main(void) { sub(); return 0; } static void sub(void) { int *p = NULL; /* derefernce a null pointer, expect core dump. */ printf("%d", *p); }  

 

$ gcc -Wall -g foo.c

$ ./a.out

Segmentation fault

 

$ ls -l core.*

ls: core.*: No such file or directory

 

没有找到core文件,我们改改ulimit的设置,让它产生。1024是随便取的,要是core文件大于1024个块,就产生不出来了。

 

$ ulimit -c 1024

 

$ ulimit -a

core file size (blocks, -c) 1024

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

 

$ ./a.out

Segmentation fault (core dumped)

$ ls -l core.*

-rw------- 1 uniware uniware 53248 Jun 30 17:10 core.9128

 

注意看上述的输出信息,多了个(core dumped)。确实产生了一个core文件,9128是该进程的PID。我们用GDB来看看这个core。

 

$ gdb --core=core.9128

GNU gdb Asianux (6.0post-0.20040223.17.1AX)

Copyright 2004 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-asianux-linux-gnu".

Core was generated by `./a.out'.

Program terminated with signal 11, Segmentation fault.

#0 0x08048373 in ?? ()

(gdb) bt

#0 0x08048373 in ?? ()

#1 0xbfffd8f8 in ?? ()

#2 0x0804839e in ?? ()

#3 0xb74cc6b3 in ?? ()

#4 0x00000000 in ?? ()

 

此时用bt看不到backtrace,也就是调用堆栈,原来GDB还不知道符号信息在哪里。我们告诉它一下:

 

(gdb) file ./a.out

Reading symbols from ./a.out...done.

Using host libthread_db library "/lib/tls/libthread_db.so.1".

(gdb) bt

#0 0x08048373 in sub () at foo.c:17

#1 0x08048359 in main () at foo.c:8

 

此时backtrace出来了。

 

(gdb) l

8         sub();

9         return 0;

10     }

11

12     static void sub(void)

13     {

14         int *p = NULL;

15

16         /* derefernce a null pointer, expect core dump. */

17         printf("%d", *p);

(gdb)

 

 

core dump文件默认输出在当前目录,文件名是core.进程号

 

可以通过echo "1" > /proc/sys/kernel/core-user-pid使core文件名加上pid号

 

可以用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 添加命令名

 

 

参考

http://www.zedware.org/code/code-coredump.html

http://blog.csdn.net/wen0006/archive/2009/02/28/3945845.aspx

 

 

你可能感兴趣的:(linux,unix,File,null,insert,Signal)