Valgrind是用于构建动态分析工具的探测框架。它包括一个工具集,每个工具执行某种类型的调试、分析或类似的任务,以帮助完善你的程序。Valgrind的架构是模块化的,所以可以容易地创建新的工具而又不会扰乱现有的结构。

许多有用的工具被作为标准而提供。

  1. Memcheck是一个内存错误检测器。它有助于使你的程序,尤其是那些用C和C++写的程序,更加准确。
  2. Cachegrind是一个缓存和分支预测分析器。它有助于使你的程序运行更快。
  3. Callgrind是一个调用图缓存生成分析器。它与Cachegrind的功能有重叠,但也收集Cachegrind不收集的一些信息。
  4. Helgrind是一个线程错误检测器。它有助于使你的多线程程序更加准确。
  5. DRD也是一个线程错误检测器。它和Helgrind相似,但使用不同的分析技术,所以可能找到不同的问题。
  6. Massif是一个堆分析器。它有助于使你的程序使用更少的内存。
  7. DHAT是另一种不同的堆分析器。它有助于理解块的生命期、块的使用和布局的低效等问题。
  8. SGcheck是一个实验工具,用来检测堆和全局数组的溢出。它的功能和Memcheck互补:SGcheck找到Memcheck无法找到的问题,反之亦然。
  9. BBV是个实验性质的SimPoint基本块矢量生成器。它对于进行计算机架构的研究和开发很有用处。

也有一些对大多数用户没有用的小工具:Lackey是演示仪器基础的示例工具;Nulgrind是一个最小化的Valgrind工具,不做分析或者操作,仅用于测试目的。

在这篇文章我们将关注“memcheck”工具。

在命令行下:

#valgrind --tool=memcheck --leak-check=full ./test

test 为可执行程序名称

编写程序:

int leak_test()
{
  char *p = (char *)malloc(10000);
  return 0;
}

内存泄漏输出:

==23079== HEAP SUMMARY:
==23079== in use at exit: 10,000 bytes in 1 blocks
==23079== total heap usage: 1 allocs, 0 frees, 10,000 bytes allocated
==23079==
==23079== 10,000 bytes in 1 blocks are definitely lost in loss record 1 of 1
==23079== at 0x4C2DBF6: malloc (vg_replace_malloc.c:299)
==23079== by 0x4005E7: leak_test (in /home/lin/test/memory/test)
==23079== by 0x40068C: main (in /home/lin/test/memory/test)
==23079==
==23079== LEAK SUMMARY:
==23079== definitely lost: 10,000 bytes in 1 blocks
==23079== indirectly lost: 0 bytes in 0 blocks
==23079== possibly lost: 0 bytes in 0 blocks
==23079== still reachable: 0 bytes in 0 blocks
==23079== suppressed: 0 bytes in 0 blocks
==23079==
==23079== For counts of detected and suppressed errors, rerun with: -v
==23079== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

使用非初始化变量:

int uninit_test()
{
int a[5];
int i = 0, s = 0;
//a[0] = a[1] = a[2] = a[3] = a[4] = 0;
a[0] = a[1] = a[2] = a[3] = 0;
for ( i = 0; i < 5; i++)
{
s += a[i];
}
printf("s = %d\r\n", s);
return 0;
}

检测程序输出:

==23175== Conditional jump or move depends on uninitialised value(s)
==23175== at 0x4E87CE2: vfprintf (vfprintf.c:1631)
==23175== by 0x4E8F898: printf (printf.c:33)
==23175== by 0x400663: uninit_test (in /home/lin/test/memory/test)
==23175== by 0x40068C: main (in /home/lin/test/memory/test)
==23175==
s = 4196000
==23175==
==23175== HEAP SUMMARY:
==23175== in use at exit: 0 bytes in 0 blocks
==23175== total heap usage: 1 allocs, 1 frees, 1,024 bytes allocated
==23175==
==23175== All heap blocks were freed -- no leaks are possible
==23175==
==23175== For counts of detected and suppressed errors, rerun with: -v
==23175== Use --track-origins=yes to see where uninitialised values come from
==23175== ERROR SUMMARY: 20 errors from 8 contexts (suppressed: 0 from 0)

[参考文档]

http://www.oschina.net/translate/valgrind-memcheck

http://blog.csdn.net/sduliulun/article/details/7732906

http://blog.csdn.net/destina/article/details/6198443

