当前位置:网站首页>内存调试工具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。
边栏推荐
猜你喜欢
随机推荐
树莓派设置静态IP地址
OpenGL 简化点光源与平行光的对比实验
【LeetCode-49】字母异位词分组
解决8080端口被占用问题
无胁科技-TVD每日漏洞情报-2022-7-26
【力扣】判断子序列
【LeetCode-75】 颜色分类
Unity两种VR环境配置方法
非对称加密——网络安全
ssh中的密码登录和密钥登录
Threatless Technology-TVD Daily Vulnerability Intelligence-2022-8-6
vulnhub靶机--6Day_Lab-v1.0.1
uboot代码解析1:根据目的找主线
Threatless Technology-TVD Daily Vulnerability Intelligence-2022-7-26
5月leetcode-C#刷题日志(持续更新中)
2022年全国职业技能大赛网络安全竞赛试题B模块自己解析思路(4)
无胁科技-TVD每日漏洞情报-2022-7-27
无胁科技-TVD每日漏洞情报-2022-7-28
Threatless Technology-TVD Daily Vulnerability Intelligence-2022-8-3
Unity 使用双缓冲实现一个好用的计时器