valgrind通常用来分析程序性能和内存泄露问题
安装
1. https://www.valgrind.org/ 下载最新版本的valgrind
2. 解压缩后切换到valgrind源码目录,并执行./autogen.sh
3. ./configure && make -j 4 install
简介
valgrind包含如下工具
- memcheck 检查程序中的内存问题,如泄露、越界、非法指针等。
- callgrind 检测程序代码的运行时间和调用过程,以及分析程序性能。
- cachegrind 分析CPU的cache命中率,丢失率,用于进行代码优化。
- helgrind 用于检查多线程程序的竟态条件。
- massif 堆栈分析器,指示程序中使用了多少堆内存等信息。
- lackey
- nulgrind
// 这几个工具使用的是通用命令
valgrind --tool=name
详解
memcheck
最常用的工具,用来检测程序中出现的内存问题,所有对内存的读写都会被检测到,一切对malloc、free、new、delete的调用都会被捕获。所以它能检测以下问题:
- 对未初始化内存的使用。
- 读/写释放后的内存块。
- 读/写超出malloc分配的内存块。
- 读/写不适当的栈中内存块。
- 内存泄露,指向一块内存的指针永远丢失。
- 不正确的malloc/free或new/delete匹配。
- memcpy()相关函数中的dst和src指针重叠。
callgrind
和gprof类似的分析工具,但它对程序的运行观察更为入微,能给我们提供更多的信息。和gprof不同的是,它不需要在编译源代码时附加特殊选项,但推荐加上调试选项。callgrind收集程序运行时的一些数据,建立函数调用关系图,还可以有选择地进行cache模拟。在运行结束时,它会把分析数据写入一个文件。callgrind_annotate可以把这个文件的内容转化成可读的形式。
生成可视化的图形需要下载gprof2dot
https://github.com/jrfonseca/gprof2dot/blob/master/gprof2dot.py
callgrind可以生成程序性能分析的图形,首先来说说程序性能分析的工具。通常可以使用gnu自带的gprof,它的使用方法是在编译时添加-pg参数,例如:
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
void test()
{
sleep(1);
}
void f()
{
int i = 0;
for (i = 0; i < 5; i++) {
test();
}
}
int main(int argc, char *argv[])
{
f();
printf("process is over!\n");
return 0;
}
gprof使用步骤如下:
1. 执行gcc -pg -o tmp tmp.c
2. 运行./tmp,程序运行完成后会在当前目录下生成gmon.out文件
3. gprof ./tmp | gprof2dot.py | dot -Tpng -o report.png
4. 打开report.png查看结果
callgrind使用步骤如下:
1. valgrind --tool=callgrind ./tmp 生成callgrind.out.{pid}文件
2. callgrind_annotate callgrind.out.{pid} 打印结果
3. gprof2dot.py -f callgrind callgrind.out.{pid}|dot -Tpng -o report.png 生成图形化结果
cachegrind
cache分析器,它模拟CPU中的一级缓存I1,DI和二级缓存,能够精确地指出程序中cache的丢失和命中。还可以提供cache丢失次数,内存引用次数,以及每行代码,每个函数,每个模块,整个程序产生的指令数。
使用方法:
valgrind --tool=cachegrind 程序名