Linux下内存检测、多线程并发及性能分析工具Valgrind简介
你是否曾为定位一个内存泄露的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 | $ tar -jxvf valgrind-3.10.1.tar.bz2 |
使用
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 | $ gcc -g -o test test.c |
注意:
- 在编译程序的时候加上-g选项,Valgrind在输出信息时会给出详细信息,有助于调试;
- 使用Valgrind运行进程时,进程会比正常运行慢很多,原因是Valgrind采用模拟器模拟程序的运行环境,同时还要检测、分析BUG,因此会较慢,这属于正常现象。