valgrind使用

在VS中可以用VLD检测是否有内存泄露,可以参考http://blog.csdn.net/fengbingchun/article/details/44195959,下面介绍下Ubuntu中内存泄露检测工具Valgrind的使用。

 Valgrind目前最新版本是3.11.0, 可以从http://www.valgrind.org/ 通过下载源码进行编译,也可以通过命令直接安装。

 Valgrind是一个开源软件,它的Lisence是GPLv2。它用于Linux(支持 x86, amd64,arm, ppc, mip, etc. 架构)平台,对C/C++程序进行内存调试和代码剖析,它是帮助程序员寻找程序里的bug和改进程序性能的工具。

 Valgrind有多个工具,包括Memcheck、Cachegrind、Callgrind、Helgrind、DRD、Massif、DHAT、SGCheck、BBV:

 1.        Memcheck:主要检查的程序错误包括,(1)、使用未初始化的内存;(2)、读写已经释放了的内存;(3)、使用超过malloc分配的内存空间;(4)、对堆栈的非法访问;(5)、申请的空间是否有释放;(6)、malloc/free/new/delete申请和释放内存的匹配;(7)、src和dst指针的重叠;(8)、将无意义的参数传递给系统调用。

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

 3.        Callgrind:检测程序代码的运行时间和调用过程,以及分析程序性能。

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

 5.        DRD:用于分析多线程,与Helgrind类似,但是用不同的分析技术,可用检测不同的问题。

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

 7.        DHAT:另一个堆检测工具,帮助了解代码段的生命周期、利用率、效率规划。

 8.        SGCheck:检测栈和全局数组溢出的实验性工具,与Memcheck互补使用。

 9.        BBV:通过SimPoint分析工具产生基本块向量。

 Valgrind工具的更详细用法可以参见源码中的docs/index.pdf用户手册。

 用法:$ valgrind [options] prog-and-args

         常用选项说明:

 (1)、--help:显示帮助信息;

 (2)、--version:显示valgrind版本;

 (3)、--tool=<name>:运行valgrind中名为toolname的工具,默认memcheck,还可以为cachegrid、drd、lackey、callgrind、helgrind、massif等;

 (4)、--quiet:安静地运行,只打印错误信息;

 (5)、--verbose:更详细的信息,增加错误数统计;

 (6)、--trace-childer=no|yes:跟踪子线程;

 (7)、--track-fds=no|yes:跟踪打开的文件描述;

 (8)、--time-stamp=no|yes:增加时间戳到Log信息;

 (9)、--log-fd=<number>:输出Log信息到文件描述符;

 (10)、--log-file=<file>:输出Log信息到指定的文件;

 (11)、--xml=yes:将错误信息以xml格式输出,只有memcheck可用;

 (12)、--xml-file=<file>:XML输出到指定文件;

 (13)、--error-limit=no|yes:如果错误太多,则停止显示新错误;

 (14)、--error-exitcode=<number>:如果发现错误,则返回错误代码;

 (15)、--leak-check=no|summary|full:对发现的内存泄露给出的信息级别,只有memcheck可用。

         安装Valgrind:

 1.        通过命令直接安装:

sudo apt-get install valgrind
 2.        通过源码安装:
 (1)、从http://www.valgrind.org/downloads/current.html下载最新源码valgrind-3.11.0.tar.bz2 ;

 (2)、解压缩valgrind-3.11.0.tar.bz2;

 (3)、进入到valgrind-3.11.0目录;

 (4)、依次执行:

./configure
make
sudo make install

         使用举例:

         测试代码test1.c如下,来自valgrid使用手册:

#include <stdlib.h>
 
void f(voidd)
{
    int* x = malloc(10 * sizeof(int));
    x[10] = 0; // problem 1: heap block overrun
               // problem 2: memory leak -- x not freed
}
 
int main(void)
{
    f();
    return 0;
}
         生成test1执行文件,执行:

gcc -g -o test1 test1.c
 使用valgrind,执行:
valgrind --tool=memcheck --leak-check=yes ./test1
         运行结果如图:

        

 参考文献:

 1.      http://www.cnblogs.com/zhuyp1015/p/3901191.html

 2.      http://blog.csdn.net/iccome/article/details/1270856

massif 使用

Valgrind在Ubuntu上的安装可以参考:https://blog.csdn.net/fengbingchun/article/details/78164837

可以使用Valgrind的memcheck工具来检查是否有内存泄漏,可以使用massif工具来对内存使用情况进行分析。这里简单介绍下massif工具的使用。

Massif工具的官网介绍可以参考:http://valgrind.org/docs/manual/ms-manual.html

Massif是一个堆分析器,它能够测量程序使用了多少堆内存,是一个内存剖析工具,通过不断的取程序堆的快照来达到监视程序内存分配的目的。可以非常容易的获取到内存使用峰值。它也可以测量程序使用栈的大小,默认情况下此选项是关闭的。通过对结果的分析,Massif工具可以帮助减少程序的内存使用量,它会提供非常详细的信息,指出程序中的哪一部分负责分配堆内存。

这里通过GitHub中的Messy_Test(https://github.com/fengbingchun/Messy_Test )项目对Massif工具的使用过程进行说明,以调用二叉树接口为例:binary_search_tree_::test_binary_search_tree(),将终端定位到prj/linux_cmake_CppBaseTest目录下,依次执行以下命令:

./build.sh
valgrind --tool=massif ./build/CppBaseTest
执行结果如下:

并会在当前目录下生成massif.out.24949文本文件,其中24949为进程号,此文件中详细记录了执行此测试程序时内存的使用情况,执行以下命令:

ms_print massif.out.24949
结果如下:显示内存使用峰值为87.35KB以及程序中的哪一行有内存分配等详细信息。

使用ms_print显示可视化效果不好,可以通过massif-visualizer对结果进行可视化显示。

massif-visualizer在Ubuntu 14.04上安装过程如下:

1. 从 https://launchpad.net/ubuntu/trusty/amd64/massif-visualizer/0.3-0ubuntu3 下载 massif-visualizer_0.3-0ubuntu3_amd64.deb;

2. 双击massif-visualizer_0.3-0ubuntu3_amd64.deb进行安装(通过Ubuntu Software Center)。

执行命令:

massif-visualizer massif.out.24949
结果如下:

如果程序执行时间较短,可以增加--time-unit=B选项,即:

valgrind --tool=massif --time-unit=B ./build/CppBaseTest
为了获得每个快照详尽的信息,可以增加--detailed-freq=1选项,详细的快照信息在图表中由”@”字符组成的条形图表示。默认情况下,10个快照中只有第10个快照是详细的。即:

valgrind --tool=massif --detailed-freq=1 ./build/CppBaseTest

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值