【问题标题】:using electric fence in a c++ program在 C++ 程序中使用电围栏
【发布时间】:2012-02-29 07:08:03
【问题描述】:

我最近一直在试验 Electric Fence,但我不知道如何在 c++ 代码中使用它。

这是一个例子:

// test.cpp
#include <cstdlib>                                                                                                                                         

using namespace std;                                                                                                                                       

int main()                                                                                                                                                 
{                                                                                                                                                                                                                                                                                                     
        int *a = new int(10);                                                                                                                              
        delete a;                                                                                                                              
}  

我用

编译过
g++ ./test.cpp -o test -lefence -L/home/bor/efence_x86_64/lib -lpthread

而且我在开始时没有看到 Electric Fence 横幅,并且在可执行文件中找不到 EF 符号(使用 nm 命令)。

但是如果我这样修改程序:

// test.cpp
#include <cstdlib>                                                                                                                                         

using namespace std;                                                                                                                                       

int main()                                                                                                                                                 
{                                                                                                                                                          
        char *p = (char*)malloc(20);                                                                                                                       
        free(p);                                                                                                                                           
        int *a = new int(10);                                                                                                                              
        delete a;
}

一切都很好 - EF 出现了。我知道它有点解决问题,我知道:)。我只是想了解为什么它首先不起作用,因为new()应该调用malloc(),而delete()调用free(),不是吗?

我进入这个项目的原因是一个使用 boost 库和其他几个库的大项目。而且这个程序从不直接调用malloc()free()。当我用 EF 构建它时,我不仅将 EF 链接到最终的可执行文件,而且重建了所有试图将 EF 链接到它们的库。而且我在其中任何一个中都找不到 EF 符号。这是正确的方法吗?或者它是错误的,EF 应该只链接到最后的可执行文件,库应该保持不变?但是我又在可执行文件中找不到 EF 符号。

【问题讨论】:

标签: c++ linux memory-management memory-fences electric-fence


【解决方案1】:

您假设编译器正在编译 new 后面的代码,但该代码通常位于预编译 RT 中的某个位置。

new 通常也不直接调用malloc(在某些系统上,如Windows,它根本不调用malloc),它在处理之前和之后执行了a few tasks of its own分配。对于这样的事情,您可能不得不走全局重载newdelete 的半邪恶路线,以强制它直接从您的代码中调用mallocfree

【讨论】:

    【解决方案2】:

    来自 slackware 文档 http://slackbuilds.org/repository/13.1/libraries/electric-fence/

    In order to debug a program it needs to be linked with Electric Fence's
    library or dynamic linking needs to be used; README.Debian explains that
    in detail.
    
    
    If you're using c++, and you and want to statically link your c++
    programs, you shouldn't use g++ to link libefence.a, but rather:
    gcc -o myprog myprog.o -lstdc++ -lg++ -lefence
    (if you use g++, the order is different, and efence's malloc doesn't
    get used)
    

    请务必阅读 libefence 手册页,其中描述了如何设置 改变 lebefence 行为的各种环境变量

    【讨论】:

      【解决方案3】:

      对于正在寻找一种在 armv5 上使用电子围栏“调试”C++ 代码的快速方法的人:

      不需要静态编译和更改链接器命令。对我来说,安装电围栏并运行就足够了:

      LD_PRELOAD=libefence.so ./your-buggy-program
      

      (来自与上面引用的相同文档)

      【讨论】:

        【解决方案4】:

        仅当您的代码包含“mallocs”时,“-libefence”才会在使用“ldd”命令的构建二进制文件中可见。否则,如果没有“mallocs”而只有“new”,那么您可能在构建二进制文件的链接库列表中看不到“-libefence”库。

        【讨论】:

          猜你喜欢
          • 2023-04-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-20
          • 2020-02-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多