性能分析工具(三)——valgrind

@(性能分析)

1. Valgrind工具集介绍

Valgrind包含下列工具:

  1. memcheck:检查程序中的内存问题,如泄漏、越界、非法指针等。
  2. callgrind:检测程序代码的运行时间和调用过程,以及分析程序性能。
  3. cachegrind:分析CPU的cache命中率、丢失率,用于进行代码优化。
  4. helgrind:用于检查多线程程序的竞态条件
  5. massif:堆栈分析器,指示程序中使用了多少堆内存等信息。

这几个工具的使用是通过命令:valgrand –tool=name 程序名来分别调用的,当不指定tool参数时默认是 –tool=memcheck。
其中最常用的是memcheckcallgrind

2. memcheck

最常用的工具,用来检测程序中出现的内存问题,所有对内存的读写都会被检测到,一切对malloc、free、new、delete的调用都会被捕获。所以,它能检测以下问题:

  • 对未初始化内存的使用;
  • 读/写释放后的内存块;
  • 读/写超出malloc分配的内存块;
  • 读/写不适当的栈中内存块;
  • 内存泄漏,指向一块内存的指针永远丢失;
  • 不正确的malloc/free或new/delete匹配;
  • memcpy()相关函数中的dst和src指针重叠。

Memcheck能在这里帮上大忙。
下面的命令可以用来查找内存泄漏的问题

1
valgrind --leak-check=full ./程序名

3. callgrind

和gprof不同,它不需要在编译源代码时附加特殊选项,但加上调试选项是推荐的。Callgrind收集程序运行时的一些数据,建立函数调用关系图,还可以有选择地进行cache模拟。在运行结束时,它会把分析数据写入一个文件。callgrind_annotate可以把这个文件的内容转化成可读的形式。
生成可视化的图形需要下载gprof2dot:gprof2dot
这个软件可以用于gprof和callgrind两个软件的可视化图表生成。

1
valgrind --tool=callgrind [program name]

执行完成后在目录下生成”callgrind.out.XXX“的文件(XXX是进程的pid)
然后执行

1
2
gprof2dot.py -f callgrind callgrind.out.XXX |dot -Tsvg -o report.svg
#生成svg矢量图后可以通过Chrome浏览器打开,查找对应函数。

来生成图形化结果
Alt text
图中用颜色的色调来标记cpu时间占用率。暖色调代表cpu时间占用率偏高,箭头指向子函数。

4. 资料

linux下利用valgrind工具进行内存泄露检测和性能分析