2011-06-23 1 views
2

私のプロジェクトのバグが進化しているようです。当初はプログラムのクラッシュの原因はデバッガ(プログラムがクラッシュした後に指し示す行)を使用して簡単に見つけ出すことができましたが、今は異なっています。C++:デバッガの誤解をもたらす複雑なバグ

バグの多くは、プログラムが完全に恣意的な場所でもクラッシュする原因になります。

  • デバッガの「隠れ」をより良い方法で見つけ出すにはどうすればよいですか?

(Iは、Visual Studio 2010を使用)

答えて

1

gflagsやデバッグヒープなどのメモリ破損チェックユーティリティを使用します。 「フローティング」クラッシュは、ほとんど常にC++プログラムの破損したメモリに由来します。

2

根本原因の分析。

明白なバグを見つけたら、バグを修正して、それを許可したコーディングスタイルを修正しないでください。

+0

*コーディングスタイル*は、明らかに、C関数の後に1つの項目でLuaスタックを乱雑にしていました。 – Komn

+0

+1、私はこのアドバイスを本当に好きです。 – AShelly

+0

@Komn:その場合、エントリにLuaスタックの深さを保存し、それが返されたときにそれを確認するRAIIオブジェクトで捕まえた可能性があります。リリースビルドでは、小切手をスキップすることができます。次に、Luaのスタック操作関数を直接呼び出すのではなく、このRAIIスタックチェッカーを使用するコーディングスタイルを採用することで、問題が非常に簡単に見つかりました。 –

1

生メモリとポインタを使用するコードがある場合は、std :: vectorとそのイテレータを使用して割り当てられたメモリで置き換えます。リリースモードでは、まったく同じ速いコードにコンパイルされますが、デバッグモードでは、チェックイテレータが使用されます。できるだけ早くいくつかのバグをキャッチします。

関連する問題