Valgrind学习

1、Valgrind简介

一、关于Valgrind

     Valgrind是一个Linux程序的调试和性能剖析工具。利用Valgrind工具集能够很容易地自动检查到html

内存管理和线程的bugs。程序员

二、为何使用Valgrind

     1)、Valgrind能够自动检查到内存管理和线程的bugs,节约程序员的调试时间。数据库

     2)、Valgrind能够从底层分析到程序的瓶颈,以帮助程序员提升程序的运行速度。编程

     3)、Valgrind遵循GNU GPL(通用公共许可证),是免费开源的软件。缓存

     4)、Valgrind能够运行在大多数流行的平台上,如x86/Linux, AMD64/Linux和PPC32/Linux.包括服务器

全部的Linux发行版,如:Red Hat, SuSE, Debian, Gentoo, Slackware, Mandrake等。  网络

     5)、Valgrind使用很简单。它利用动态二进制手段,因此咱们不用改变、编译和从新连接程多线程

序。只须要在命令行上把工具名放在程序前面。框架

     6)、Valgrind不是个玩具。能够被应用于各类规模的项目,能够分析超过2500万行代码的程编程语言

序。

      7)、Valgrind使用于各类类型的软件。如:桌面应用程序,库,数据库,游戏,网页浏览

器,网络服务器,分布式控制系统,虚拟现实的框架,交易服务器,编译器,解释器,虚拟机,

电信应用,嵌入式软件,医疗成像,科学方案,信号处理程序,视频/音频节目,商业智能软件,

金融/银行软件,操做系统守护进程等等。具体参考:http://valgrind.org/gallery/users.html

       8)、Valgrind被应用地很普遍。

       9)、Valgrind适用于任何语言。由于它直接应用于程序的二进制程序。但主要用于C/C++程

序,由于用这两种语言写的程序会产生最多的bugs!它也能够分析混合语言写的程序,包括C,

C++, Java, Perl, Python, assembly code, Fortran, Ada等等。

       10)、Valgrind会覆盖咱们100%的用户程序,甚至包括系统库。你甚至可使用Valgrind分

析那些没有源代码的程序。

        11)、Valgrind是可扩展的。任何人写的有用工具均可以加入其中。

        12)、Valgrind是被积极维护的。

三、何时使用Valgrind

        这取决于你确切的需求。下面是例子:

  • 对于小型程序应该任什么时候候都使用(大多数是Memcheck),这能够帮助你快速地找到内存bugs。
  • 在自动单元,集成,系统,或回归测试等应用中自动使用Valgrind工具,没有代码不会被测试到。
  • 在大型修改以后,应该使用Valgrind来检查是否有新的bug被引入。
  • 在bug出现时,使用Valgrind寻找缘由。
  • 当程序运行得很奇怪,有bug的嫌疑时,用Valgrind寻找问题所在。
  • 在发行应用之前,使用Valgrind检查程序以使程序更稳定。
  • 利用Valgrind的性能剖析工具,分析程序运行所花大量时间的地方,来提升速度。

2、Valgrind工具集

   

     一、Memcheck

       Memcheck检查内存管理问题,主要是针对C/C++程序。当程序运行在MeMcheck

的监视下时,全部的读取和写入内存都会被检查,调用malloc/new/free/delete都会被截

获。最后,Memcheck会检查到你的程序:

  •   访问没有它权限的内存位置(没有分配的区域,被释放的区域,超过堆尾部的区域,堆栈中不能访问的区域)。
  •   用危险的方式使用没有初始化的值。
  •   内存泄漏。
  •   作糟糕的内存释放(两次释放,不匹配释放)。
  •   把重复的地址和源内存块送给memcpy()和相关函数。

       Memcheck会把在这些错误出现时尽快报道这些错误,给出这些错误出现的源代

码行号,以及一个跟错误行相邻的函数的堆栈跟踪。Memcheck在字节级别跟踪

址,在位级别跟踪变量的初始化。最终,它能够检测到单个未初始化的位,而且不会报道位域虚

假的操做。Memcheck会使程序运行变慢10--30x倍。

     二、Cachegrind

      Cachegrind是一个缓存分析器。它详细地演示模拟L一、D1和D2在CPU中的运行状况,所以

