我最近一直在尝试 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(), , 不?

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

有帮助吗?

解决方案

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

new 一般也不会打电话 malloc 直接(在某些系统上,如Windows,它不会调用 malloc 完全),它有 一些自己的任务 在处理分配之前和之后执行的操作。对于这样的事情,你可能不得不走全局超载的半邪恶路线 newdelete 强制它直接调用 mallocfree 从你的代码。

其他提示

来自 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 描述了如何设置各种环境变量的manpage

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top