一、背景:
正常默認編譯下,調用成功,沒有發生任何錯誤,調用成功。
但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;
新聞熱點
疑難解答
圖片精選