【问题标题】:squelching glibc memory corruption stack trace output压制 glibc 内存损坏堆栈跟踪输出
【发布时间】: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 再次打印堆栈跟踪... ;-)

标签: c glibc


【解决方案1】:

是的:将环境变量MALLOC_CHECK_(后面的下划线是故意的)设置为0 运行您的代码。

这是partially documented in the libc manual,尽管似乎有更多的选择,而不仅仅是那里建议的012。 (该值最终作为action 参数传递给glibc 的malloc/malloc.cthe default value seems to be 3 中的malloc_printerr()。)

你不能重定向它的原因是它被专门写入/dev/tty,除非你设置了环境变量LIBC_FATAL_STDERR_。 (我不确定这是否记录在任何地方,但可以找到相关代码here。)

【讨论】:

  • 完美!非常感谢。我在看 __write,这让我无处可去。这就像一个魅力。
  • @Mike:乐于助人! (请考虑marking the answer as accepted。)
猜你喜欢
  • 1970-01-01
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
  • 2014-01-07
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
  • 2011-11-25
相关资源
最近更新 更多