【发布时间】:2011-08-16 21:38:40
【问题描述】:
当内存损坏时,有什么方法可以抑制 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>
对于我正在做的工作,我并不关心这些信息,重要的是制作没有成功(返回值!= 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;
}
【问题讨论】:
-
也许它正在写入标准输入? (如果 fd 0 指的是您的 tty,则没有什么可以阻止进程写入它)。或者就此而言,只是
/dev/tty,这个想法是你真的想看到这个。 (+1 表示正确使用“不在乎”;-1 表示不在乎——它会平衡)。如果一切都失败了,请获取 glibc 源并通过 grep 查找消息的文本。 -
抑制它的最佳方法是修复内存损坏。即使您重新编译 glibc 并禁用打印跟踪的代码,Joe Blackhat 也可以让您的程序愉快地使用正确的 shellcode 再次打印堆栈跟踪... ;-)