valgrind工具
1、概述
Valgrind是一套 Linux 下,开放源代码(GPL V2)用于内存调试、内存泄漏检测以及性能分析的仿真调试工具的集合。Valgrind由内核(core)以及基于内核的其他调试工具组成。内核类似于一个框架(framework),它模拟了一个 CPU 环境,并提供服务给其他工具;而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务。Valgrind 的体系结构如下图所示:
Valgrind 包括如下一些工具:
◼ Memcheck。这是 valgrind 应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,比如:使用未初始化的内存,使用已
经释放了的内存,内存访问越界等。
◼ Callgrind。它主要用来检查程序中函数调用过程中出现的问题。
◼ Cachegrind。它主要用来检查程序中缓存使用出现的问题。
◼ Helgrind。它主要用来检查多线程程序中出现的竞争问题。
◼ Massif。它主要用来检查程序中堆栈使用中出现的问题。
◼ Extension。可以利用 core 提供的功能,自己编写特定的内存调试工具。
2、编译安装
wget https://fossies.org/linux/misc/valgrind-3.15.0.tar.bz2
tar -jxvf valgrind-3.15.0.tar.bz2
cd valgrind-3.15.0
./configure
make
sudo make install
3、代码调试
#include <stdio.h>
#include <stdlib.h>
void fun_memleak()
{//内存申请未释放
int *p = (int *)malloc(10*sizeof(int));
p[10] = 0; //地址越界 并且内存未释放
}
void fun_valNoInit()
{//局部变量未初始化
int num; //未初始化
int a = 1;
if(a == 2)
{
num = 10;
}
if(num == 99)
{
printf("num = %d\n",num);
}
}
void fun_addrOver()
{//数组越界
int *p = (int *)malloc(1*sizeof(int));
p[1] = 10;
}
int main(void)
{
printf("test memcheck\n");
fun_memleak();
fun_valNoInit();
fun_addrOver();
//getchar();
return 0;
}
运行结果
4、测试结果保存文件
valgrind --log-file=./valgrind_report.log --leak-check=full --show-leak-kinds=all --show-
reachable=no --track-origins=yes ./执行程序
参数说明
◼ -log-file
指定报告输出文件
◼ -track-origins=yes
是否显示未定义的变量,在堆、栈中被定义没有被 initialised 的变量都被定义成origins,默认是关闭这个 option 的。
◼ -show-leak-kinds=all
这里可以支持的选项有[definite|possible],注 一般只需要去关注 definite(明确的),possible 是可能会存在。
◼ -leak-check=full
当服务器退出时是否收集输出内存泄漏,选项有[no|summary|full]这个地方我们将其设置成全输出,默认将会使用 summary 方式。