内存检测工具Valgrind
Valgrind是运行在Linux上的一套基于仿真技术的程序调试和分析工具,作者是获得过Google-O’Reilly开源大奖的Julian Seward,它包含一个内核——一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务——调试,分析,测试等。 内存检测,使用它的Memcheck工具。
Valgrind安装
- 官网
http://valgrind.org
- ubuntu
sudo apt-get install valgrind
Memcheck检测范围
Memcheck用来检测C/C 程序中出现的内存问题,所有对内存的读写都会被检测到,一切malloc()/free()/new/delete的调用都会被捕获,所以,它能检测以下问题:
- 对未初始化内存的使用;
- 读/写释放后的内存块
- 读/写超出malloc等分配的动态内存范围
- 读/写不适当的栈中内存块
- 内存泄漏,指向一块内存的指针丢失
- 不正确的malloc/free或new/delete匹配
- memcpy()相关函数中的dst和src指针重叠问题
Memcheck检查步骤及注意事项
- 在编译程序的时候打开调试模式(gcc编译器的-g选项),以便显示行号,编译时去掉-O1 -O2等优化选项,检查的是C 程序的时候,考虑加上选项:-fno-inline,这样它的函数调用链接会很清晰。
- 执行:
valgrind --tool=memcheck --leak-check=full --log-file=./log.txt ./YourProgram
- 程序运行结束,打开log.txt查看结果。
结果分析
Valgrind(memcheck)包含这7类错误
- illegal read/illegal write errors —— 非法读取/非法写入错误
- use of uninitialised values —— 使用未初始化的区域
- use of uninitialised or unaddressable values in system calls —— 系统调用时使用了未初始化或不可寻址的地址
- illegal frees —— 非法的释放
- when a heap block is freed with an inappropriate deallocation function —— 分配和释放函数不匹配
- overlapping source and destination blocks —— 源和目的内存块重叠
- memory leak detection —— 内存泄漏检测
- Still reachable —— 内存指针还在,还有机会使用或者释放,指针指向的动态内存还没有被释放就退出了
- Definitely lost —— 确定的内存泄露,已经不能够访问这块内存
- Indirectly lost —— 指向该内存的指针位于内存泄露处
- Possibly lost —— 可能的内存泄露,仍然存在某个指针能够访问某块内存,但该指针指向的已经不是该内存首位置
- Suppressed —— 某些库产生的错误不予以提示,这些错误会被统计到suppressed项目
示例
产生错误的代码:
代码语言:javascript复制#include <stdlib.h>
void f(void){
int *x = malloc(10*sizeof(int));
x[10] = 0;//越界访问
//内存没释放
}
int main(void){
f();
return 0;
}
编译:
代码语言:javascript复制gcc -g demo.c -o demo
检测:
代码语言:javascript复制valgrind --tool=memcheck --leak-check=full --log-file=./log.txt ./demo
查看错误: