1

我们编写了一个堆分析器(供参考lib_debug),它覆盖freemalloc(和其他),主要用于监视我们的应用程序中的错误,例如内存泄漏,这些应用程序部署在运行 Linux 的 PPC 系统上。lib_debug被编译为共享库,LD_PRELOAD在需要时加载。

到目前为止,此调试器运行良好;每当malloc被调用时,都会在堆栈上创建一个内存监视器单例,当此单例在退出时超出范围时,它会报告任何未释放的内存。

但是,我们的一个应用程序现在std::vector在全局范围内分配 a。看起来这个全局vector是在我们的堆分析器之前创建的,最重要的是之后被销毁。因此,一旦main我们在 this 中插入任何东西vectorlib_debug就会认为我们在关机时有内存泄漏。

为了说明,这就是我认为的事件顺序:

  1. LD_PRELOADlib_debug从;加载符号
  2. std::vector在全局范围内的堆栈上创建;
  3. lib_debug初始化发生 -malloc已在某处调用,这会导致在堆栈上创建实际的堆分析器单例;
  4. 输入main
  5. std::vector::push_back()发生,在堆上分配内存;
  6. main退出;
  7. 堆分析器单lib_debug例超出范围,它看到vector没有释放其内存 - 报告错误;
  8. vector超出全局范围,释放其内存;
  9. 程序终止。

因此,有什么方法可以保证我们的LD_PRELOADed单例总是最后被删除,从而捕获free我们应用程序中出现的每一个单例?

4

1 回答 1

0

如果您将GCC其用作编译器,则此方法有效。您可以在库中定义一个函数来充当constructor,以便在加载库时执行代码。

static int initialize_lib_debug () __attribute__((constructor));

static int initialize_lib_debug () {
    /* ... */
}
于 2012-08-03T17:05:52.153 回答