<!-- [if !mso]> <mce:style><! v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} p\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} v\:textbox {display:none;} --><!-- [endif]--><!-- [if !ppt]--><!-- [endif]-->
一,Electric Fence工具
实际运行环境中经常比较困扰的问题是内存产生轻微越界,但是并没有立刻产生问题, 给调查带来很大难度。
如果程序问题调查没有头绪,可以借助 Electric Fence (简称 Efence )工具检查内存问题并产生 CORE 文件,比较精确的定位问题场所。
<!-- [if !mso]> <mce:style><! v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} p\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} v\:textbox {display:none;} --><!-- [endif]--><!-- [if !ppt]--><!-- [endif]-->
在发生如下问题的情况下此工具会转储
CORE
(
1
)动态分配内存边界外的读写操作
(
2
)访问已经
free
的内存
(
3
)
free
的地址不是
malloc()
分配的
Efence提供了几个全局和同名的环境变量,以控制内存检查的行为:
<!-- [if !mso]> <mce:style><! v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} p\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} v\:textbox {display:none;} --><!--[endif]--><!-- [if !ppt]--><!-- [endif]-->
环境变量(或局部变量名)
|
作用
|
EF_PROTECT_BELOW
|
默认情况下
Efence
检查的是高地址边界访问溢出,如需检查低
地址边界访问溢出时设定此环境变量(或局部变量为
1
)
环境变量设置:
export EF_PROTECT_BELOW 1
或者
局部变量设置:
extern int EF_PROTECT_BELOW;
EF_PROTECT_BELOW = 1;
|
EF_PROTECT_FREE
|
此变量设定为
1
可启动对已经释放内存的访问的检查。
|
EF_ALLOW_MALLO
C
_0
|
默认情况下
Efence
会行中会将分配
0
字节的代码
malloc(0)
作为
非法处理。此变量设定为
1
则程序在运时忽略此检查。
|
EF_ALIGNMENT
|
Efence
不检查不足此数值的内存地址越界。默认为
sizeof(int)
。设置为
0
或
1
可以检查任意长度的内存越界。
|
二,举例
在编译的时候链接 efence库,静态或者动态库。
<!-- [if !mso]> <mce:style><! v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} p\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} v\:textbox {display:none;} --><!-- [endif]--><!-- [if !ppt]--><!-- [endif]-->
$gcc -g –o array array.c –lefence
$./array (由于该程序存在数组越界,所以运行的时候会产生core dump,源程序略)
Electric Fence 2.2.0 Copyright (C) 1987-1999 Bruce Perens …
Segmentation fault