【问题标题】:C++. How to trace memory allocation to .so module in linuxC++。如何在linux中跟踪.so模块的内存分配
【发布时间】:2020-07-19 20:54:13
【问题描述】:

我们的应用程序很大,现在需要知道哪个 .so 模块分配了多少内存。我不知道这里,我想知道一个自定义分配器覆盖 operator new,但这并没有帮助,因为我仍然无法跟踪哪个模块正在执行分配。用自定义分配器替换新的将是可怕的工作量。有谁知道我怎么知道哪个模块分配了多少?

【问题讨论】:

    标签: c++ linux memory-management memory-leaks


    【解决方案1】:

    您可以使用LD_PRELOAD trick 来挂钩mallocreallocfree 等。再加上从boost.stacktrace 收集的信息,您可以获得大部分(如果不是全部)需要。虽然不是微不足道的。

    【讨论】:

    • 这似乎不是很高效。有没有办法为每个 .so 模块预加载 malloc realloc(一些不同的功能?)
    • 据我所知没有。在一天结束时,总会有一些性能受到影响——你正在拦截对 malloc 等的调用,并围绕真正的调用做额外的工作。至于那一击究竟是什么,是否可以接受……?只有测试才能证明。
    【解决方案2】:

    这并不容易。

    您可以在应用程序中全局挂钩mallocfreerealloc。 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?

    【讨论】:

      猜你喜欢
      • 2010-10-28
      • 2019-05-03
      • 2012-06-10
      • 2014-08-30
      • 1970-01-01
      • 2013-04-27
      • 2022-09-27
      • 1970-01-01
      相关资源
      最近更新 更多