gprof使用

gprof只能profile用户态的函数,对应系统调用的函数,gprof不能profile。
使用gprof 只需在编译的时候 加上-pg参数就行了。下面为main.c文件的内容。编译 gcc -pg main.c -o main 生成main执行文件

#include <stdlib.h>

static unsigned long sum(int num)
{
    int ret = 0;
    for(int i = 0; i < num; i++)
            ret += i;
    return ret;
}

static unsigned long fb(int num)
{
    if(num < 2)
        return 1;
    else
        return fb(num -1) + fb(num-2);
}

int main(int argc, char** argv)
{
    if(argc < 2)
    {
        printf("usage num\n");
        return 1;
    }
    int num = atoi(argv[1]);
    unsigned long r1 = sum(num);
    unsigned long r2 = fb(num);
    printf("r1=%ld, r2=%ld\n", r1, r2);
    return 0;
}

运行./main结束后 会在当前目录生成gmon.out的文件。
我们执行gprof ./main 就会输出main的profile,不过这样并不太直观。我们现在可以用工具把profile数据图形化出来。

  1. gprof ./main > profile.txt 把数据输出到profile.txt文件中
    2)gprof2dot.py profile.txt > profile.dot 生成dot文件
    3)dot -Tsvg -o gprof.svg 生成svg文件 我们就直接用浏览器就可以打开svg看那个函数是热点了。
    gprof2dot.py脚本可以用githun上fork下来,dot工具,linux可以直接安装。centos 命令 yum install graphviz。其他发行版本的,把安装命令换一下就行了。

当然也可以直接一步 gprof ./main| gprof2dot.py -n0 -e0 | dot -Tpng -o out.png生成png文件
更详细的profile图
gprof -p -q ./main| gprof2dot.py -n0 -e0 | dot -Tpng -o out.png

gprof的一下参数
-m num或--min-count=num:不显示被调用次数小于num的函数;
-p 只输出函数的调用图
-q 只输出函数的时间消耗列表

推荐阅读更多精彩内容