Linux常用工具--Electric Fence

<!-- [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


你可能感兴趣的:(C++,c,linux,C#,gcc)