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数据图形化出来。
- 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 只输出函数的时间消耗列表