c/c++g++デフォルトのコンパイル呼び出しは成功したが、O 2最適化はSegmentation faultが発生した.


一、背景:
通常のデフォルトのコンパイルでは、呼び出しは成功し、エラーは発生せず、呼び出しは成功しました.
しかしO 2最適化条件下でSegmentation faultエラーが発生した.
これは、通常、コードにメモリエラーアクセスがあることを示します.
二、検出コード発生Segmentation faultの位置:
二つの方法
第1種
1.コンパイルコード追加-gパラメータ
2.ulimit-c unlimitedコードをSegmentation faultにすると現在位置でcoreファイルが生成されます
3.gdb a.out core
4.bt印刷方法スタック
第2種
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もう限界だ.しかし、このような低級なエラーは、作成中に無視される可能性があります.
しかし、このようなコードは、完全なコードコンパイルの場合、O 2最適化時にのみエラーが発生するため、エラーが発生すると、自分でも何の見当もつかない可能性があります.コードの境界を越えた問題と、コードの問題を一歩一歩位置決めする場合に注意しなければならない.
正しいコードは次のとおりです.
char *header[2];
header[0] = "Content-type:application/json";
header[1] = NULL;