gprof只能profile用戶態(tài)的函數(shù),對(duì)應(yīng)系統(tǒng)調(diào)用的函數(shù),gprof不能profile。
使用gprof 只需在編譯的時(shí)候 加上-pg參數(shù)就行了。下面為main.c文件的內(nèi)容。編譯 gcc -pg main.c -o main 生成main執(zhí)行文件
#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;
}
運(yùn)行./main結(jié)束后 會(huì)在當(dāng)前目錄生成gmon.out的文件。
我們執(zhí)行g(shù)prof ./main 就會(huì)輸出main的profile,不過這樣并不太直觀。我們現(xiàn)在可以用工具把profile數(shù)據(jù)圖形化出來。
- gprof ./main > profile.txt 把數(shù)據(jù)輸出到profile.txt文件中
2)gprof2dot.py profile.txt > profile.dot 生成dot文件
3)dot -Tsvg -o gprof.svg 生成svg文件 我們就直接用瀏覽器就可以打開svg看那個(gè)函數(shù)是熱點(diǎn)了。
gprof2dot.py腳本可以用githun上fork下來,dot工具,linux可以直接安裝。centos 命令 yum install graphviz。其他發(fā)行版本的,把安裝命令換一下就行了。
當(dāng)然也可以直接一步 gprof ./main| gprof2dot.py -n0 -e0 | dot -Tpng -o out.png生成png文件
更詳細(xì)的profile圖
gprof -p -q ./main| gprof2dot.py -n0 -e0 | dot -Tpng -o out.png
gprof的一下參數(shù)
-m num或--min-count=num:不顯示被調(diào)用次數(shù)小于num的函數(shù);
-p 只輸出函數(shù)的調(diào)用圖
-q 只輸出函數(shù)的時(shí)間消耗列表