2011-08-22 2 views
5

私は現在、私のチームが取り組んでいる大規模で複雑なプロジェクトで直面した最も悪いバグの1つに直面しています。私たちはプログラミング言語としてC++を使用しています。現在は、Visual Studio for developmentを使用していますが、最終製品はクロスプラットフォームで動作するように設計されています。一見ランダムなクラッシュを引き起こす状態破損バグの記述と発見

バグ:

実行の一見ランダムな点でのクラッシュをトリガし、当社のシステムにバグがあります。クラッシュの原因は通常、プログラムが実行されるたびに変化するアドレスの読み取りアクセス違反です。時にはヒープ破損エラーも発生することがあります。コールスタックは、私たちのコードベースの変種ポイントにつながり、まれにバグが存在しないいくつかの外部ライブラリ(私たちの場合はLua)につながります。

このバグが過去4ヶ月間にわたって発生しているようです。その時間の前に、大体、私のチームメンバーの何人かは、フロントエンドプログラムがマナーと場所でクラッシュし、現在起こっていることに非常に似ているのを見ました。

いくつかの詳細:

私たちのコードベースが大きい(コメントは除く)++の純粋なCの約800K行で、3年の歳月をかけて開発されました。 現在のプロジェクトの重量は約300Kです。私たちは過度のユニットテストや他の方法でアサーションやスマートポインタなどが発生する前にバグを解消しています。

他の人と私はこのバグを2週間以上見つけようとしています。それは私のために悪夢以上になってきています。このような複雑なプロジェクトでは、現在の複雑さに直面して、古いprintfデバッグも失敗するようです。

私の質問我々はここに直面しているバグはどのような

  • ?これには名前がありますか?この種のバグは、他の大規模なプロジェクトで多かれ少なかれ発生しますか?

  • さまざまなユーティリティ、さまざまなプラットフォーム、さまざまなビルド設定を使用して、2週間の無駄なデバッグを行った後で、何を見つけることができますか?

(私の以前の質問は閉鎖されたので、私はより良い、より詳細で、この時間は、それを定式化するために、リンクしようとしています:https://stackoverflow.com/questions/7154645/how-is-this-kind-of-bug-called

+0

Arfでは、散発的なバグが最悪です。デバッグツールの使用方法を学ぶ時間。 –

答えて

8

あなたが記述の症状は(ヒープ破損の典型的ではありませんがヒープの破損はすべてエラーメッセージとともに報告されます!)。プログラム内のすべてのオブジェクトの有効期間を監査する必要があります。あなたが物事を2回解放していないことを確認するか、解放後に使用して、バッファーがあふれていないことを確認してください。この機会にstd::smart_ptr(またはboost::smart_ptr)のようなものを使用して、ヒープ管理の一部を自動化することができます。

LinuxまたはMac OSの場合は、valgrindの下でプログラムを実行してください。ヒープとスタックの破損エラーが多数検出されます。 Windowsでは、application verifierを使用します。エラーが実際に発生した時点に近いクラッシュを引き起こすのを助けることができます。

スレッドを使用している場合は、ヒープの破損につながる競合状態が考えられます。あなたのロック機構も監査してください。

このバグを簡単に再現し、ソース管理システムを設置している場合は、導入時の正確な時期を判断するための二分法を検討してください。つまり、バグの最初のコミットを見つけるために、ソースコードの履歴をバイナリ検索します。 Gitにはこれを自動的に行うツールがあります。git-bisect - gitをまだ使用していない場合は、gitにリポジトリのコピーをインポートしてこのツールを実行できます。

また、プログラムの一部を無効にして(問題のコードがまったく呼び出されないように)、問題の絞り込みを試みることができます。モジュールXを無効にしてクラッシュを止めると、モジュールXがヒープを破壊している可能性があります。あるいは、モジュールWがヒープを破損している可能性があります。モジュールXはそれを気付いたばかりです。

+1

非常に良い点があります。ただし、散発的な散発的なバグは非常に難しいことに注意してください。 – Owen

+0

@Owen、それで "もしあなたが簡単に再現できれば" .../ – bdonlan

+0

ああ、それは逃した。 – Owen

0

Bdonlanの優れた答えを補完するだけです。Windows用のコードを開発し、大きなプロジェクトで作業しているので、「高度なWindowsデバッグ」ブックを購入し、WinDbg、AppVerifierなどのツールを知っておくことを強くお勧めします。それは投資の価値があるでしょう。 この本では、全体の章でヒープの破損を徹底的に扱っています。これは(前の回答ですでに述べたように)おそらくあなたが直面している問題です。

関連する問題