Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用LD#u PRELOAD和C+中的全局范围对象加载堆分析器+;_C++_Linux_Global Variables_Ld Preload - Fatal编程技术网

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 () {
        /* ... */
    }