这篇文章可能会有一些晦涩,前面是用于介绍理论上的使用方法,但是后面会用一个完整的例子和流程来解释Valgrind的用法,希望这篇文章能够对您有所帮助,谢谢😀
内存检测Valgrind
什么是Valgrind
当我们在进行一个比较大的工程项目时,代码量上去以后对于一些内存的处理可能会出现一些问题,比如取到空指针指向的值、动态分配的内存没有释放、数组越界访问等等…,这些问题如果用眼睛看那真的是折磨人是费时费力,而Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,作者是获得过Google-O’Reilly开源大奖的Julian Seward,它包含一个内核──一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务──调试,分析,或测试等,内存检测,我们可以使用它的工具:Memcheck来检测内存。
Valgrind 安装
方法 1. valgrind官网:http://valgrind.org下载
方法 2. Ubuntu环境下:sudo apt-get install valgrind
Memcheck检测范围
用来检测c/c++程序中出现的内存问题,所有对内存的读写都会被检测到,一切对malloc()/free()/new/delete的调用都会被捕获。所以,它能检测以下问题:
-
对未初始化内存的使用;
-
读/写释放后的内存块;
-
读/写超出malloc等分配的动态内存范围;
-
读/写不适当的栈中内存块;
-
内存泄漏,指向一块内存的指针永远丢失;
-
不正确的malloc/free或new/delete匹配;
-
memcpy()相关函数中的dst和src指针重叠问题。
Memcheck 检查步骤及注意事项
-
1.在编译程序的时候打开调试模式(gcc编译器的-g选项),以便显示行号,编译时去掉-O1 -O2等优化选项;检查的是C++程序的时候,考虑加上选项: -fno-inline ,这样它函数调用链会很清晰
-
2.执行:valgrind --tool=memcheck --leak-check=full --log-file=./log.txt 目标可执行文件
-
3.程序运行结束,查看 log.txt 中的结果。
结果分析
-
1.illegal read/illegal write errors 非法读取/非法写入错误
-
2.use of uninitialised values 使用未初始化的区域
-
3.use of uninitialised or unaddressable values in system calls 系统调用时使用了未初始化或不可寻址的地址
-
4.illegal frees 非法的释放
-
5.when a heap block is freed with an inappropriate deallocation function 分配和释放函数不匹配
-
6.overlapping source and destination blocks 源和目的内存块重叠
-
7.memory leak detection 内存泄漏检测
7.1 Still reachable 内存指针还在还有机会使用或者释放,指针指向的动态内存还没有被释放就退出了 7.2 Definitely lost 确定的内存泄露,已经不能够访问这块内存 7.3 Indirectly lost 指向该内存的指针都位于内存泄露处 7.4 Possibly lost 可能的内存泄露,仍然存在某个指针能够访问某块内存,但该指针指向的已经不是该内存首位置 7.5 Suppressed 某些库产生的错误不予以提示,这些错误会被统计到suppressed项目
具体例子
demo.c
#include<stdio.h>
#include<stdlib.h>
void f(void)
{
int*x=malloc(10*sizeof(int));
x[10]=0; //问题1:越界访问
} //问题2:malloc完内存没有释放
int main()
{
f();
return 0;
}
1.编译链接产生可执行文件demo2.利用valgrind工具产生log.txt
3.查看log.txt分析问题