Segmentation fault (core dumped) --段错误
有些时候我们在一段 C/C++ 代码的时候,由于对一个非法内存进行了操作,在程序运行的过程中,出现了“Segmentation fault (core dumped)”——段错误。
段错误就是指访问的内存超出了系统所给这个程序的内存空间。
在编程中以下几类做法容易导致段错误,基本上是错误地使用指针引起的。
1) 访问系统数据区,尤其是往系统保护的内存地址写数据,最常见就是给一个指针以0地址。
2) 内存越界( 数组越界,变量类型不一致等):访问到不属于你的内存区域。
解决方法
在程序中找出段错误的地方常用的两种方法:
1、通过在程序中使用printf()函数来定位;
2、使用gdb调试来定位问题所在;
接下来,给大家介绍通过gdb快速定位“段错误”的位置。
1)首先,要确保安装了gdb调试工具,在终端可通过“which gdb”查看:
2)编译C/C++代码,加上 -g 参数,代表在可执行文件中加入标准调试信息。
3)接着通过"./"运行可执行程序,如果出现“段错误”,正常情况下会在程序同级目录下生成一个core文件。有些环境却不会生成core文件(如Ubuntu),core文件仅仅是一个内存映像(同时加上调试信息),主要用来调试的。
在ubuntu14.04环境下测试:
C测试代码如下:
#include <stdio.h>
int main(int argc,char** argv)
{
int *i = NULL;
*i = 250;
return 0;
}
1)ubuntu系统在出现段错误不会在当前目录下生成core文件,但是可以在执行程序前执行如下命令即可:
ulimit -c unlimited
2)现在运行可执行文件就可以生成core文件,core 文件生成的位置一般于运行程序的路径相同。
3)用gdb来调试core文件:gdb 1 core,快速定位“段错误”的位置。
4)在gdb字符界面中敲“where”查看更详细信息,可查看到段错误出现在main函数的第6行。