2009-11-02 51 views
7

私が失敗したプログラムがあります。CでgdbのSt9bad_allocエラーをどのようにデバッグできますか?

terminate called after throwing an instance of 'std::bad_alloc' 
    what(): St9bad_alloc 

を私はそれがmalloc/freeとは何かだと想像が、私はどちらかわかりません。

スタックトレースを表示できるようにエラーでブレークするgdbセット内のブレークポイントを教えてください。

プログラムは、gcc 3.4.2でコンパイルされたCとC++の組み合わせです。

答えて

12

本当にmalloc/freeで例外が発生するわけではありませんが、アプリケーションのC++部分に間違いなく "新規"です。 「新しい」割り当てには大きすぎるパラメータを提供しているようです。バックトレースはあなたがGDBにクラッシュダンプをロードするとき言うん何

int * p = new int[50000000]; 

「のstd :: bad_allocは、」例えば、次のコードによって引き起こされますか? ダンプを生成できない場合は、GDBにwhen exception is thrown or caughtを停止するよう依頼することができます。 残念ながら、GDBサポートのいくつかのバージョンが唯一の構文は次のとおりです。

catch throw 

任意の例外がスローされたときにアプリケーションを破ることができます。 はしかし、助けにあなたは新しいバージョンで

catch throw std::bad_alloc 

を実行することは可能であることを参照してください。

そして、それを忘れないでください:

(GDB)ヘルプキャッチを

は、他の有用な情報のための良いソースです。

+0

「例外がスローされたか捕まえられたか」のリンクは404です。 – Karl

0

メモリがオーバーライトされ、メモリ割り当てシステムの状態が破損する可能性があります(通常、メモリブロックがアプリケーションに返される前または後に保持されます)。

可能性がある場合(つまり、x86 Linuxを使用している場合)、Valgrindでプログラムを実行すると、破損が発生した場所を正確に表示できます。

0

私は存在しないファイルを読み込もうとしていましたが...ファイルの内容の内部バッファを作成しようとしましたが、ファイルが存在しなかったため、バッファがねじ込まれた。

int lenth_bytes; 
length_bytes = in_file.tellg(); 
new char [length_bytes]; // length_bytes hadn't been initialised!!!! 

子供を覚えておいて、常に変数:Dを初期化し、ゼロの場合はチェックします。

関連する問題