我想通过使用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,它详细介绍了这两种方法.
如果需要,可以在这些调试函数中使用自己的锁定.