glibc 堆一致性检查
- 根据2008年的帖子(我现在找不到), glibc 堆检查 在多线程环境中不起作用。现在还是2010年的情况吗?
- 默认情况下是否启用堆检查? (海湾合作委员会4.1.2)?我没有设置 MALLOC_CHECK_,不知道调用 mcheck(),但有时仍然会收到带有回溯的 double free glibc 错误。也许它是由某些编译标志启用的?
- According to posts from 2008 (I can't find it right now), glibc heap check doesn't work in multithreaded environment. Is it still situation now in 2010?
- Does heap check enabled by default? (gcc 4.1.2)? I don't set MALLOC_CHECK_, don't aware of calling mcheck(), but still sometimes receive double free glibc error with backtrace. Maybe it's enabled by some compilation flag?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
默认情况下,在不使用 malloc_check_ 或 mcheck() 的情况下,glibc 会执行一些不会损害性能的小检查,例如对同一内存块调用两次 free()。这就是为什么您会收到其中一些消息,但您不会获得 malloc 替代 api 提供的所有消息,您可以通过使用 MALLOC_CHECK_ 获得这些消息(它正在执行更多测试,但也消耗更多的 CPU 资源)。您可以通过触发错误并使用或不使用 malloc_check_ 进行测试来检查这一点。例如,对于一个简单的 double-free(),我会收到“double free 或损坏(顶部)”或“free():无效指针”错误,具体取决于我是否设置 MALLOC_CHECK_ 。
为了回答 1/ 问题,mcheck 依赖于 malloc 钩子,因为它们存在(大约 15 年),并且这些钩子并不是为了线程安全。
来源:glibc/malloc/malloc.c,http://sourceware.org/bugzilla/ show_bug.cgi?id=9939
By default, without using malloc_check_ or mcheck(), glibc does some little checks that doesn't hurt the performance, like calling twice free() on the same memory chunk. That's why you are getting some of these messages, but you won't have all messages provided by the malloc substitute api you can get by using MALLOC_CHECK_ (which are doing far more tests, but far more cpu intensive too). You can check this by triggering an error, and testing it with and without malloc_check_. For example, for a simple double-free(), i get "double free or corruption (top)" or "free(): invalid pointer" errors depending whenever I set MALLOC_CHECK_ or not.
To answer the 1/ question, mcheck relies on malloc hooks since they exists (like 15 years), and those are not intended to be thread safe.
Sources: glibc/malloc/malloc.c, http://sourceware.org/bugzilla/show_bug.cgi?id=9939