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) 。设置为 01 可以检查任意长度的内存越界。

二,举例

在编译的时候链接 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


Linux系统下内存泄漏检测工具较为丰富,适用于不同场景和需求。以下是一些常用的内存泄漏检测工具及其特点: - **Valgrind** 是一款广泛使用的内存调试工具,其中的 **Memcheck** 模块可以检测内存泄漏、非法访问等问题。它通过动态二进制插桩技术运行程序,能够提供详细的错误信息和调用栈跟踪,适合在开发阶段使用。但其性能开销较大,不适合用于生产环境。 - **AddressSanitizer (ASan)** 是 LLVM 和 GCC 编译器支持的一种快速内存错误检测器,能够在运行时检测内存泄漏、缓冲区溢出等。与 Valgrind 相比,ASan 的性能损失较小,且集成在编译器中,使用方式简单,只需在编译时加上 `-fsanitize=address` 选项并启用链接支持即可[^1]。 - **LeakSanitizer (LSan)** 是 AddressSanitizer 的一个子组件,专注于内存泄漏检测。它可以独立使用或与 ASan 配合,提供更精确的泄漏报告。LSan 在程序退出时自动触发泄漏检查,并输出泄漏的堆栈信息。 - **mtrace** 是 GNU C Library 提供的一个轻量级工具,通过 `mtrace()` 函数记录内存分配和释放日志。用户需要手动插入这些函数调用并在运行程序时设置 `MALLOC_TRACE` 环境变量。虽然功能不如现代工具强大,但对于简单的应用场景仍然有效。 - **Electric Fence** 是一个用于检测内存越界访问和泄漏的小型库,通常通过预加载方式使用。它会在每次内存分配时放置保护页来捕捉非法访问行为,适合用于调试特定模块的问题。 - **NJAMD(Not Just Another Memory Debugger)** 支持在不重新编译应用程序的情况下进行内存泄漏检测,可以通过预加载库的方式启用。它还具备对 GUI 小部件分配器、C++ new/delete 以及封装 malloc/free 的库函数中的内存泄漏追踪能力[^1]。 - **YAMD(Yet Another Memory Debugger)** 是另一个用于检测内存泄漏的工具,设计目标是简化内存问题的诊断过程。它可以作为独立工具使用,也可以集成到 GDB 中进行调试。 此外,Linux 内核本身也提供了一些辅助机制,例如 `/proc/<pid>/maps` 和 `/proc/<pid>/smaps` 文件,可用于查看进程的内存映射和详细内存使用情况。结合 `pmap` 命令可以分析进程的内存分布,帮助定位潜在的内存问题。 对于 C++ 项目,建议结合智能指针(如 `std::unique_ptr` 和 `std::shared_ptr`)等现代语言特性来减少手动管理内存带来的风险。同时,定期使用上述工具进行内存泄漏扫描,有助于提高程序的稳定性和性能[^2]。 ```bash # 使用 valgrind 检测内存泄漏的示例命令 valgrind --leak-check=full --show-leak-kinds=all ./your_program # 使用 address sanitizer 编译并运行程序 g++ -fsanitize=address -o your_program your_code.cpp ./your_program ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值