2012-04-17 5 views
3

ので、glibcのクラッシュは、それが* glibcの検出*クラッシュメッセージを持っている場合。その後、すべてが順調と良いオーバーライドglibcのクラッシュ

*** glibc detected *** ./odin: free(): invalid pointer: 0xbfba4444 *** 
======= Backtrace: ========= 
/lib/tls/i686/cmov/libc.so.6(+0x6b161)[0xb75f9161] 
/lib/tls/i686/cmov/libc.so.6(+0x6c9b8)[0xb75fa9b8] 
/lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0xb75fda9d] 
/usr/lib/libstdc++.so.6(_ZdlPv+0x1f)[0xb77da2ef] 

のように、バックトレースの束を出力しますが、物事のクラッシュ、私は実際のポイントをバックトレース()を実行して、addr2lineにするためにシステムコールを使用して印刷してきた他の例その代わりに関数。しかしglibcのクラッシュ時には、私が呼び出したシグナルハンドラをバイパスして終了します。

これらのglibcのクラッシュに対してフックする方法はありますか?

答えて

3

メモリ機能のためのオプションであり、あなたはmalloptを使用して、それを切り替えることができます。そのサウンドでは、プログラムをすぐに終了させたい場合を除いて、実行を続けるためにM_CHECK_ACTIONをゼロに設定したい場合は、2があなたの望むことを可能にするかどうかを見てください。

この小さなプログラムは、通常のglibcのエラー生成:この1つはエラーにアボートtest2.c
test3.c

3

IIRC、glibcのは、実際にはそうSIGABRT取り扱い、abort()を呼び出しtest1.c
この1つはエラーを無視して上に担持しそこからバックトレースを印刷すると、必要な情報が得られます。

しかし、私はvalgrindのを試みることをお勧めしたい:あなたが取得しているメッセージは、メモリ破損の問題を抱えていることを示唆しています。

サイド・コメント(これは冗長な場合はごめん;-)):バック・トレースだけのコア・ダンプが役立つことがあります。それらは、例えば、 bashでulimit -c unlimitedを設定してください。プログラムがクラッシュすると、core.という名前のファイルが生成されます(これは実行しているシステムによって異なりますが、システムがabrtdを実行している場合は、間違っていないと/var/cache/abrtに入ります)。そして、あなたはgdb -c core a.outを実行することによって、GDBを使用してコアファイルを調べることができます。 gdbセッションはプロセスがクラッシュしたように見えます。

+0

うーん、私のプログラムはかなりしばらくの間、信号(SIGABRT、何とか)を持っていた、そして、彼らはトリガされませんでした(彼らは原料の束を印刷しているだろう)**編集**:彼らは実際にトリガをした、私だけのdidnそれを見ない。私もvalgrindを試してみるだろうが、何とか何もしなかった時はいつまでも捕らえられた。 – kamziro

関連する問題