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

有2个主要的功能:

1. 内存越界读写时抛出 fault。当程序用申请内存时,会使用虚拟内存技术将分配的内存空间之后的内存页面设置为(不可读写和执行),所以当程序发生越界读写时,OS会发出信号,生成core文件(core dump),进程退出。

2. 当访问已经被释放的内存空间时抛出 fault。当程序把一块空间free之后,同样把这块内存的访问保护级别设置为,所以当程序再次访问这块已经释放的内存时也会导致 fault。

可以通过配置以下几个全局变量和环境变量来控制的行为:

1. :这是 分配空间的内存对齐字节数。这个变量的默认值是(int),32位字长的CPU对应的该值是4。这个值也是能够检测的内存越界的最小值。

2. : 默认情况下是把的页面置于分配的空间之后,所以检测到的是高地址方向的越界访问。把这个值设为1可以检测到低地址的越界访问。

3. : 通常free后的内存块会被放到内存池,等待重新被申请分配。把这个值设为1后,free后的内存块就不会被重新分配出去,而是也被设置为,所以能够发现程序再次访问这块已经free的内存。

4. : 默认会捕捉(0)的情况。把该值设为1后则不会捕捉申请0字节内存的情况。

5. : 分配内存后会将每一byte初始化成这个值(0-255)。当这个值被设成-1时,内存的值不固定。

使用时需要库文件.a,具体使用如下:

1. 查看并设置linux core文件的大小:

[root@RD22-TS root]# -c

[root@RD22-TS root]# -c 10000

[root@RD22-TS root]# -c

2. 如果已经安装,编译时直接链接库:

gcc –g –o ef ef.c –

如果没有安装,则需要指定.a的位置:

gcc –g –o ef ef.c – –L /usr/lib

3. 当发生 fault时就会在当前目录下生产一个core文件,在linux下,我们可以使用GDB来调试core:

Gdb ef core.xxxx

然后输入where就可以看到程序崩溃时的函数调用堆栈信息了。

ZebOS也支持,在配置文件/.opt/-IMISH中打开选项---,并应用配置文件./.opt/-IMISH-EF,接着打开.log文件并查看是否被正确配置,然后再编译就OK了。官方版本名字中带EF字样的都是支持EF的,如:ZebOS-7-8-2--IMISH-EF-.6.27.tar.gz

参考文件

Linux man page:man 或

未经允许不得转载! 作者:admin,转载或复制请以超链接形式并注明出处墨迹游戏网

原文地址:《内存调试工具Electric Fence》发布于:2024-12-12