2016-05-05 6 views
7

GCC sanitizer 64ビットシステムでは、約17TBのhuge core filesが作成されます。gccサニタイザ:unmap_shadow_on_exitは、カスタムSIGSEGVハンドラでは受け入れられません。

したい場合は、消毒剤に、以下のオプションを渡す必要があります後、致命分析のためのコア:

  • unmap_shadow_on_exit = 1 - 出口でハウスキーピングのために使用され、巨大なメモリのマップを解除

  • disable_core = 0 - 64ビットシステム上で作成されたコアファイル

    しかし、独自のシグナルハンドラでSIGSEGVを処理すると、unmap_shadow_on_exitが機能せず、巨大なコアファイルが作成されます。

unmap_shadow_on_exitを行うにはどのように任意のアイデアそれが仕事ですか?あなたの顧客のハンドラを設定する際

+0

あなたは 'use_madv_dontdump'が記述されたリンクを提供しました。試しましたか? – fghj

+0

@ user1034749 gcc 4.8には表示されません – dimba

答えて

3

定期的なシグナルハンドラがlost but returnedではありません - それゆえかもしれないの仕事は、あなたがあなたが持っているものは何でも機能して行われた後にした後、単にあなた自身のシグナルハンドラの一部としてそのコードを呼び出すためにどうなりますかあなた自身のハンドラ。

sighandler_t oldSigHandler = 0; 
void mySigHandler(int sig) { 
    ... your code ... 
    if (oldSigHandler) oldSigHandler(sig); 
} 

void setMySignalHandler(int sig) { 
    oldSigHandler = signal(sig, mySigHandler); 
} 

私は一般的に悪としてシグナルハンドラを考え、それらを回避しよう - が、これはあなたのために働くことがあります。

また、コアダンプファイルを避けるだけの場合は、ulimit -cをシェルから、またはprogrammaticをコード内から使用して、コアダンプの許容サイズを制限しようとする可能性があります。コアファイルはこれを切り詰めましたあなたが持っている必要があるのは、gdbと常に一致するわけではありません。

関連する問題