能够准确地定位高速缓存未命中的源代码。它指出每一个函数、每一个模块高速缓存未命中的次数,

内存引用和每行源程序所执行的指令,以及整个程序的总结。Cachegrind对任何编程语言都很是

有用。它会使程序运行慢20--100x倍。

     三、Callgrind

       做者是Josef Weidendorfer,是Cachegrind的延伸扩展。提供Cachegrind所能提供的全部信

息,额外加上了调用关系图。它被整合到Valgrind3.2.0主要版本里。它有一个单独的了不得的可

视化工具,KCachegrind,这个可视化工具提供Callgrind收集的数据的更改概述;一样能够应用于

Cachegrind的输出可视化。

     四、Massif

       Massif是一个堆栈分析器。它经过对程序的堆栈进行按期循环的快照来进行详细的堆栈分

析。它产生出程序堆栈一段时间内的使用状况图,包括程序中那些对大部份内存分配负责的部分

的信息。这个图表被包含分配最多内存的地方的信息的文本文件或者HTML文件补充。Massif会

使程序运行慢20x倍。

     五、Helgrind

       Helgrind是一个线程调试器,它发现多线程程序中的数据竞争。它寻找那些会被超过一个

(POSIX p-)线程的内存位置,但对于那些没有一直使用的(pthread_mutex_)锁会被找到。

这些地方被指示为会在线程间丢失同步,并会产生难以找到的依赖于时间的错误。Helgrind适用

于任何使用多线程的程序。它如今仍是个实现性工具,欢迎用户反馈。

     六、DRD

       DRD适用于检测多线程在C/C++程序中错误的工具。这个工具适用于任何使用POSIX线程原

语的程序或者创建在POSIX线程原语上的各类概念。DRD能够检测并锁定违反秩序的行为,并且

多于大多数程序,DRD只须要少许的内存来进行分析。

     七、Lackey, Nulgrind

      用于测试和演示目的的工具。   

3、Valgrind工具应用简介

#include <stdlib.h>

void f( void )
{
  int *x = malloc( 10 * sizeof( int ) );
  x[ 10 ] = 0;       // problem 1: heap block overrun
                     // problem 2: memory leak -- x not freed                    
}

int main()
{
  f();
  
  return 0;
}

        下面是这些信息的含义:

  •  3865是进程的ID,一般不重要。
  •  第一行(“Invalid write...”)告诉咱们错误的类型。这里的问题是程序写一个它没拥有的内存,致使堆块溢出。
  •  在第一行下面是一个堆栈跟踪记录,告诉咱们问题出在哪。堆栈跟踪记录能够变得很是大,很是容易困惑,特别是使用C++ STL时。自下而上的查看会有帮助。若是堆栈跟踪记录不够大,可使用--num-callers选项让它变得更大。
  • 代码地址(eg.0x8048438)一般不重要,但偶尔用来跟踪重要的怪异bugs。
  • 有些信息有第二成分用来描述有关的内存地址。这里显示的程序写入的内存位置超过了在example.c第5行调用malloc分配的内存的末尾。

       应该按照报道的顺序修改错误,由于后面的错误多是前一个致使的。不遵循这个规则是导

致Memcheck使用困难的一个一般缘由。 

   

     堆栈跟踪记录告诉咱们泄漏内存的分配位置。 不幸的是,Memcheck不能告诉你为何内存

泄漏了。

     这里有几种类型的泄漏,下面是最重要的两种:

  • “definitebly lost”:肯定的内存泄漏。
  • “probably lost”:发现了一个指向某块内存中部的指针,而不是指向内存块头部。这种指针通常是原先指向内存块头部,后来移动到了内存块的中部,还有可能该指针和该内存根本就没有关系,检测工具只是怀疑有内存泄漏。

     Memcheck也报道使用未初始化的值,一般的信息是“Conditional jump or move depends on

uninitialised value(s)”。这一般很难找到问题的根源,可使用--track-origins=yes得到更多信

息。

 

具体使用能够参考:

http://blog.csdn.net/sunmenggmail/article/details/10543483

相关文章
相关标签/搜索