在c ++程序中使用电栅栏

时间:2012-02-29 07:08:04

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

我最近一直在尝试使用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最终只能链接到可执行文件,libs应保持不变?但是我再次在可执行文件中找不到EF符号。

4 个答案:

答案 0 :(得分:4)

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

new通常也不会直接调用malloc(在Windows等某些系统上,根本不调用malloc),它有a few tasks of its own在处理分配之前和之后执行。对于类似这样的事情,你可能不得不走遍全球超载newdelete的半邪恶路线,迫使它直接从你的代码中调用mallocfree。< / p>

答案 1 :(得分:1)

来自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联机帮助页 改变淫秽行为的各种环境变量

答案 2 :(得分:1)

对于那些正在寻找快速方式来调试&#34; armv5上带有电栅栏的C ++代码:

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

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

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

答案 3 :(得分:0)

只有当你的代码包含&#34; mallocs&#34;时,&#34; -libefence&#34;使用&#34; ldd&#34;在构建二进制文件中可见命令。否则,如果没有&#34; mallocs&#34;并且只有&#34;新&#34;那么,你可能看不到&#34; -libefence&#34; build-binary的链接库列表中的库。