2009-05-25 11 views
2

現在、大きなデータセットを処理するWindows XPのC++プログラムで作業しています。最大の入力ファイルは、エラーメッセージの種類なしでプログラムが予期せず終了する原因となります。興味深いことに、プログラムが私たちのIDE(Code :: Blocks)から実行されると、ファイルはそのような問題なしに処理されます。IDEの外で実行するとプログラムがクラッシュする

データが処理されるにつれて、ツリー構造に配置されます。計算が終了すると、データはOpenGLでレンダリングされる前にC++ STLベクタに移動されます。

私はこのクラッシュを引き起こしている可能性についていくつかの洞察を得ることを望んでいました。私はすでに新しいユーザーであるため、リンクを投稿できない別の投稿をチェックアウトしました。このポストの問題は、私のものと非常によく似ていて、配列の範囲外インデックスから生じました。しかし、私はそのような範囲外のエラーは起こっていないと確信しています。

おそらく、データセットのサイズがベクトルのためのスペースを割り当てるときに問題につながっているのだろうかと思います。私がプログラムをテストしているシステムでは、理論上、データを処理するのに十分なメモリが必要です(2GBのRAMと約1GBのデータを格納したデータセット)。もちろん、メモリが使用されている場合、STLベクトルは、容量に達すると、割り当てられたスペースを単純に2倍にします。

おかげで、エリック

+0

IDEの外でアプリを実行すると、それを再コンパイルするのですか? デバッグビルドを実行していますか? – cbrulak

+0

私はデバッグビルドとリリースビルドの両方を試しましたが、どちらも同じ結果をもたらします。 – Eric

+1

dllはどうですか? DLLなどでリンクしていますか?あなたは、シェル対cmdの行を介してそれを実行しようとしましたか? – cbrulak

答えて

1

私たちのハードウェアは限界に達しています。プログラムは、システムのメモリ制限にぶつかり、悲惨に失敗しました。私は、コマンドラインからファイルにcerrを渡すまで、エラー文が生成されるのを見ることもできませんでした(starkoに感謝します)。すべての有益な提案をありがとう!

1

何あなたのメモリモデルは次のように見えますか?インデックスの上限(つまり、sizeof int)とぶつかり合っていますか?

9

IDE内でコードが動作する(おそらくデバッガ内で動作しますが)スタンドアロンではないということは、初期化の問題である可能性があることを私に示唆しています。

+1

初期化の問題の意味についてのいくつかの追加説明があります。 – metamorphosis

5

警告レベルがmaxに設定されたコンパイラ。

警告をすべて確認してください。私はそれが初期化されていない変数(デバッグモードでNULL/0に初期化されている)だと思います。

個人的に私は警告が常に最大になるようにテンプレートを設定しました。警告はエラーとしてフラグが立てられ、コンパイルに失敗します。

2

クラッシュダンプを作成するようにO/Sを設定すると便利かもしれません(Windowsのシステムソフトウェア「Dr Watson」を使用してクラッシュダンプを作成することは多分わかりませんが)プログラムがクラッシュした後にデバッガを接続してください(であると仮定してクラッシュします)。

あなたはずもトラッププログラムがクラッシュダンプせずに半正常に終了する可能性のあるさまざまな方法:atexitset_unexpectedset_terminateと、おそらく他の人。

0

あなたのプログラムのようなサウンドは、あなたが捕まえていないという例外を投げています。 boost test frameworkには、例外の場所をすばやくローカライズできる例外ハンドラがいくつかあります。

オーバーフローする可能性のあるツリー構造のインデックスはありますか?ベクトルの現在のサイズを超えているインデックスをベクトルに使用していますか?

new vector...  
vector.push_back() 
vector.push_back() 
vector[0] = xyz 
vector[1] = abc 
vector[2] = slsk // Uh,oh, outside vector 

最大の入力セットのサイズはどれくらいですか?サイズ*サイズ要素の割り当てが終了しますか?その場合、最大入力は65536要素(65536 * 65536 == MAX_INT)より大きく設定されていますか?

デバッガが0にメモリをワイピングしているか、割り当てられたメモリの周りにメモリガードを使用しているため、スタンドアロンでないとIDEがうまく動作する可能性が最も高いことに同意します。

何かが失敗した場合は、正確に動作するサイズが見つかるまでデータセットのサイズを減らすことができますか、それは有益な可能性があるわずかな例です。

+0

理論的には、エラーが発生する正確なサイズを特定することができましたが、コメントで元の投稿に言及したように、テストケースは十分に大きく、これは実現不可能です。データセットは、実際には、整数のオーバーフローを検出するのに十分な大きさであることがあります。これは、確認するキューの中に入れました。 – Eric

+0

正しいサイズを見つけたい場合は、バイナリ検索を行います。データの半分を削除し、四分の一を入れ、1/8を削除します。これは、データの削除/追加が比較的簡単な場合にのみ有効です。 –

+0

あなたは最後の文の頭に問題を釘付けにしました。入力ファイルは、ツリーと最終的にはベクトルに入れられるデータに大量に処理されます。データが読み込まれた後に物事を捨てるための深刻なハッキングをせずに、最終的なデータセットから設定された量を排除する方法はありません。単純なケースでは確かに良い提案です。継続していただきありがとうございます! – Eric

0

クラッシュの原因となったコードの行を特定することをお勧めします。

これはIDEの外部でのみ発生するため、OutputDebugStringを使用して現在の位置を出力し、DebugViewを使用できます。

IDEの内部と外部のデバッグ用にコンパイルされたプログラムの動作は、まったく異なる場合があります。 IDEからプログラムをロードするときに、異なるランタイムライブラリセットを使用できます。

最近、私のコードのタイミングバグに噛まれましたが、IDEからのデバッグ時にはいつもバグは見られませんでしたが、リリースモードのバムではバグがありました。このようなバグは、本当にデバッグするPITAです。

関連する問題