2011-08-16 15 views
4

メモリ破損時にglibcが生成する出力をスケルチする方法はありますか?ここで私は私がやっている仕事についてスケーリングglibcメモリ破損スタックトレース出力

make 
*** glibc detected *** /home/myname/php/sapi/cli/php: free(): invalid pointer: x0045d67f *** 
======= Backtrace: ========= 
/lib/libc.so.6(+0x6eb41)[0x380b41] 

<snip> 
======= Memory map: ======== 
00115000-00116000 r-xp 00000000 00:00 0   [vdso] 
001d7000-001ee000 r-xp 00000000 ca:01 540738  /lib/libpthread-2.12.2.so 
001ee000-001ef000 r--p 00016000 ca:01 540738  /lib/libpthread-2.12.2.so 
001ef000-001f0000 rw-p 00017000 ca:01 540738  /lib/libpthread-2.12.2.so 
<snip> 

を見てんだよ、私はこの情報についてはあまり気にしませんでした、それだけでmakeが(戻り値を!= 0)成功しなかったことを問題になります。これらのメッセージは画面をいっぱいにしており、残りの出力は読めません。私は試した:

make &> /dev/null 
{ make ; } &> /dev/null 
x=`make 2>&1` &> /dev/null 

しかし、それらのどれも出力をキャッチしません。それがstderrに書かれていないなら、どこから来ているのでしょうか?可能であれば、glibcを再構築する必要のないソリューションが欲しいです。

ここにこのようなエラーメッセージを表示するコードがありますが、これは私が取り組んでいるコード(PHPソースコード)とは関係ありません。私はちょうど私のコンソールからこのタイプの出力を沈黙させたい。

int main() 
{ 
    char* ptr = (char*)malloc(sizeof("test")); 
    char array[]= "test"; 
    ptr = array; 
    free(ptr); 
    return 0; 
} 
+0

おそらく、stdinに書きますか? (もしfd 0があなたのttyを参照するならば、プロセスがそれに書き込むのを妨げるものは何もありません)。また、/ dev/ttyには、本当にこれを見たいと思っています。 (「それほど気にすることはできません」を正しく使用する場合は+1、気にしない場合は-1を意味する)。他のすべてが失敗した場合は、glibcのソースを取得し、メッセージのテキストをgrepします。 –

+2

それをスケルチする最良の方法は、メモリ破損を修正することです。 Joe Blackhatは、glibcをコードを再コンパイルしてトレースを無効にしても、適切なシェルコードでプログラムをうまく印刷できます。;-) –

答えて

7

はい:0に設定された環境変数MALLOC_CHECK_(末尾のアンダースコアが意図的である)を使用してコードを実行します。

これは0,1または2よりも多くのオプションがあるようですが、そこに示唆されていますが、partially documented in the libc manualです。 (値がglibcののmalloc/malloc.cmalloc_printerr()、およびthe default value seems to be 3からaction引数として渡されてしまう。)

あなたは環境変数LIBC_FATAL_STDERR_を設定していない限り、あなたはそれをリダイレクトすることができない理由は、それが/dev/ttyに特異的に書き込まれますということです。 (これはどこに書かれているかわかりませんが、関連するコードはhereです。

+0

パーフェクト!本当にありがとう。私は__writeを見ていて、それは私をどこにももたらしませんでした。これは魅力的に機能しました。 – Lucina

+0

@Mike:喜んで助けてください! ([回答を受け入れるとマークする](http://meta.stackexchange.com/q/5234)をご検討ください) –

+0

おっと!ごめんなさい新しい= P – Lucina

関連する問題