一、GProfile簡介
GProfile是gcc的一個工具,用于對應用程序的測試。
GProfile可以分析出函數(shù)的調(diào)用次數(shù)、函數(shù)的調(diào)用關(guān)系以及函數(shù)消耗的時間。
二、GProfile原理
在編譯和鏈接你的程序的時候,gcc 在你應用程序的每個函數(shù)中都加入了一個名為mcount ( or "_mcount" , or "__mcount" , 依賴于編譯器或操作系統(tǒng))的函數(shù),也就是說你的應用程序里的每一個函數(shù)都會調(diào)用mcount, 而mcount 會在內(nèi)存中保存一張函數(shù)調(diào)用圖,并通過函數(shù)調(diào)用堆棧的形式查找子函數(shù)和父函數(shù)的地址。這張調(diào)用圖也保存了所有與函數(shù)相關(guān)的調(diào)用時間,調(diào)用次數(shù)等等的所有信息。
程序運行結(jié)束后,會在程序退出的路徑下生成一個gmon.out文件,用來保存監(jiān)控數(shù)據(jù)。從而通過gprof來解讀數(shù)據(jù)對程序進行分析。
三、GProfile用法
1、在編譯時加入?yún)?shù) -pg就可以打開GProfile的開關(guān)。
2、gprof只查看用戶函數(shù)信息,不能對庫函數(shù)進行查看。 如果想查看庫函數(shù)的信息,在編譯時加入"-lc_p"編譯參數(shù)代替"-lc"編譯參數(shù),這樣程序會鏈接libc_p.a庫,就可以查看庫函數(shù)的信息了。
3、 gprof只能在程序正常結(jié)束退出之后才能生成程序測評報告,原因是gprof通過在atexit()里注冊了一個函數(shù)來產(chǎn)生結(jié)果信息,任何非正常退出都不會執(zhí)行atexit()的動作,所以不會產(chǎn)生gmon.out文件。如果你的程序是一個不會退出的服務程序,那就只有修改代碼來達到目的。如果不想改變程序的運行方式,可以添加一個信號處理函數(shù)解決問題(這樣對代碼修改最少),例如:
static void sighandler( int sig_no )
{
exit(0);
}
signal( SIGUSR1, sighandler );
當使用kill -USR1 pid 后,程序退出,生成gmon.out文件。
四、GProfile舉例

#include <stdio.h> 
int ppp(int a) 
{ 
int i, b; 
b = 0; 
for(i = 0; i<1000000; i++) { 
b++; 
} 
return 0; 
} 


int prime(int n) 
{ 
int i, j, b; 
b = 0; 
for(i=2; i<n; i++) { 
for(j = 0; j<1000000; j++) { 
b++; 
} 
if(n%i == 0) 
return 0; 
return 1; 
} 
} 


int main(void) 
{ 
int i, n; 
n = 1000; 
for(i=2; i<=n; i++) { 
if(prime(i)) { 
ppp(i); 
} 
} 
return 0; 
} 
五、GProfile對于結(jié)果的分析
-b 不再輸出統(tǒng)計圖表中每個字段的詳細描述。
-p 只輸出函數(shù)的調(diào)用圖(Call graph的那部分信息)。
-q 只輸出函數(shù)的時間消耗列表。
-e Name 不再輸出函數(shù)Name 及其子函數(shù)的調(diào)用圖(除非它們有未被限制的其它父函數(shù))。可以給定多個 -e 標志。一個 -e 標志只能指定一個函數(shù)。
-E Name 不再輸出函數(shù)Name 及其子函數(shù)的調(diào)用圖,此標志類似于 -e 標志,但它在總時間和百分比時間的計算中排除了由函數(shù)Name 及其子函數(shù)所用的時間。
-f Name 輸出函數(shù)Name 及其子函數(shù)的調(diào)用圖。可以指定多個 -f 標志。一個 -f 標志只能指定一個函數(shù)。
-F Name 輸出函數(shù)Name 及其子函數(shù)的調(diào)用圖,它類似于 -f 標志,但它在總時間和百分比時間計算中僅使用所打印的例程的時間。可以指定多個 -F 標志。一個 -F 標志只能指定一個函數(shù)。-F 標志覆蓋 -E 標志。
-z 顯示使用次數(shù)為零的例程(按照調(diào)用計數(shù)和累積時間計算)。
GProfile的詳細請參考:http://www.cs.utah.edu/dept/old/texinfo/as/gprof.html
這個文檔對GProfile說的很詳細,很好。


