当前位置:网站首页>内存调试工具Electric Fence

内存调试工具Electric Fence

2022-08-11 05:32:00 千册

下面的内容转载自内存调试工具Electric Fence_ChenXin的专栏-CSDN博客_electric fence

程序中的内存越界读写会带来严重的问题,虽然有时问题不会立刻表现出来,但会埋下严重的隐患,总会有一天程序会莫名的崩溃,而且这种问题调查起来会很吃力。Efence(Electric Fence)可以在debug阶段帮我们最大程度的发现这种问题,并精确定位问题的所在。

Efence有2个主要的功能:
1. 内存越界读写时抛出segmentation fault。当程序用malloc申请内存时,Efence会使用虚拟内存技术将分配的内存空间之后的内存页面设置为inaccessible(不可读写和执行),所以当程序发生越界读写时,OS会发出SIGSEGV信号,生成core文件(core dump),进程退出。
2. 当访问已经被释放的内存空间时抛出segmentation fault。当程序把一块空间free之后,Efence同样把这块内存的访问保护级别设置为inaccessible,所以当程序再次访问这块已经释放的内存时也会导致segmentation fault。

可以通过配置以下几个全局变量和环境变量来控制Efence的行为:
1. EF_ALIGNMENT:这是Efence malloc分配空间的内存对齐字节数。这个变量的默认值是sizeof(int),32位字长的CPU对应的该值是4。这个值也是Efence能够检测的内存越界的最小值。
2. EF_PROTECT_BELOW: 默认情况下Efence是把inaccessible的页面置于分配的空间之后,所以检测到的是高地址方向的越界访问。把这个值设为1可以检测到低地址的越界访问。
3. EF_PROTECT_FREE: 通常free后的内存块会被放到内存池,等待重新被申请分配。把这个值设为1后,free后的内存块就不会被重新分配出去,而是也被设置为inaccessible,所以Efence能够发现程序再次访问这块已经free的内存。
4. EF_ALLOW_MALLOC_0: Efence默认会捕捉malloc(0)的情况。把该值设为1后则不会捕捉申请0字节内存的情况。
5. EF_FILL: 分配内存后Efence会将每一byte初始化成这个值(0-255)。当这个值被设成-1时,内存的值不固定。

Efence使用时需要库文件libefence.a,具体使用如下:
1. 查看并设置linux core文件的大小:
[[email protected] root]# ulimit -c
0
[[email protected] root]# ulimit -c 10000

[[email protected] root]# ulimit -c unlimited
2. 如果已经安装Efence,编译时直接链接efence库:
gcc –g –o ef ef.c –lefence
如果没有安装Efence,则需要指定libefence.a的位置:
gcc –g –o ef ef.c –lefence –L /usr/lib
3. 当发生segmentation fault时就会在当前目录下生产一个core文件,在linux下,我们可以使用GDB来调试core:
Gdb ef core.xxxx
然后输入where就可以看到程序崩溃时的函数调用堆栈信息了。
————————————————
版权声明:本文为CSDN博主「chessinge」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chessinge/article/details/6743764

写一个测试程序,使用mallc分配1024个字节,有效内存边界是0-1023,我们访问边界之后的内存1024,看看运行状态

 从结果来看,什么都没有发生,接下来链接libfence.a库,这个库要字节下载源码,并编译后得到。

 

这时候报错了,这是因为efence库将malloc及其关联的函数,使用虚拟机内存机制对其原型进行了替换,添加了保护机制,所以访问越界内存时,触发了保护机制,产生了段错误。这时如果想看到具体发生错误的地点,可以使用gdb调试,如下图

上述就是efence的具体使用方法了,是不是很简单,很强大,很nice。

 

 

 

原网站

版权声明
本文为[千册]所创,转载请带上原文链接,感谢
https://blog.csdn.net/yueni_zhao/article/details/123148939