【问题标题】:Using tcmalloc - How to load the malloc extensions properly?使用 tcmalloc - 如何正确加载 malloc 扩展?
【发布时间】:2014-08-28 18:44:24
【问题描述】:

在文件 gperftools-2.2.1/src/gperftools/malloc_extension.h 中,内容如下:

// Extra extensions exported by some malloc implementations.  These
// extensions are accessed through a virtual base class so an
// application can link against a malloc that does not implement these
// extensions, and it will get default versions that do nothing.
//
// NOTE FOR C USERS: If you wish to use this functionality from within
// a C program, see malloc_extension_c.h.

我的问题是如何通过虚拟基类访问这些扩展?

通常要从动态库加载一个类,我需要编写一个基类,它允许我通过多态性获取所需类的实例及其函数,如here 所述。

但是,API 中必须有一些可用的类工厂函数,但在任何 tcmalloc 文件中都没有此类函数。此外,我还需要使用 dlopen() 加载 tcmalloc 库,根据安装说明不建议这样做:

...通过 dlopen 加载 malloc 替换库是 在任何情况下都自找麻烦:有些数据将分配给一个 malloc,有些则分配给另一个。

因此,显然不能通过上述典型方式访问扩展。我可以使用 malloc_extensions_c.h 中声明的 C 版本,但想知道是否有更好的解决方案。

【问题讨论】:

    标签: c++ c linux malloc tcmalloc


    【解决方案1】:

    只需包含此标头并执行 MallocExtension::instance()->GetMemoryReleaseRate();也可以。无需为此修改 tcmalloc。

    【讨论】:

      【解决方案2】:

      我设法通过一些“hack”加载了 malloc 扩展,这并不像我希望的那样干净,但它完成了工作。这是给有兴趣的人的(临时)解决方案。

      首先,这些 malloc 扩展函数中的大多数都类似于静态函数,它们大多仅在当前实例上调用,例如要在当前进程上调用GetMemoryReleaseRate() 函数,只需调用MallocExtension::instance()->GetMemoryReleaseRate()。因此,我们不需要创建基类并获取 MallocExtension 类的实例来调用这些函数。

      对于上面的例子,我只是创建了一个独立的函数 getMemoryReleaseRate() ,它在被调用时简单地调用所需的函数,如下所示:

      getMemoryReleaseRate()
      {
          MallocExtension::instance()->GetMemoryReleaseRate();
      }
      

      这个函数可以直接插入到源文件中,例如tcmalloc.cc,或者,如果您不想在每次有新版本时编辑 tcmalloc 源代码,添加到您的 makefile 中,以便在编译时附加到源文件中。

      现在在您的代码中,您可以通过您通过 dlsym() 创建的“外观”函数调用 MallocExtension 函数,例如如下:

      typedef void (*getMemoryReleaseRate)(); 
      ((getMemoryReleaseRate)dlsym(RTLD_DEFAULT, "getMemoryReleaseRate"))();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多