gpt4 book ai didi

c - 以线程安全的方式使用 glibc malloc hooks

转载 作者:太空狗 更新时间:2023-10-29 16:40:51 57 4
gpt4 key购买 nike

我想通过使用 malloc 和 free Hook 来监视应用程序中 malloc 和 free 的使用情况。

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

从示例页面中,您可以看到 my_malloc_hook 在重新调用 malloc 之前暂时关闭 malloc Hook (或切换到链中的前一个 Hook )。

这是监控多线程应用程序时的一个问题(解释见问题结尾)。

我在网上找到的其他使用malloc hook的例子也有同样的问题。

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

例如,是否有一个 malloc Hook 可以调用的内部 libc 函数来完成分配,而无需停用我的 Hook 。

由于公司法律政策,我无法查看 libc 源代码,所以答案可能很明显。

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

我可以假设没有其他钩子(Hook)在起作用。


更新

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

有人建议 malloc 周围有一个大锁来防止这种情况发生,但没有记录,而且我有效地递归调用 malloc 的事实表明任何锁都必须存在于 hook 之后,或者非常聪明:

caller -> 
malloc ->
malloc-hook (disables hook) ->
malloc -> # possible hazard starts here
malloc_internals
malloc <-
malloc-hook (enables hook) <-
malloc
caller

最佳答案

已更新

你是right不要相信 __malloc_hooks;我看了一眼代码,它们 - 惊人地疯狂 - 不是线程安全的。

直接调用继承的钩子(Hook),而不是恢复并重新进入 malloc,似乎偏离了您引用的文档有点太多,以至于无法舒适地建议。

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

Hook variables are not thread-safe so they are deprecated now. Programmers should instead preempt calls to the relevant functions by defining and exporting functions like "malloc" and "free".

注入(inject)调试 malloc/realloc/free 函数的适当方法是提供您自己的库,导出这些函数的“调试”版本,然后将其自身推迟到真实的。 C 链接是按明确顺序完成的,因此如果两个库提供相同的功能,则使用第一个指定的。您还可以使用 LD_PRELOAD 机制在 unix 上的加载时注入(inject)您的 malloc。

http://linux.die.net/man/3/efence介绍了 Electric Fence,其中详细介绍了这两种方法。

如果有必要,您可以在这些调试函数中使用自己的锁定。

关于c - 以线程安全的方式使用 glibc malloc hooks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2020997/

57 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com