压制glibc内存损坏堆栈跟踪输出

Luc*_*ina 5 c 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>
Run Code Online (Sandbox Code Playgroud)

对于我正在做的工作,我不在乎这个信息,只关注make没有成功(返回值!= 0).这些消息正在填满屏幕,它使我的输出的其余部分不可读.我试过了:

make &> /dev/null
{ make ; } &> /dev/null
x=`make 2>&1` &> /dev/null
Run Code Online (Sandbox Code Playgroud)

但他们都没有抓住产量.如果它没有被写入stderr,它来自哪里?如果可能的话,我想要一个不需要重建glibc的解决方案.

这里有一些代码会给出这样的错误信息,但请注意这与我正在处理的代码(php源代码)无关.我只是想从我的控制台沉默这种类型的输出.

int main()
{
    char* ptr = (char*)malloc(sizeof("test"));
    char array[]= "test";
    ptr = array;
    free(ptr);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*ery 8

是的:使用设置为的环境变量MALLOC_CHECK_(尾随下划线是故意的)运行代码0.

在手动的libc部分记载,但似乎有更多的选择不仅仅是0,12它们建议那里.(该值最终作为action参数传递给malloc_printerr()glibc中malloc/malloc.c,默认值似乎是3.)

/dev/tty除非已设置环境变量,否则无法重定向的原因是它是专门编写的LIBC_FATAL_STDERR_.(我不确定这是否记录在案,但相关代码可以在这里找到.)