【发布时间】:2011-01-02 12:31:33
【问题描述】:
我想通过使用 malloc 和 free 挂钩来监控应用程序中 malloc 和 free 的使用情况。
这是http://www.gnu.org/s/libc/manual/html_node/Hooks-for-Malloc.html的文档
从示例页面中您可以看到my_malloc_hook 在重新调用 malloc 之前会暂时关闭 malloc 挂钩(或切换到链中的前一个挂钩)。
这是监控多线程应用程序时的问题(请参阅问题末尾的解释)。
我在网上找到的其他使用malloc hook的例子也有同样的问题。
有没有办法重写这个函数以在多线程应用程序中正常工作?
例如,是否有一个内部 libc 函数可供 malloc 钩子调用来完成分配,而无需停用我的钩子。
由于公司法律政策,我无法查看 libc 源代码,所以答案可能很明显。
我的设计规范说我不能用不同的 malloc 设计替换 malloc。
我可以假设没有其他钩子在起作用。
更新
由于 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
【问题讨论】:
-
如果我们中的任何一个人查看了 libc 源并根据它为您提供信息,那么您将在法律上处于相同的位置。
-
为什么你不能看看 libc源代码?
-
因为我可能会用 GPL 代码污染我们的专有代码。只是被告知一个特定的功能会做我想做的事情并没有这个问题。
-
这是一个疯狂的偏执律师的事情,但我必须遵守规则,或者在其他地方工作。
-
当线程冷却后,我会在一天左右的时间内接受其中一个答案。