Segmentation fault (core dumped) --段错误

      有些时候我们在一段 C/C++ 代码的时候,由于对一个非法内存进行了操作,在程序运行的过程中,出现了“Segmentation fault (core dumped)”——段错误。

Segmentation fault (core dumped) --段错误

    段错误就是指访问的内存超出了系统所给这个程序的内存空间。

       在编程中以下几类做法容易导致段错误,基本上是错误地使用指针引起的。

1) 访问系统数据区,尤其是往系统保护的内存地址写数据,最常见就是给一个指针以0地址。

2) 内存越界( 数组越界,变量类型不一致等):访问到不属于你的内存区域。

    解决方法

在程序中找出段错误的地方常用的两种方法:

1、通过在程序中使用printf()函数来定位;

2、使用gdb调试来定位问题所在;

接下来,给大家介绍通过gdb快速定位“段错误”的位置

1)首先,要确保安装了gdb调试工具,在终端可通过“which gdb”查看:

Segmentation fault (core dumped) --段错误

2)编译C/C++代码,加上 -g 参数,代表在可执行文件中加入标准调试信息。

       Segmentation fault (core dumped) --段错误

     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 文件生成的位置一般于运行程序的路径相同。

Segmentation fault (core dumped) --段错误

3)用gdb来调试core文件:gdb 1 core,快速定位“段错误”的位置。

Segmentation fault (core dumped) --段错误

4)在gdb字符界面中敲“where”查看更详细信息,可查看到段错误出现在main函数的第6行。

Segmentation fault (core dumped) --段错误