valgrind

valgrind通常用来分析程序性能和内存泄露问题

安装

1. https://www.valgrind.org/ 下载最新版本的valgrind
2. 解压缩后切换到valgrind源码目录,并执行./autogen.sh
3. ./configure && make -j 4 install

简介

valgrind包含如下工具

  1. memcheck 检查程序中的内存问题,如泄露、越界、非法指针等。
  2. callgrind 检测程序代码的运行时间和调用过程,以及分析程序性能。
  3. cachegrind 分析CPU的cache命中率,丢失率,用于进行代码优化。
  4. helgrind 用于检查多线程程序的竟态条件。
  5. massif 堆栈分析器,指示程序中使用了多少堆内存等信息。
  6. lackey
  7. nulgrind
// 这几个工具使用的是通用命令
valgrind --tool=name

详解

memcheck

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

  1. 对未初始化内存的使用。
  2. 读/写释放后的内存块。
  3. 读/写超出malloc分配的内存块。
  4. 读/写不适当的栈中内存块。
  5. 内存泄露,指向一块内存的指针永远丢失。
  6. 不正确的malloc/free或new/delete匹配。
  7. 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 
#include 
#include 
#include 

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 程序名

你可能感兴趣的:(valgrind)