参考:http://www.cnblogs.com/sunyubo/archive/2010/05/05/2282170.html

几乎是照抄参考过来的,只不过后面自己调试一下代码。

这里主要介绍Valgrind的一些简单用法。更多详细的使用方法可以访问valgrind的主页:http://www.valgrind.org

Valgrind是Julian Seward的作品。Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,它包含一个内核,一个软件合成的CPU,和一系列的小工具。

每个工具都可以完成一项任务—调试分析或测试等。

Valgrind可以检测内存泄漏和内存违例。还可以分析cache的使用,灵活又强大,值得入手。

一、Valgrind概述

它主要有下列几个工具。

1.Memcheck

最常用的,用来检测程序中出现的内存问题,所有对内存的读写都会被检测到,一切对malloc和free的调用都会被捕获,所以它能检测下列问题:

1)对为初始化内存的使用

2)读/写释放后的内存块

3)读/写超出malloc分配的内存块

4)读/写不适当的栈中的内存块

5)内存泄漏,指向一块内存的指针永远丢失

6)不正确的malloc/free或new/delete匹配

7)memcpy相关函数中的dst和src指针重叠

2.Callgrind

和gprof类似的分析工具,但它对程序的运行观察更细致入微,能给我们提供更多的信息。和gprof不同,它不需要在编译源代码时添加附加特殊选项,但加上调试选项是推荐的。

Callgrind收集程序运行时的一些数据,建立函数调用关系图,还可以有选择的进行cache模拟。在运行结束时,它会把分析数据写入一个文件,callgrind_annotate可以把这个文件的内容转化成可读的形式。

3.Cachegrind

Cache分析器,它模拟CPU中的一级缓存I1,DI和二级缓存,能够精确的指出程序中cache的丢失和命中。

如果需要,它还能为我们提供cache丢失次数,内存引用次数,以及每行代码,每个函数,每个模块整个程序产生的指令数,这对优化程序有很大的帮助。

4.Helgrind

用来检测多线程程序中出现的竞争问题。Helgrind寻找内存中内对个线程访问,而又没有一贯加锁的区域。这些区域往往是线程之间失去同步的情况,而且会导致难以发掘的错误。

Helgrind实现了名为“Eraser”的竞争检测算法,并做了进一步改进,减少了报告错误的次数。不过Helgrinf仍然处于实验阶段。

5.Massif

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

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

二、使用Valgrind

先安装,我的服务器上已经安装好了,不知道是不是所有的linux都自带这个东西。

命令格式如下:

valgrind [valgtind-options] your-prog [your-prog options]

比如:

-h  显示帮助信息

--version 显示内核版本信息(我也不知道为啥不是-v)

-q 安静的运行,只打印错误信息

-tool=[default:memcheck]  最常用的选项,后面接工具名。如果省略工具名,默认运行memcheck

比如下面的程序:

#include<stdio.h>

#include<stdlib.h>

void fun()

{

         int *x = malloc( * sizeof(int));

         x[] = ;

}

int main()

{

         int i = ;

         fun();

         printf("i = %d\n", i);

         return ;

}

存在两个问题:

1)没有free掉申请的资源

2)fun函数里面越界了,x[10]是非法的

下面演示如何使用valgrind中的memcheck:

调用时还可以加上tool:  $valgrind –tool=memcheck ./malloc

==28308== 中的28308表示程序运行时的进程号。

Invalid write of size 4:表示非法写入,下面是告诉我们错误发生的位置,在main中调用的fun函数。

HEAP SUMMARY:说明了堆的情况,可以看到申请了40个字节,后面说有1个申请,0个被free。

LEAK SUMMARY:也是说的堆的泄漏情况,明显丢失的有40个字节。

如果main中的i没有赋值,这里还会有一些其他的错误,具体可以自己试一下。这个需要运用到实际项目中才能更加理解。

下面就是i没有赋值的错误信息截取了部分:

下面介绍一些其他用法(我也是照着参考学的,具体如何用到实际项目中还需要自己领悟):

测试下面时,main函数中的i我改为了没有赋值:

1.一旦出现错误,valgrind会自动启动调试器(一般是gdb):

2.下面来试试callgrind:

可以看到生成了一个文件(绿色框框)。当callgrind运行你的程序时,还可以使用callgrind_control来观察程序的执行,而且不会干扰它的运行:

下面显示如何查看详细信息:

3.再来试试cachegrind:

上面是指令缓存,I1和L2i缓存的访问信息,包括总的访问次数,丢失次数,丢失率。

中间是数据缓存,D1和L2d缓存的访问相关信息。

下面是L2缓存单独的信息。

也有一个输出文件,cachegrind.out.25843,可以用cg_annotate 来查看。显示出详细的列表。

4.missif的使用

跟cachegrind类似,只不过生成的文件不一样,生成的是massif.pid.ps的PostScript文件,里面只有一副描述堆栈使用情况的彩图。

