1. 程式人生 > >c/c++ g++預設編譯呼叫成功,O2優化卻發生Segmentation fault

c/c++ g++預設編譯呼叫成功,O2優化卻發生Segmentation fault

一、背景:

正常預設編譯下,呼叫成功,沒有發生任何錯誤,呼叫成功。

但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;