由于C和C++程序中常常需要程序员自主申请和释放内存,在大型的、复杂的应用程序中就会常常出现内存错误。Valgrind是linux环境下的一款功能齐全的内存调试和性能分析工具集,它包括Memcheck
、Callgrind
、Cachegrind
、Helgrind
、Massif
等工具。
本文分为三个部分:valgrind工具的下载与安装、实例解析、常用选项说明。通过这三部分的学习,读者可以基本掌握valgrind工具的内存调试方法。
1. 下载与安装
sudo apt install valgrind
2. 实例解析
#include<stdlib.h>
#include<iostream>
using namespace std;
void GetMemory(char*p,int num)
{
p=(char*)malloc(sizeof(char)*num);// 申请了内存但是没有释放
}
int main(int argc,char**argv)
{
char*str=NULL;
GetMemory(str,100);
cout<<"Memory leak test!"<<endl;
return 0;
}
编译上述代码,得到可执行文件test。使用Valgrind允许可执行文件如下图所示:
可以看到结果如下:
内存泄漏检测
分析结果:
//11950 为进程ID
==11950== 100 bytes in 1 blocks are definitely lost in loss record 1 of 2
==11950== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==11950== by 0x4008B1: GetMemory(char*, int) (in /home/zz/code/test)
==11950== by 0x4008E0: main (in /home/zz/code/test)
上面的结果告诉我们是在main中调用了GetMemory导致的内存泄漏,GetMemory中是调用了malloc导致泄漏了100字节的内存。
3. Valgrind工具选项说明
valgrind 命令的基本格式为:valgrind [base option] --tool=<tool name> [tool option] your-program [program options]
本文仅列出了一些常用的选项,更详细的选项说明可参考valgrind home网站上的相关章节(http://www.valgrind.org/)。
a) Valgrind基本选项及其说明
--tool
:指定使用的具体工具,可以为Memcheck、Callgrind、Cachegrind、Helgrind、Massif等工具;
b) Memcheck相关选项及其说明
--leak-check=<no|summary|yes|full> [default: summary]
:no表示不检测,summary只显示统计信息,yes和full显示详细信息,即上述四种泄露的详细信息。
网友评论