Linux下段错误的处理方法

来源:互联网 发布:数据库sql2000下载地址 编辑:程序博客网 时间:2024/05/21 22:27
使用Core文件找出代码出错的地方:
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 unlimitedroot@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-ubuntuCopyright (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.6Reading symbols from /lib/ld-linux.so.2...(no debugging symbols found)...done.Loaded symbols for /lib/ld-linux.so.2Core was generated by `./send'.Program terminated with signal 11, Segmentation fault.#0  0x080486ca in main () at send.c:1717a->type = 1;(gdb) 

代码出错的位置就显示出来了,要是还不出来先run,再where:
(gdb) runStarting program: /media/work/test/msg/send Program received signal SIGSEGV, Segmentation fault.0x080486ca in main () at send.c:1717a->type = 1;(gdb) where#0  0x080486ca in main () at send.c:17(gdb) 



0 0