Valgrind是一个Linux程序的调试和性能剖析工具。利用Valgrind工具集能够很容易地自动检查到html
内存管理和线程的bugs。程序员
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是被积极维护的。
这取决于你确切的需求。下面是例子:
一、Memcheck
Memcheck检查内存管理问题,主要是针对C/C++程序。当程序运行在MeMcheck
的监视下时,全部的读取和写入内存都会被检查,调用malloc/new/free/delete都会被截
获。最后,Memcheck会检查到你的程序:
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是一个线程调试器,它发现多线程程序中的数据竞争。它寻找那些会被超过一个
(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; }
下面是这些信息的含义:
应该按照报道的顺序修改错误,由于后面的错误多是前一个致使的。不遵循这个规则是导
致Memcheck使用困难的一个一般缘由。
堆栈跟踪记录告诉咱们泄漏内存的分配位置。 不幸的是,Memcheck不能告诉你为何内存
泄漏了。
这里有几种类型的泄漏,下面是最重要的两种:
Memcheck也报道使用未初始化的值,一般的信息是“Conditional jump or move depends on
uninitialised value(s)”。这一般很难找到问题的根源,可使用--track-origins=yes得到更多信
息。
http://blog.csdn.net/sunmenggmail/article/details/10543483