1. 根据2008年的帖子(我现在找不到), glibc 堆检查 在多线程环境中不起作用。现在还是2010年的情况吗?
  2. 默认情况下是否启用堆检查?(海湾合作委员会4.1.2)?我没有设置 MALLOC_CHECK_,不知道调用 mcheck(),但有时仍然会收到带有回溯的 double free glibc 错误。也许它是由某些编译标志启用的?
有帮助吗?

解决方案

默认情况下,在不使用 malloc_check_ 或 mcheck() 的情况下,glibc 会执行一些不会损害性能的小检查,例如对同一内存块调用两次 free()。这就是为什么您会收到其中一些消息,但您不会获得 malloc 替代 api 提供的所有消息,您可以通过使用 MALLOC_CHECK_ 获得这些消息(它正在执行更多测试,但也消耗更多的 CPU 资源)。您可以通过触发错误并使用或不使用 malloc_check_ 进行测试来检查这一点。例如,对于一个简单的 double-free(),我得到“双重释放或损坏(顶部)”或“free():无效指针”错误取决于我是否设置 MALLOC_CHECK_ 。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top