一、Valgrind安装
valgrind是一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具。 在安装valgrind之前,要先安装autoconf和automake。您可以使用命令autoconf --version和automake --version检查这两个工具是否有安装。(1)下载最新的安装包
http://valgrind.org/downloads/current.html
或者是输入命令:
wget http://valgrind.org/downloads/valgrind-3.10.1.tar.bz2
(2)解压缩安装包,输入命令:
tar -jxvf valgrind-3.10.1.tar.bz2
(3)进入解压缩后生成的目录valgrind-3.10.1,输入命令:
cd valgrind-3.10.1
(4)运行./autogen.sh设置环境,输入命令:
./autogen.sh
如果你碰到如下错误:aclocal: command not found
则表示你需要安装autoconf和automake两个工具,请先查看“安装autoconf“和”安装automake“两个步骤。
(5)运行configure文件,生成Makefile。
(6)编译并安装valgrind,输入命令:
make;make install
(7)检查安装是否成功:
valgrind --version
二、测试代码:
#include <stdlib.h> int* func(void) { int* x = malloc(10 * sizeof(int)); x[10] = 0; //问题1: 数组下标越界 } int main(void) { int* x=NULL; x=func(); //free(x); x=NULL; return 0; //问题2: 内存没有释放 } 编译:g++ -g -o testdump main.cpp Valgrind检查:valgrind --tool=memcheck --leak-check=yes ./testdump说明:
Invalid write of size 4:表示数组越界写了4字节; 40 bytes in 1 blocks:表示因程序退出而发生内存泄露40字节;修改Bug之后再进行valgrind检查:没有了内存泄漏和数组越界问题!
小结: 一、Valgrind 中包含的 Memcheck 工具可以检查以下的程序错误: (1)使用未初始化的内存 (Use of uninitialised memory) (2)使用已经释放了的内存 (Reading/writing memory after it has been free'd) (3)使用超过malloc分配的内存空间(Reading/writing off the end of malloc'd blocks) (4)对堆栈的非法访问 (Reading/writing inappropriate areas on the stack) (5)申请的空间是否有释放 (Memory leaks – where pointers to malloc'd blocks are lost forever) (6)malloc/free/new/delete申请和释放内存的匹配(Mismatched use of malloc/new/new [] vs free/delete/delete []) (7)src和dst的重叠(Overlapping src and dst pointers in memcpy() and related functions) (8)重复free二、工程经验
对于写好的代码,想要检查是否存在内存问题,可以结合Coverity静态内存检查和Valgrind内存检测。注意:Coverity静态检测不能检测动态内存问题。
--------------------- 作者:SoaringLee_fighting 来源:CSDN 原文:https://blog.csdn.net/soaringlee_fighting/article/details/77925402 版权声明:本文为博主原创文章,转载请附上博文链接!