您的位置:首页 > 运维架构 > Linux

Linux下使用valgrind工具对C++编程检测内存泄露

2017-07-11 21:35 585 查看

前言

之前在这篇文章中已经讲过了对Windows平台下内存泄露问题的检测。今天这篇文章里面将主要对Linux下C++编程造成的内存泄露进行检查,使用到的工具是valgrind,当然在Linux下还有一些其它的工具可以作为内存泄露检测,这就挑选了一个强大且符合问题查找习惯的工具。

1. 安装valgrind

对于没有安装valgrind的用户可以使用sudo命令直接进行安装

sudo apt-get install valgrind

安装完成之后查看安装的valgrind工具版本



2. valgrind工具介绍

Valgrind工具包包含多个工具,如Memcheck、Cachegrind、Helgrind, Callgrind和Massif,接下来就将对这些工具进行介绍

2.1 Memcheck

最常用的工具,用来检测程序中出现的内存问题,所有对内存的读写都会被检测到,一切对malloc()/free()/new/delete的调用都会被捕获。所以,Memcheck 工具主要检查下面的程序错误



2.2 Callgrind

和gprof类似的分析工具,但它对程序的运行观察更是入微,能给我们提供更多的信息。和gprof不同,它不需要在编译源代码时附加特殊选项,但加上调试选项是推荐的。Callgrind收集程序运行时的一些数据,建立函数调用关系图,还可以有选择地进行cache模拟。在运行结束时,它会把分析数据写入一个文件。callgrind_annotate可以把这个文件的内容转化成可读的形式。

2.3 Cachegrind

Cache分析器,它模拟CPU中的一级缓存I1,Dl和二级缓存,能够精确地指出程序中cache的丢失和命中。如果需要,它还能够为我们提供cache丢失次数,内存引用次数,以及每行代码,每个函数,每个模块,整个程序产生的指令数。这对优化程序有很大的帮助。

2.4 Helgrind

它主要用来检查多线程程序中出现的竞争问题。Helgrind寻找内存中被多个线程访问,而又没有一贯加锁的区域,这些区域往往是线程之间失去同步的地方,而且会导致难以发掘的错误。Helgrind实现了名为“Eraser”的竞争检测算法,并做了进一步改进,减少了报告错误的次数。不过,Helgrind仍然处于实验阶段。

2.5 Massif

堆栈分析器,它能测量程序在堆栈中使用了多少内存,告诉我们堆块,堆管理块和栈的大小。Massif能帮助我们减少内存的使用,在带有虚拟内存的现代系统中,它还能够加速我们程序的运行,减少程序停留在交换区中的几率。

此外,lackey和nulgrind也会提供。Lackey是小型工具,很少用到;Nulgrind只是为开发者展示如何创建一个工具

2.6 注意

(1)Valgrind不检查静态分配数组的使用情况

(2)Valgrind占用了更多的内存–可达两倍于你程序的正常使用量,如果你用Valgrind来检测使用大量内存的程序就会遇到问题,它可能会用很长的时间来运行测试

3. 测试

3.1 测试代码

/*************************************************************************
> File Name: mem_leak.cpp
> Author:
> Mail:
> Created Time: Tue 11 Jul 2017 08:55:16 PM CST
************************************************************************/
#include<iostream>
using namespace std;

int main(int argc, char* argv[])
{
int* array = new int[1024];	//没由delete
array[1025] = 0;	//数组越界

return 0;
}


3.1 测试结果

测试命令

valgrind --tool=memcheck --leak-check=full ./mem_leakleak
mem_leak是本次测试用例的执行文件,下面是对一些参数的解释

--leak-check=full  指的是完全检查内存泄漏

--show-reachable=yes 是显示内存泄漏的地点

--trace-children=yes 是跟入子进程

--log-file = log.txt 将调试信息输出到log.txt,不输出到屏幕

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: