【王者工具-Valgrind】Valgrind_Memcheck工具使用总结(01)

简介

Valgrind是一个工具框架,可以检测许C和C++程序中与内存相关的错误,这些错误很常见,可能会导致程序崩溃和不可预测的行为。该框架由许多工具组成,每个工具执行某种类型的调试、分析等任务。对于Valgrind来说,其内部设计是高度模块化的,所以可以很容易创建出新的工具而不会影响已经存在的工具。

在实际工程项目开发设计的全生命周期中,Valgrind工具会经常使用到。

目前Valgrind发行版主要包括7个产品级别的工具:

  • 一个内存错误检测器:Memcheck

  • 两个线程错误检测器:DRDHelgrind

  • 一个缓存和分支预测分析器:Cachegrind

  • 一个调用图生成缓存和分支预测分析器:Callgrind

  • 两个不同的堆分析器:MassifDHAT

  • 还包括一个实验性的SimPoint基本块向量生成器。

Valgrind可以在以下平台上运行:
X86/Linux、AMD64/Linux、ARM/Linux、ARM64/Linux、PPC32/Linux、PPC64/Linux、PPC64LE/Linux、S390X/Linux、MIPS32/Linux、MIPS64/Linux、X86/Solaris、AMD64/Solaris、ARM/Android(2.3。ARM64/Android, X86/Android(4.0及后续版本),MIPS32/Android, X86/FreeBSD, AMD64/FreeBSD, X86/Darwin和AMD64/Darwin (Mac OS x 10.12)。


安装

本文将在ubuntu 18.04版本上安装Valgrind。

从下列地址下载安装包,小生这里选择最新的版本:3.19.0

Valgrind最新发布地址:https://valgrind.org/downloads/current.html

下载完后将获取到一个压缩包:valgrind-3.19.0.tar.bz2

  • (1)在ubuntu终端中使用以下命令将压缩包解压缩:
tar -jxvf valgrind-3.19.0.tar.bz2
  • (2)使用以下命令切换到valgrind路径下:
cd valgrind-3.19.0/
  • (3)安装automake:

  • (4)安装autoconf:

  • (5)在valgrind路径下输入以下命令:
./autogen.sh

  • (6)接着输入以下命令配置valgrind:
./configure

配置完成后,会输出平台相关信息:

  • (7)在终端输入make -j4执行valgrind脚本构建操作。

  • (8)在终端输入sudo make install安装valgrind。

  • (9)验证

经过以上步骤后,valgrind就安装成功了,接着我们可以在终端键入:

valgrind --version

如果看见输出了对应版本信息,则证明valgrind安装成功,反之则没有安装成功啦!

至此,valgrind就成功安装完成,接下来让我们写个具体示例尝尝鲜…

示例

首先我们设计一个简单的C语言程序:

#include <stdio.h>
#include <stdlib.h>

void demo()
{
	printf("valgrind test demo\r");
	int * pint = malloc(5 * sizeof(int));
	pint[5] = 1;
}

int main()
{
	demo();
	return 0;
}

上述代码是一个在main函数中调用demo函数,完成一个信息的打印操作,然后使用malloc分配内容,然后来了一行错误的代码,接着就完了。就这样一个简单的C语言程序,下面让我们来实际使用Vargrind的Memcheck来进行内存检测和分析。

编译构建该份代码:

gcc -o test valgrand_test.c 

使用valgrind的memcheck工具进行内存分析(valgrind默认情况下会使用memcheck工具),在终端键入以下命令:

valgrind --tool=memcheck --leak-check=full --show-leak-kinds=all ./test

输出结果如下:

当valgrind memcheck工具运行完成后,会输出许多信息,我们需要仔细分析这些信息,从中获取到关于我们自己开发的软件中内存相关信息。

在上图中:

  • 20223是进程id,该信息一般不重要。

  • 有一个Invalid write of size 4信息:


出现这条信息,是由于上述代码中的:pint[5] = 1;这行错误操作导致的。

  • 接着显示了heap信息:


上图中显示了应用软件总共使用的heap大小,分配的数量,释放的数量。

  • 显示内存泄漏信息:


上图中,检测报告显示出现了一次内存泄漏,泄漏内存的大小为20字节。出现该条信息由以下代码导致:

int * pint = malloc(5 * sizeof(int));

上述代码操作将使用malloc分配5*4 = 20字节的heap内存,然而却没有使用free释放,从而导致内存泄漏。从valgrind中检测结果来看,与实际代码的问题相符。

总结

本文描述了一个使用vargrind进行应用程序内存检测的过程,大致如下:

(1)编译构建自己的C/C++应用程序。(需要将应用程序构建成调试版本的,vargrind需要使用到其中的调试信息)

(2)使用vargrind工具检测应用程序。

(3)结束应用程序,生成检测报告。(结束memcheck检查需要发送SIGINT信号,即按下Ctrl + c。不要发送SIGKILL信息结束进程,也不要使用Ctrl + z暂停进程,否则将无法生成相应的检测报告)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iriczhao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值