2011-11-10 8 views
1

私は最近Linux C++アプリケーションをWindowsに移植しました(Visual Studio 2010 C++ express経由)。このプロセスでは、Windowsの実行可能ファイルが、コード内の微妙なバグを拾い、プログラムをクラッシュさせる傾向にあることに気付きました。しかし、Linux/GCCでは同じコードとバグが気付かず、プログラムは引き続き楽しく実行されます。私は移植しようとした過去のプログラムでこの動作を見てきました。私のコードのバグの例は、1要素で配列を渡すことです。実行時エラーのキャッチを改善するためのGCCフラグ?

GCCでランタイムエラーをキャッチするためにどのようなフラグを有効にできますか?ごくわずかな実行時のバグに遭遇したとき、私のプログラムはWindows版ほど揮発性でないようにしたい。それとも、これはOSに依存し、ユーザーのコントロールから外れていますか?

+0

スタティックバージョン:http://stackoverflow.com/questions/8686808/is-there-any-compiler-option-in-gcc-to-check-for-memory-errors –

答えて

1

私のコードのバグ例は、1要素で配列を渡して書いています。

通常、このようなバグはValgrindによって簡単に検出されます。このようなバグが疑われる時にはValgrindのコードを常にチェックすることをお勧めします。デバッグ中に多くの時間を節約します。

0

-fstack-protector-all + valgrindはおそらく必要なものです。

$ cat 1.c 
int main() { 
    char data[10]; 
    int x; 
    data[10] = 'x'; 
    return 0; 
} 
$ gcc 1.c && ./a.out  
$ gcc -fstack-protector-all 1.c && ./a.out 
Abort trap 

ヒープ上の問題のため、後者のチェック:前者は細かいスタックの破損に役立ちます。

+0

私が探していたもの!私はValgrindを避ける傾向があります。なぜなら、私は欠陥を見つけるために忍耐を待つことができないからです。デフォルトでは、私のプログラムは100倍遅くなっているように感じます。 – Nghia

+0

スタックプロテクターは一定のオーバーヘッドも課していますが、バググリンドよりもはるかに目立ちません。しかし、スタックプロテクター自体は、その名前が示すように、ヒープ上ではなくスタック上に割り当てられたオブジェクトに関する問題のみをカバーします。しかし、私はちょうどあなたがvalgrindよりも少ないオーバーヘッドを課すかもしれないヒープエラーチェックのための特別なアロケータを使用するかもしれないと考えました。 dmalloc(http://dmalloc.com/)およびlibxalloc(http://shh.thathost.com/pub-unix/#xalloc)を参照してください。 –

関連する問題