用LD_PRELOAD和C++中的全局作用域对象加载堆分析器
Loading a heap analyser with LD_PRELOAD, and global scope objects in C++
我们编写了一个堆分析器(供参考,称为lib_debug
),它覆盖free
和malloc
(以及其他),主要用于监视我们的应用程序中的错误,如内存泄漏,这些应用程序部署在运行Linux的PPC系统上。lib_debug
被编译为共享库,并在需要时加载LD_PRELOAD
。
到目前为止,这个调试器运行得很好;每当调用malloc
时,都会在堆栈上创建一个内存监视器singleton,当这个singleton在退出时超出范围时,它会报告任何未释放的内存。
但是,我们的一个应用程序现在在全局范围内分配一个std::vector
。这个全局vector
似乎是在我们的堆分析器创建之前创建的,最重要的是在之后销毁。因此,一旦在main
中,如果我们在vector
中插入任何内容,lib_debug
就会认为我们在关闭时存在内存泄漏。
举例来说,这就是我认为的事件序列:
- CCD_ 12从CCD_
- CCD_ 14是在全局范围的堆栈上创建的
lib_debug
初始化发生-malloc
在某个地方被调用,这导致在堆栈上创建实际的堆分析器单例- 输入
main
- 发生
std::vector::push_back()
,在堆上分配内存 - CCD_ 19退出
lib_debug
堆分析器singleton超出范围,它发现vector
没有释放内存-报告错误vector
超出全局范围,释放内存- 程序终止
因此,有没有什么方法可以保证我们的LD_PRELOADed
单例总是最后一个被删除的东西,从而捕获应用程序中发生的每一个free
?
如果使用GCC
作为编译器,则此操作有效。您可以在库中定义一个函数作为constructor
,以便在加载库时执行代码。
static int initialize_lib_debug () __attribute__((constructor));
static int initialize_lib_debug () {
/* ... */
}
相关文章:
- 全局作用域中函数指针的赋值
- 不同作用域中的静态变量和全局变量
- 在编译时选择全局作用域函数
- 在c++中,全局作用域中只允许"表达式"初始化全局对象.我在哪里可以在标准中找到这个
- 用LD_PRELOAD和C++中的全局作用域对象加载堆分析器
- 是头文件全局作用域中的变量
- C++全局整数和作用域整数初始值
- 线程静态类方法与全局作用域
- C++全局作用域类
- 全局变量和枚举之间的作用域问题
- 全局作用域中匿名命名空间中的Can名称具有前导下划线
- 控制对c++全局作用域的访问
- 在iPhone xcode应用程序中,是否可以声明一个具有全局作用域的指针?
- 将Javascript函数添加到全局作用域
- c++中如何初始化全局作用域的静态成员
- 如何使.h中创建的变量成为程序的全局作用域
- 线程局部全局作用域变量
- 全局作用域枚举和命名空间冲突
- c++访问上层作用域而不是全局作用域
- 构造函数排序(全局作用域)问题