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. 专题1-MMU-lesson3-MMU配置与使用

    1.段方式MMU 利用虚拟地址然后找到物理地址,通过物理地址访问到led,其过程如下: 一个段的大小是[19:0]总共有1M的地址空间. 从上面可知对应GPIO的段物理基地址是0x7f000000.那 ...

  2. Ajax步骤

    var request = new XMLHttpRequest(); request.open("GET","get.php",ture); request. ...

  3. 《the art of software testing》 第三章 人工测试

    在深入研究较为传统的计算机测试技术之前,要先进行"人工测试". 代码检查与走查是两种主要的人工测试方法. 代码检查与走查是对过去桌面检查过程(在提交测试前由程序员阅读自己程序的过程 ...

  4. 简单好用的表单校验插件——jQuery Validate基本使用方法总结

    jquery validate当前最新版本是1.17.0,下载链接是:https://github.com/jquery-validation/jquery-validation/releases/t ...

  5. wp8扩展器大全

    <Extensions> <!--扩展照片中心--> <Extension ExtensionName="Photos_Extra_Hub" Cons ...

  6. 微软日志工厂 Microsoft.Extensions.Logging 中增加 log4net 的日志输出

    前提: 需要nuget   Microsoft.Extensions.Logging.Log4Net.AspNetCore   2.2.6: 描述:解决 .net core 微软日志工厂 Micros ...

  7. django 实现电子支付功能

    思路:调用第三方支付 API 接口实现支付功能.本来想用支付宝来实现第三方网站的支付功能的,但是在实际操作中发现支付宝没有 Python 接口,网上虽然有他人二次封装的的 Python 接口,但是对我 ...

  8. luoguP2664 树上游戏

    https://www.luogu.org/problemnew/show/P2664 考虑对于每种颜色包含的点和这些点的子节点建出虚树,发现只要将一个联通块中的东西 Dp + 差分一下就行了 当然要 ...

  9. 使用C语言封装数组,动态实现增删改查

    myArray.h : #pragma once //包含的时候只包含一次 #include <stdio.h> #include <stdlib.h> #include &l ...

  10. 安装GCC-8.3.0及其依赖

    目录 目录 1 1. 前言 1 2. 安装日期 1 3. GCC国内镜像下载地址 2 4. GCC的依赖库 2 4.1. gmp库 2 4.2. mpfr库 2 4.3. mpc库 2 4.4. m4 ...