valgrind

作者: c84f3109853b | 来源:发表于2020-07-21 14:14 被阅读0次

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

    相关文章

      网友评论

          本文标题:valgrind

          本文链接:https://www.haomeiwen.com/subject/luabkktx.html