2010年5月7日星期五

使用gdb和core进行调试

最近在学 gdb ,而在此之前一直听到有人说在程序崩溃的时候可以 core dump,跟着用 gdb 来调试。但是我自己调试程序时并不会生成 core ,为什么呢?原来系统默认不生成 core 文件,如果要在程序崩溃的时候生成 core 则要手动去调整。为了生成 core 文件,可以使用下面的命令:

$ ulimit -c unlimited

意思是不限制生成的 core 文件的大小。当然还有一些限制,这里先不深入,以后有机会再研究。
现在程序崩溃的时候就会生成 core 了。那怎么使用 gdb 和 core 呢?看下面的例子。
源程序如下(前面的行号是自己添加上去的):

1 #include < stdio.h >
2 #include < string.h >
3
4 int test()
5 {
6 char* string = NULL;
7 printf("%d\n", strlen(string));
8 return 0;
9 }
10
11 int main()
12 {
13 test();
14 return 0;
15 }

如果要配合 gdb 使用,在用 gcc 编译代码时需加上 -g 选项。

$ gcc -g test.c -o test

编译完成后运行

$ ./test
$ Segmentation fault (core dumped)

后面的 core dumped 表明生成了 core 文件。

$ gdb ./test core

主要提示如下:

Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/ld-linux.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib/ld-linux.so.2
Core was generated by `./test'.
Program terminated with signal 11, Segmentation fault.
#0 0xb7629713 in strlen () from /lib/libc.so.6

可以看出问题应该是出现在 strlen 上,但具体是哪里呢?

(gdb) where
#0 0xb7629713 in strlen () from /lib/libc.so.6
#1 0x080483ec in test () at test.c:7
#2 0x08048411 in main (argc=1, argv=0xbfc0cbd4) at test.c:13

哦,原来运行到第7行时出现 Segmentation fault 了

(gdb) list 7
2 #include < string.h >
3
4 int test()
5 {
6 int *string = NULL;
7 printf("%d\n", strlen(string));
8 return 0;
9 }
10
11 int main(int argc, const char *argv[])

显然,使用了值为 NULL 的 string 作为 strlen 的参数导致了 segmentation fault 。

没有评论: