Segmentation fault (core dumped)出错原因及位置分析

来源:互联网 发布:爱奇艺网络机顶盒版 编辑:程序博客网 时间:2024/06/06 05:46

一 Segmentation fault (core dumped)原因

Segmentation fault (core dumped)多为内存不当操作造成。空指针、野指针的读写操作,数组越界访问,破坏常量等。如最近的势能图代码中的链表操作,对链表的新增和释放包括赋值等等,如出现不当操作都有可能造成程序崩溃。对每个指针声明后进行初始化为NULL是避免这个问题的好办法。排除此问题的最好办法则是调试。

二 解决办法

1、使用gdb查看core文件

在程序崩溃后在目录中会产生core.xxxx文件,core文件中包含着出错信息。如果没有core文件,是因为系统设置了core文件大小为0。通过命令ulimit -a即可查询到。在执行ulimit -c unlimited命令后,core文件大小就不受限制。此时再次运行程序后目录中出现core.xxxx文件。用gdb ./file core.xxxx可查看出错所在行信息了。其中file为原执行的程序名。

2、使用gdb调试程序

如上述流程不能解决问题,下面可使用gdb单步调试程序。重新编译程序,编译命令中加入-g。如:
gcc -lm -O3 -g file.c -o file
之后使用gdb命令
gdb file
开始调试过程。


输入start使程序运行到main中第一行运行代码。next或者n为执行下一行程序,until xx执行到xx行,print或p可输出变量值,b xx用于在xx行设置断点,run或r用于执行程序至下一断点,d xx删除xx行断点。
我们可以先run一遍程序,这时它会提示出错行信息。然后until到出错行前5行,交替执行next和print,输出与出错行变量相关变量或指针的值。最终定位出错的根本操作在哪一行。修改之即可。


这次段冲突bug调试了整整一天,最终找出出错在两条链表新增表尾后错将chain1的新增节点指针给了chain2。导致第二次循环时malloc函数出错。在copy重复代码时一定要注意变量名的修改- -!