以线程安全的方式使用glibc malloc钩子

Ale*_*own 12 c malloc glibc

我想通过使用malloc和free hook监视应用程序中mallocs和frees的使用.

这是文档http://www.gnu.org/s/libc/manual/html_node/Hooks-for-Malloc.html

在示例页面中,您可以看到,my_malloc_hook在重新调用malloc之前,会暂时关闭malloc挂钩(或链中的前一个挂钩).

监视多线程应用程序时这是一个问题(请参阅问题末尾以获得解释).

我在互联网上找到的使用malloc钩子的其他例子也有同样的问题.

有没有办法重新编写此函数以在多线程应用程序中正常工作?

例如,是否有一个内部libc函数,malloc钩子可以调用它来完成分配,而不需要停用我的钩子.

由于公司的法律政策,我无法查看libc源代码,因此答案可能很明显.

我的设计规范说我不能用不同的malloc设计替换malloc.

我可以假设没有其他钩子在玩.


UPDATE

由于在为malloc提供服务时临时删除了malloc钩子,因此另一个线程可能会调用malloc而不是获取钩子.

有人建议malloc有一个很大的锁定来防止这种情况发生,但它没有记录,而且我有效地递归调用malloc的事实表明任何锁必须存在于钩子之后,或者是快活的聪明:

caller -> 
  malloc -> 
    malloc-hook (disables hook) -> 
      malloc -> # possible hazard starts here
        malloc_internals
      malloc <-
    malloc-hook (enables hook) <-
  malloc
caller
Run Code Online (Sandbox Code Playgroud)

Wil*_*ill 11

更新

你不相信__malloc_hooks 是对的 ; 我瞥了一眼代码,他们 - 疯狂地疯狂 - 不是线程安全的.

直接调用继承的钩子,而不是恢复和重新进入malloc,似乎偏离了你引用的文档有点过于让人感觉不舒服.

来自http://manpages.sgvulcan.com/malloc_hook.3.php:

钩子变量不是线程安全的,因此现在不推荐使用它们.程序员应该通过定义和导出"malloc"和"free"等函数来取代对相关函数的调用.

注入调试malloc/realloc/free函数的适当方法是提供自己的库,导出这些函数的"调试"版本,然后将其自身推向真实函数.C链接以显式顺序完成,因此如果两个库提供相同的函数,则使用第一个指定的函数.您还可以使用LD_PRELOAD机制在unix上的加载时注入malloc.

http://linux.die.net/man/3/efence描述了Electric Fence,它详细介绍了这两种方法.

如果需要,可以在这些调试函数中使用自己的锁定.