2011-10-21 11 views
3

私は現在自分のバージョンのmalloc()とfree()を実装しており、現在のデバッグ目的のために意図的にfree()の最初の行にアサート(0)を配置しています。C言語:「assert()」が失敗した後に、少しでもプログラムを実行し続けることは可能ですか?

ドライバプログラムは、これらのmalloc()とfree()のランダムなシーケンスをテストして、実装の正しさをテストしています。

しかし、私がドライバを実行すると、シェルは "Assertion '0' failed"というメッセージを表示し、もう少し長く実行し続けます。そしては "Aborted"を出力します。実際には、アサーションの失敗を報告してから最後にプログラムが中断したことを報告するまでに何度かmalloc()を呼び出すことができるようです。私はデバッグの目的で特定の変数を出力するコードに置かれている特定のprintfステートメントのためにこれを確信しています。

私はmalloc()とfree()を実装するのにまったく役に立ちません。アサーションが失敗したと報告された後でさえも、プログラムが短時間(引き続き他のユーザ定義の関数を呼び出しても)実行し続けるように見えるときに、何が意味するのかを知りたいでしょう。

答えて

7

「アサーションが失敗しました」が表示され、その後にプリントをデバッグして終了する場合は、明らかに2つの可能性があります。

1つは、アサーションメッセージとデバッグ用のプリントが、バッファリングされた2つの出力ストリーム(stderrとstdoutなど)に書き込まれ、それらがいっぱいになった同じ順序でフラッシュされないことです。

もう1つは、複数の実行スレッドがmalloc()に衝突していることです。

+0

私はドライバがisn ' tマルチスレッド...... –

+1

ドライバー?あなたはどのプラットフォームにいるのかを明確にすることはできますか? –

3

あなたはglibcのベースのシステムを使っているのであれば、問題はそれが内部的にmallocを呼び出し、ひいてはassertは、アサーションの失敗メッセージを印刷するfprintfを使用していますfprintfおそらくです。これはもちろん、メモリ不足の状態からの印刷エラーメッセージは(他の多くの問題の中で)失敗するので、非常に悪いデザインですが、それはどういう意味ですか...

関連する問題