【发布时间】:2020-07-19 20:54:13
【问题描述】:
我们的应用程序很大,现在需要知道哪个 .so 模块分配了多少内存。我不知道这里,我想知道一个自定义分配器覆盖 operator new,但这并没有帮助,因为我仍然无法跟踪哪个模块正在执行分配。用自定义分配器替换新的将是可怕的工作量。有谁知道我怎么知道哪个模块分配了多少?
【问题讨论】:
标签: c++ linux memory-management memory-leaks
我们的应用程序很大,现在需要知道哪个 .so 模块分配了多少内存。我不知道这里,我想知道一个自定义分配器覆盖 operator new,但这并没有帮助,因为我仍然无法跟踪哪个模块正在执行分配。用自定义分配器替换新的将是可怕的工作量。有谁知道我怎么知道哪个模块分配了多少?
【问题讨论】:
标签: c++ linux memory-management memory-leaks
您可以使用LD_PRELOAD trick 来挂钩malloc、realloc、free 等。再加上从boost.stacktrace 收集的信息,您可以获得大部分(如果不是全部)需要。虽然不是微不足道的。
【讨论】:
这并不容易。
您可以在应用程序中全局挂钩malloc、free、realloc。 Stackoverflow 上的对应文章:How to use __malloc_hook?、An alternative for the deprecated __malloc_hook functionality of glibc。
您可以使用__builtin_return_address 从该挂钩中检索调用者地址,并将其与共享库的地址进行比较。也许您必须检查更深的帧地址才能在库中获得正确的地址,而不是 libc++ 的地址。阅读这篇 Stackoverflow 文章__builtin_return_address returns null for index >0?。
【讨论】: