我最近一直在尝试使用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符号。
答案 0 :(得分:4)
您假设编译器正在编译new
后面的代码,但该代码通常位于预编译RT中的某个位置。
new
通常也不会直接调用malloc
(在Windows等某些系统上,根本不调用malloc
),它有a few tasks of its own在处理分配之前和之后执行。对于类似这样的事情,你可能不得不走遍全球超载new
和delete
的半邪恶路线,迫使它直接从你的代码中调用malloc
和free
。< / 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的链接库列表中的库。