文章目录
  1. 1. 简介
    1. 1.1. Memcheck
    2. 1.2. Cachegrind
    3. 1.3. Callgrind
    4. 1.4. Massif
    5. 1.5. Helgrind
    6. 1.6. DRD
  2. 2. 安装
  3. 3. 使用
  4. 4. 参考

你是否曾为定位一个内存泄露的BUG而通宵达旦?你是否曾在优化性能时由于无从下手而抓狂?如果你正在为这些问题烦恼,那么请试试Valgrind,它会让你爱不释手!Valgrind是一款开源的,用于调试、分析、优化Linux下程序的利器,可以用来解决内存泄露、踩内存,多线程并发以及性能优化等问题。本文主要介绍Valgrind的功能、安装及使用。

简介

Valgrind主要包含6个有用的子工具,包括Memcheck、Cachegrind、Callgrind、Massif、Helgrind和DRD。下面分别介绍各工具的作用。

Memcheck

Memcheck是最常用的,也是Valgrind默认启动的工具,可以检测内存管理方面的问题,包括:

  • 使用未初始化的内存
  • 内存访问越界
  • 内存泄露
  • 内存重复释放
  • 使用已经释放了的内存
  • 申请和释放内存函数未配对使用,即malloc/free配对使用,new/delete配对使用
  • memcpy等函数的src和dst存在重叠问题
    这些问题往往是C/C++程序员最头疼的问题,善用Memcheck可以解决大部分问题。

Cachegrind

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

Callgrind

Callgrind对Cachegrind进行了扩展,不仅可以用于分析Cache的命中率,还能给出每个函数的调用关系,包括执行时间,以及调用次数。在运行结束时,它会把这些分析数据写入一个文件,使用callgrind_annotate命令可以把文件的内容转化成可读的形式,对于分析性能瓶颈非常有帮助。

Massif

堆分析器,它能测量程序在堆中分配了多少内存。Massif能帮助我们减少内存的使用。

Helgrind

Helgrind主要用于检查多线程中出现的竞争问题。它会寻找被多个线程访问,而又没有加锁的内存区域(临界区),这些区域往往是线程之间失去同步的地方,而且会导致难以发掘的错误。注意,该工具只能检测使用pthread实现的线程。

DRD

与Helgrind类似,也用于检查多线程中出现的竞争问题,但相较于Helgrind使用更少的内存。注意,该工具只能检测使用pthread实现的线程。

安装

访问Valgrind官网下载最新的源码包,目前版本为3.10.1,然后使用“三板斧”进行安装。

1
2
3
4
5
$ tar -jxvf valgrind-3.10.1.tar.bz2
$ cd valgrind-3.10.1/
$ ./configure
$ make
$ make install

使用

valgrind命令的格式如下:

1
$ valgrind [--tool=tool_name] [valgrind-options] your-program [your-program-options]

其中,
tool_name指的是子工具的名称,如分析性能,则--tool=callgrind。如果不指定该项,则默认启动Memcheck工具
valgrind-options取值非常广泛,可以参考man手册
your-program指的是被测程序
your-program-options指的是被测程序的参数

以分析性能为例,常见的命令如下:

1
2
$ gcc -g -o test test.c 
$ valgrind --tool=callgrind ./test ./test.conf

注意:

  • 在编译程序的时候加上-g选项,Valgrind在输出信息时会给出详细信息,有助于调试;
  • 使用Valgrind运行进程时,进程会比正常运行慢很多,原因是Valgrind采用模拟器模拟程序的运行环境,同时还要检测、分析BUG,因此会较慢,这属于正常现象。

参考

文章目录
  1. 1. 简介
    1. 1.1. Memcheck
    2. 1.2. Cachegrind
    3. 1.3. Callgrind
    4. 1.4. Massif
    5. 1.5. Helgrind
    6. 1.6. DRD
  2. 2. 安装
  3. 3. 使用
  4. 4. 参考