Linux下检测内存泄露的工具 valgrind的更多相关文章

  1. 如何在linux下检测内存泄漏

    之前的文章应用 Valgrind 发现 Linux 程序的内存问题中介绍了利用Linux系统工具valgrind检测内存泄露的简单用法,本文实现了一个检测内存泄露的工具,包括了原理说明以及实现细节. ...

  2. 如何在linux下检测内存泄漏(转)

    本文转自:http://www.ibm.com/developerworks/cn/linux/l-mleak/ 本文针对 linux 下的 C++ 程序的内存泄漏的检测方法及其实现进行探讨.其中包括 ...

  3. Qt应用中检测内存泄露——VLD

    本文简要描述一下在Qt应用中使用VLD来检测内存泄露.本次测试环境:QtCreator2.3 + Qt4.7.4-vs2008 + VS2008 Express. 1.下载并安装:VLD-2.2: h ...

  4. 【调试】Linux下超强内存检测工具Valgrind

    [调试]Linux下超强内存检测工具Valgrind 内容简介 Valgrind是什么? Valgrind的使用 Valgrind详细教程 1. Valgrind是什么? Valgrind是一套Lin ...

  5. Linux C 编程内存泄露检测工具(一):mtrace

    前言 所有使用动态内存分配(dynamic memory allocation)的程序都有机会遇上内存泄露(memory leakage)问题,在Linux里有三种常用工具来检测内存泄露的情況,包括: ...

  6. Valgrind检测内存泄露简介

    原文地址: Valgrind 概述 体系结构 Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合.Valgrind由内核(core)以及基于内核的其他调试工具组成.内核 ...

  7. Linux Debugging (九) 一次生产环境下的“内存泄露”

    一个偶然的机会,发现一个进程使用了超过14G的内存.这个进程是一个RPC server,只是作为中转,绝对不应该使用这么多内存的.即使并发量太多,存在内存中的数据太多,那么在并发减少的情况下,这个内存 ...

  8. valgrind--CPP程序内存泄露检查工具

    内存泄漏是c++程序常见的问题了,特别是服务类程序,当系统模块过多或者逻辑复杂后,很难通过代码看出内存泄漏. valgrind是一个开源的,检测c++程序内存泄漏有效工具,编译时加上-g选项可以定位到 ...

  9. 使用新版Android Studio检测内存泄露和性能

    内存泄露,是Android开发者最头疼的事.可能一处小小的内存泄露,都可能是毁于千里之堤的蚁穴.  怎么才能检测内存泄露呢?网上教程非常多,不过很多都是使用Eclipse检测的, 其实1.3版本以后的 ...

随机推荐

  1. BZOJ 2111: [ZJOI2010]Perm 排列计数 [Lucas定理]

    2111: [ZJOI2010]Perm 排列计数 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1936  Solved: 477[Submit][ ...

  2. getHibernateTemplate() VS getSession()

    如题所示,对于这个问题,官网文档已给出答案,详见: /** * Obtain a Hibernate Session, either from the current transaction or * ...

  3. OpenLayer3调用天地图示例

    最近,工作中有需要用Openlayer3脚本库调用天地图的wmts服务接口,由于这两个都是刚开始接触,所以是摸着石头过河,遇到了地图显示不了的问题,虽然官网http://www.zjditu.cn/r ...

  4. yum 安装 nfs,rpcbind 出现错误 libc.so.6(GLIBC_2.14)(64bit) is needed by

    错误信息: Running rpm_check_debugERROR with rpm_check_debug vs depsolve:libc.so.6(GLIBC_2.14)(64bit) is ...

  5. elk安装配置

    ELK介绍   官网https://www.elastic.co/cn/ 中文指南https://www.gitbook.com/book/chenryn/elk-stack-guide-cn/det ...

  6. OpenCV角点检测goodFeaturesToTrack()源代码分析

    上面一篇博客分析了HARRIS和ShiTomasi角点检测的源代码.而为了提取更准确的角点,OpenCV中提供了goodFeaturesToTrack()这个API函数,来获取更加准确的角点位置.这篇 ...

  7. C/C++语言简介之程序结构

    C语言的模块化程序结构用函数来实现,即将复杂的C程序分为若干模块,每个模块都编写成一个C函数,然后通过主函数调用函数及函数调用函数来实现一大型问题的C程序编写,因此常说:C程序=主函数+子函数.因此, ...

  8. js闭包面试题目

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. .NET中的按需加载/延迟加载 Lazy<T>

    业务场景: 在项目开发中,经常会遇到特定的对象使用的加载问题,有的实例对象我们创建之后并非需要使用,只是根据业务场景来调用,所以可能会导致很多无效的实例加载 延迟初始化出现于.NET 4.0,主要用于 ...

  10. Centos环境下给PHP7.0安装yaf扩展

    首先要知道PHP的安装目录在哪里,以我当前的路径为例,在/usr/local/php目录下. 下一步需要下载扩展包,进入http://pecl.php.net/package/yaf寻找符合版本要求的 ...