Ubuntu内存检测工具Valgrind用法:排查C++程序错误

检测维修 0 131

简介

Valgrind是个工具框架,它能够检测许多C和C++程序里跟内存有关的错误,这些错误是相当常见的,还可能致使程序崩溃以及出现不可预测的行为。这个框架是由好多工具构成的,每个工具都会执行某种类型的调试、分析等任务。对于Valgrind来讲,它的内部设计是高度模块化的,所以能够很轻易地创建出新的工具并且不会对已经存在的工具造成影响。

实际工程项目开展设计的整个生命周期里,Valgrind工具常常会被运用到。

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

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。

tar -jxvf valgrind-3.19.0.tar.bz2

cd valgrind-3.19.0/

./autogen.sh

./configure

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

执行完上述那些步骤之后,valgrind已然安装成功了,紧接着我们能够在终端输入:

valgrind --version

要是瞧见输出给出了相应版本信息,那就表明valgrind安装成功,要是反过来没瞧见对应版本信息,那就意味着没有安装成功啦!

在这里,valgrind已然成功地安装完毕,紧接着,让我们去撰写一个具体的示例来体验一番新鲜的感觉…

示例

Valgrind内存检测工具_ubuntu 内存检测工具_Valgrind Memcheck内存泄漏检测

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

#include 
#include 
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工具运行完毕之后,会有诸多信息被输出,我们得认真剖析这些信息,借此从中获取有关我们自行研发的软件里内存方面的信息。

在上图中:

这条信息得以出现,是源于上述代码里,存在着这样一行,就是:pint = 1;,此为造成错误的操作致使的。

上图之中,呈现出了应用软件在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去暂停进程,不然就没办法生成相应的检测报告)

相关推荐: