5

我最近一直在试验 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 符号。

4

4 回答 4

4

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

new通常也不malloc直接调用(在某些系统上,如 Windows,它根本不调用malloc),它在处理分配之前和之后执行了一些自己的任务。对于这样的事情,你可能不得不走全局重载的半邪恶路线,newdelete强制它直接调用你mallocfree代码。

于 2012-02-29T07:52:34.940 回答
1

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

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 行为的各种环境变量

于 2014-03-13T02:51:23.170 回答
1

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

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

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

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

于 2016-03-14T11:43:20.427 回答
0

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

于 2015-11-28T20:35:15.417 回答