8
  1. 根据 2008 年的帖子(我现在找不到),glibc 堆检查在多线程环境中不起作用。现在还是2010年的情况吗?
  2. 默认情况下是否启用堆检查?(GCC 4.1.2)?我没有设置 MALLOC_CHECK_,不知道调用 mcheck(),但有时仍会收到带有回溯的双重免费 glibc 错误。也许它是由一些编译标志启用的?
4

1 回答 1

3

默认情况下,不使用 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

于 2010-05-18T13:46:17.127 回答