在C++程序中使用电子围栏
-
14-11-2019 - |
题
我最近一直在尝试 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
完全),它有 一些自己的任务 在处理分配之前和之后执行的操作。对于这样的事情,你可能不得不走全局超载的半邪恶路线 new
和 delete
强制它直接调用 malloc
和 free
从你的代码。
其他提示
来自 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”库。