gperftools之heap profile

  1. 对整个程序Profile
    1. 1 动态链接
    2. 2 运行时LD_PRELOAD加载
  • 对部分代码Profile
  • pprof查看profile结果
  • 源文件leak.cc:

    #include <stdlib.h>
    int main() {
        const int array_count = 99; 
        int* p = new int[array_count];
        return 0;
    }

    对整个程序Profile

    1 动态链接

    heap profiler需要-ltcmalloc:
    g++ -g leak.cc -o leak -L./gperftools/libs -ltcmalloc -Wl,-rpath=/root/gperftools/gperftools/libs
    加上-g参数可以打印出行号等更多的调试信息

    定义环境变量HEAPCHECK,执行:
    env HEAPCHECK=normal ./leak
    输出结果会显示内存泄露情况,同时提示pprof命令;

    定义环境变量HEAPPROFILE(heap profile导出文件名称),执行:
    env HEAPPROFILE=d.prof ./leak
    会将内存信息写入d.prof.0001.heap文件;

    env HEAPPROFILE=d.prof HEAPCHECK=normal ./leak
    输出结果会显示内存泄露情况,且将内存信息写入d.prof.0001.heap文件;

    2 运行时LD_PRELOAD加载

    编译:
    g++ -g leak.cc -o leak

    执行命令:
    env LD_PRELOAD="/root/gperftools/gperftools/libs/libtcmalloc.so" HEAPCHECK=normal HEAPPROFILE=n.prof ./leak

    对部分代码Profile

    源代码leak2.cc:

    #include <stdlib.h>
    #include "heap-profiler.h"
    
    void f() 
    {
        HeapProfilerStart("leak.prof");
        double* d = new double[1024 * 1028 * 19];
        HeapProfilerStop();
    }
    
    int main() {
        f();
        const int array_count = 1024 * 1024 * 5;
        int* p = new int[array_count];
        return 0;
    }

    静态链接-ltcmalloc:
    g++ -g leak2.cc -o leak -I./gperftools/src/gperftools -Wl,-Bstatic -ltcmalloc -Wl,-Bdynamic -lpthread

    heap profiler在满足以下任一条件时,将heap使用快照保存到磁盘文件:

    • 程序已分配了HEAP_PROFILE_ALLOCATION_INTERVAL字节内存,默认1GB;
    • 高水位内存使用标记增加了HEAP_PROFILE_INUSE_INTERVAL字节,默认100MB;
    • 时间已过HEAP_PROFILE_TIME_INTERVAL秒,默认值:inactive;
    • 显示调用HeapProfilerDump;

    考虑如下代码leak3.cc,编译后直接执行是不会生成快照文件的,因为以上条件均不满足,取消HeapProfilerDump的注释,再次执行就可以生成快照文件了。

    #include <stdlib.h>
    #include "heap-profiler.h"
    
    void f() 
    {
        double* d = new double[1024 * 1028 * 2];
        //HeapProfilerDump("reason1");
    }
    
    int main() {
        HeapProfilerStart("leak.prof");
        f();
        const int array_count = 1024 * 1024 * 5;
        int* p = new int[array_count];
        //HeapProfilerDump("reason2");
        HeapProfilerStop();
        return 0;
    }

    pprof查看profile结果

    根据提示执行命令:
    heap profiler:
    pprof ./leak "d.prof.0001.heap" --pdf > d.pdf
    pprof ./leak "d.prof.0001.heap" --text

    heap checker:
    pprof ./leak "/tmp/leak.15356.main-end.heap" --inuse_objects --lines --heapcheck --edgefraction=1e-10 --nodefraction=1e-10 --pdf > d.pdf
    pprof ./leak "d.prof.0001.heap" --inuse_objects --lines --heapcheck --edgefraction=1e-10 --nodefraction=1e-10 --pdf > d.pdf
    pprof ./leak "/tmp/leak.15700.main-end.heap" --inuse_objects --lines --heapcheck --edgefraction=1e-10 --nodefraction=1e-10 --pdf > n.pdf
    pprof ./leak "n.prof.0001.heap" --inuse_objects --lines --heapcheck --edgefraction=1e-10 --nodefraction=1e-10 --pdf > n.pdf

    结果如下:

    gperftools内存分析结果


    转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至yj.mapple@gmail.com

    文章标题:gperftools之heap profile

    文章字数:587

    本文作者:melonshell

    发布时间:2019-09-14, 23:36:27

    最后更新:2019-10-30, 08:05:53

    原始链接:http://melonshell.github.io/2019/09/14/tool3_gperftools2/

    版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

    目录
    ×

    喜欢就点赞,疼爱就打赏

    相册