【问题标题】:glibc Heap Consistency Checkingglibc 堆一致性检查
【发布时间】:2011-02-19 10:02:35
【问题描述】:
  1. 根据 2008 年的帖子(我现在找不到),glibc heap check 在多线程环境中不起作用。 2010年现在还是这样吗?
  2. 是否默认启用堆检查? (GCC 4.1.2)?我没有设置 MALLOC_CHECK_,不知道调用 mcheck(),但有时仍会收到带有回溯的双重免费 glibc 错误。也许它是由一些编译标志启用的?

【问题讨论】:

  • 使用 valgrind,这个问题就变得没有意义了。 valgrind.org
  • @msw valgrind 很好,它们不会发生冲突。 MALLOC_CHECK_ 比 valgrind 轻得多,并且在设置后不需要任何操作 frp、用户(例如,通过 lvalgrind 运行应用程序,检查 valgrind 的输出)。这不是 valgrind 的情况。无论如何,我的问题不是关于 valgrind :)

标签: gcc glibc memory-corruption


【解决方案1】:

默认情况下,不使用 malloc_check_ 或 mcheck(),glibc 会做一些不会损害性能的小检查,比如在同一个内存块上调用两次 free()。这就是为什么您会收到其中一些消息的原因,但是您不会获得 malloc 替代 api 提供的所有消息,您可以通过使用 MALLOC_CHECK_ 获得(它们正在进行更多的测试,但 CPU 密集度也更高)。您可以通过触发错误来检查这一点,并使用和不使用 malloc_check_ 对其进行测试。例如,对于一个简单的 double-free(),我会收到“double free or corruption (top)”或“free(): invalid pointer”错误,这取决于我是否设置了 MALLOC_CHECK_。

为了回答 1/ 问题,mcheck 依赖于 malloc 钩子,因为它们存在(比如 15 年),并且这些钩子并不是线程安全的。

来源:glibc/malloc/malloc.c,http://sourceware.org/bugzilla/show_bug.cgi?id=9939

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-31
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 2021-11-12
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多