c/c++ g++預設編譯呼叫成功,O2優化卻發生Segmentation fault
阿新 • • 發佈:2019-01-22
一、背景:
正常預設編譯下,呼叫成功,沒有發生任何錯誤,呼叫成功。
但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;