c/c++ g++默认编译调用成功,O2优化却发生Segmentation fault

3/8/2017来源:ASP.NET技巧人气:994

一、背景:

正常默认编译下,调用成功,没有发生任何错误,调用成功。

但O2优化条件下,却发生了Segmentation fault错误。

这一般表明代码存在内存错误访问的情况。

二、检测代码发生Segmentation fault的位置:

两种方式

第一种

1.编译代码添加-g参数

2.ulimit -c unlimited,使代码发生Segmentation fault的时候会在当前位置生成core文件

3.gdb a.out core

4.bt 打印方法栈

第二种

1.编译代码添加-g参数

2.gdb a.out

3.bt打印segment fault时的方法栈

三、定位可能发生的变量

从第一行函数调用的位置开始查看,

如果该位置并不是自己所编写的代码,或者是以前已经经过测试的代码,那一般可以跳过,不过需要注意这些函数的参数是否是自己传递过来的

对于是自己所编写的代码,那就应该进行到该代码位置,然后查看调用该函数的时候,自己所初始化的变量是否正确(一般错误就是自己所初始化的这些变量出现了问题,可能是由于自己编写代码的时候没注意,实际可能是简单的笔误而已)

四、本人的情况

char *header[2];
header[1] = "Content-type:application/json";
header[2] = NULL;相信看到这段代码,已经知道这代码初始化时错误的,header下标是0,1。2已经是越界了。但就是这么低级的错误,可能在编写的过程中,也会被忽略。

但是这样的代码却在完整代码编译的情况,只在O2优化的时候才会出错,因此一旦发生错误,自己也可能毫无头绪。所以更应该注意代码越界问题,和如果一步步定位代码问题。

正确代码如下:

char *header[2];
header[0] = "Content-type:application/json";
header[1] = NULL;