一、背景:
正常默认编译下,调用成功,没有发生任何错误,调用成功。
但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;
新闻热点
疑难解答
图片精选