使用Core文件找出代码出错的地方:
代码出错的位置就显示出来了,要是还不出来先run,再where:
Linux下的C程序常常会因为内存访问错误等原因造成segment fault(段错误),此时如果系统core dump功能是打开的(默认不打开),那么将会有内存映像转储到硬盘上来,之后可以用gdb对core文件进行分析,还原系统发生段错误时刻的堆栈情况。这对于我们发现程序bug很有帮助。
使用ulimit -a可以查看系统core文件的大小限制;使用ulimit -c [kbytes]可以设置系统允许生成的core文件大小,例如
ulimit -c 0 不产生core文件
ulimit -c 100 设置core文件最大为100k
ulimit -c unlimited 不限制core文件大小
编译文件时候带上-g 加上调试信息,后面要用到gdb调试器来找出段错误的位置。
设置不限制core文件大小:
root@ubuntu:/media/work/test/msg# ulimit -c unlimited
root@ubuntu:/media/work/test/msg#
运行程序,生成core文件:
root@ubuntu:/media/work/test/msg# ./send
段错误 (core dumped)
用gdb调试可执行文件和core:
root@ubuntu:/media/work/test/msg# gdb send core
GNU gdb (GDB) 7.1-ubuntu
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /media/work/test/msg/send...done.
[New Thread 28805]
warning: Can't read pathname for load map: 输入/输出错误.
Reading symbols from /lib/tls/i686/cmov/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/tls/i686/cmov/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 `./send'.
Program terminated with signal 11, Segmentation fault.
#0 0x080486ca in main () at send.c:17
17 a->type = 1;
(gdb)
代码出错的位置就显示出来了,要是还不出来先run,再where:
(gdb) run
Starting program: /media/work/test/msg/send
Program received signal SIGSEGV, Segmentation fault.
0x080486ca in main () at send.c:17
17 a->type = 1;
(gdb) where
#0 0x080486ca in main () at send.c:17
(gdb)