当存在内存损坏时,有没有办法抑制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 :(得分:8)
是:使用环境变量MALLOC_CHECK_
(故意将尾随下划线设置)设置为0
来运行代码。
这是partially documented in the libc manual,但似乎有更多选项,而不仅仅是0
,1
或2
。 (该值最终作为action
参数传递给glibc的malloc/malloc.c
和the default value seems to be 3
中的malloc_printerr()
。)
您无法重定向的原因是它被专门写入/dev/tty
,除非您已设置环境变量LIBC_FATAL_STDERR_
。 (我不确定这是否记录在任何地方,但可以找到相关代码here。)