Valgrind 检测程序内存使用的更多相关文章

  1. 使用 Valgrind 检测 C++ 内存泄漏

    Valgrind 的介绍 Valgrind 可以用来检测程序是否有非法使用内存的问题,例如访问未初始化的内存.访问数组时越界.忘记释放动态内存等问题.在 Linux 可以使用下面的命令安装 Valgr ...

  2. Unix下C程序内存泄露检测工具:valgrind的安装使用

    Valgrind是一款用于内存调试.内存泄漏检测以及性能分析的软件开发工具. Valgrind的最初作者是Julian Seward,他于2006年由于在开发Valgrind上的工作获得了第二届Goo ...

  3. c程序内存检测工具 - Valgrind

    常用C程序内存泄露检测工具 https://blog.csdn.net/u012662731/article/details/78652651

  4. C++程序内存泄漏检测方法

    一.前言 在Linux平台上有valgrind可以非常方便的帮助我们定位内存泄漏,因为Linux在开发领域的使用场景大多是跑服务器,再加上它的开源属性,相对而言,处理问题容易形成“统一”的标准.而在W ...

  5. Qt creator 搭配 valgrind 检测内存泄漏

    继上次重载operator new检测内存泄漏失败之后,妥协了.决定不管是否是准确指明哪一行代码出现内存泄漏,只要告诉我是否有泄漏就行了,这样就没有new替换的问题.在开发中,总是一个个小功能的开发. ...

  6. Valgrind检测内存泄露简介

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

  7. Linux下利用Valgrind工具进行内存泄露检测和性能分析

    from http://www.linuxidc.com/Linux/2012-06/63754.htm Valgrind通常用来成分析程序性能及程序中的内存泄露错误 一 Valgrind工具集简绍 ...

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

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

  9. 应用 AddressSanitizer 发现程序内存错误

    作为 C/ C++ 工程师,在开发过程中会遇到各类问题,最常见便是内存使用问题,比如,越界,泄漏.过去常用的工具是 Valgrind,但使用 Valgrind 最大问题是它会极大地降低程序运行的速度, ...

随机推荐

  1. 12.Alias(别名)

    通过使用 SQL,可以为列名称和表名称指定别名(Alias). SQL Alias 表的 SQL Alias 语法 SELECT column_name(s) FROM table_name AS a ...

  2. osm2pgsql导入少字段

    Explanation: osm2pgsql imports normally the data in a static database schema. The tags without a cor ...

  3. .NET将服务器文件导出

    导出文件:                string filePath = Server.UrlDecode(filePath);                if (File.Exists(fi ...

  4. vmware10中arch使用遇到的一些问题

    xfce4中安装中文输入法fcitx step 1  #pacman -S fcitx-im setp 2 在~/.xinitrc中添加如下内容: export LC_ALL=zh_CN.UTF-8e ...

  5. 激光样式——第九届蓝桥杯C语言B组(国赛)第二题

    原创 标题:激光样式x星球的盛大节日为增加气氛,用30台机光器一字排开,向太空中打出光柱.安装调试的时候才发现,不知什么原因,相邻的两台激光器不能同时打开!国王很想知道,在目前这种bug存在的情况下, ...

  6. MongoDB整理笔记の安全访问

    MongoDB安全访问将从以下三个方面得到控制!   1.绑定IP内网地址访问MongoDB服务     2.设置监听端口     3.使用用户名和密码 绑定IP内网地址访问MongoDB服务 Mon ...

  7. U盘安装Ubuntu 12.04成功后系统无法启动的原因及解决办法

    想搭建一个Linux开发环境,选择了ubuntu12.04长期支持版,采用u盘安装(Universal-USB-Installer做的启动),发现安装完成之后,拔掉u盘无法启动,插上u盘之后,可以重启 ...

  8. xp 专业版组策略只有系统组件

    想要不显示任务栏的提示消息,需要在组策略里面设置,(在"开始→运行"中输入"GPEDIT.MSC"打开组策略,然后依次选择"用户配置→管理模板→任务栏 ...

  9. C#静态类 静态方法与非静态方法比较

    静态类 在类(class)上加入static修饰,表示该类无法被实例化,并将该类中,无法实例化变量或函数 静态类的主要特性 仅包含静态成员 无法实例化 静态类的本质,时一个抽象的密封类,所以不能被继承 ...

  10. Android系列一: 环境搭建

      相关软件 JAVA  JDKAndroid StudioHAXM JDK的安装和Java环境变量的设置 1.JDK下载地址: http://www.oracle.com/technetwork/j ...