C++ 使用LD#u PRELOAD和C+中的全局范围对象加载堆分析器+;
我们已经编写了一个堆分析器(参考名为C++ 使用LD#u PRELOAD和C+中的全局范围对象加载堆分析器+;,c++,linux,global-variables,ld-preload,C++,Linux,Global Variables,Ld Preload,我们已经编写了一个堆分析器(参考名为lib_debug),它覆盖free和malloc(以及其他),主要用于监控应用程序中的错误,例如部署在运行Linux的PPC系统上的内存泄漏lib_debug编译为一个共享库,在需要时加载LD_PRELOAD 到目前为止,这个调试器工作得很好;无论何时调用malloc,都会在堆栈上创建一个内存监视器单例,当该单例在退出时超出作用域时,它会报告任何未释放的内存 但是,我们的一个应用程序现在在全局范围内分配std::vector。看起来这个全局向量是在堆分析器被
lib_debug
),它覆盖free
和malloc
(以及其他),主要用于监控应用程序中的错误,例如部署在运行Linux的PPC系统上的内存泄漏lib_debug
编译为一个共享库,在需要时加载LD_PRELOAD
到目前为止,这个调试器工作得很好;无论何时调用malloc
,都会在堆栈上创建一个内存监视器单例,当该单例在退出时超出作用域时,它会报告任何未释放的内存
但是,我们的一个应用程序现在在全局范围内分配std::vector
。看起来这个全局向量是在堆分析器被创建之前创建的,最重要的是在之后被销毁。因此,一旦在main
中,如果我们在这个向量中插入任何东西,lib_debug
就会认为在关机时内存泄漏
举例来说,我认为事件的顺序是:
LD_PRELOAD
从lib_debug
加载符号李>
std::vector
在全局范围的堆栈上创建李>
lib_debug
发生初始化-malloc
已在某个地方被调用,这将导致在堆栈上创建实际的堆分析器单例李>
输入main
李>
std::vector::push_back()
发生,在堆上分配内存李>
main
退出李>
lib_debug
堆分析器单例超出范围,它发现向量未释放其内存-报告错误李>
向量
超出全局范围,释放其内存李>
程序终止
因此,我们有没有办法保证我们的LD_预加载
单例始终是最后要删除的内容,从而捕获应用程序中出现的每一个免费
。您可以在库中定义一个函数作为构造函数
,以便在加载库时执行代码
static int initialize_lib_debug () __attribute__((constructor));
static int initialize_lib_debug () {
/* ... */
}