$ 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 。
没有评论:
发表评论