Valgrind_Memcheck

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 方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值