3

したがって、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]

すべて順調ですが、他のケースでは、backtrace()を実行してから、addr2lineへのシステムコールを使用して、代わりに関数内の実際のポイントを出力しています。しかし、それがglibcのクラッシュである場合、私が呼び出したシグナルハンドラーをバイパスすることをやめます。

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

4

2 に答える 2

3

これはメモリ機能のオプションです。を使用して切り替えることができますmalloptM_CHECK_ACTIONプログラムをすぐに終了させたい場合を除いて、実行を続行できるようにゼロに設定する必要があります。その場合は、2必要な処理を実行できるかどうかを確認してください。

この小さなプログラムは通常のglibcエラーを生成します:test1.c
これはエラーを無視して続行します: test2.c
これはエラーで 中止します:test3.c

于 2012-04-17T11:48:12.563 に答える
3

IIRC、glibcは実際にを呼び出すabort()ので、そこSIGABRTからバックトレースを処理して出力すると、必要な情報が得られるはずです。

ただし、valgrindを試してみることをお勧めします。表示されるメッセージは、メモリ破損の問題があることを示しています。

サイドコメント(これが冗長な場合は申し訳ありません;-)):コアダンプは、バックトレースよりも便利な場合があります。ulimit -c unlimitedそれらは、例えばbashで設定することで有効にできます。プログラムがクラッシュすると、という名前のファイルが生成されますcore.(またはcore、これは実行しているシステムによって異なります。システムが実行されて/var/cache/abrtいる場合は、間違っていない場合はabrtdコアファイルが挿入されます)。gdb -c core a.out次に、;を実行してgdbを使用してコアファイルを検査できます。gdbセッションは、プロセスがクラッシュしたかのように見えます。

于 2012-04-17T12:11:23.957 に答える