一、GProfile簡介
GProfile是gcc的一個工具,用於對應用程序的測試。
GProfile可以分析出函數的調用次數、函數的調用關係以及函數消耗的時間。
二、GProfile原理
在編譯和鏈接你的程序的時候,gcc 在你應用程序的每個函數中都加入了一個名爲mcount ( or "_mcount" , or "__mcount" , 依賴於編譯器或操作系統)的函數,也就是說你的應用程序裏的每一個函數都會調用mcount, 而mcount 會在內存中保存一張函數調用圖,並通過函數調用堆棧的形式查找子函數和父函數的地址。這張調用圖也保存了所有與函數相關的調用時間,調用次數等等的所有信息。
程序運行結束後,會在程序退出的路徑下生成一個gmon.out文件,用來保存監控數據。從而通過gprof來解讀數據對程序進行分析。
三、GProfile用法
1、在編譯時加入參數 -pg就可以打開GProfile的開關。
2、gprof只查看用戶函數信息,不能對庫函數進行查看。 如果想查看庫函數的信息,在編譯時加入"-lc_p"編譯參數代替"-lc"編譯參數,這樣程序會鏈接libc_p.a庫,就可以查看庫函數的信息了。
3、 gprof只能在程序正常結束退出之後才能生成程序測評報告,原因是gprof通過在atexit()裏註冊了一個函數來產生結果信息,任何非正常退出都不會執行atexit()的動作,所以不會產生gmon.out文件。如果你的程序是一個不會退出的服務程序,那就只有修改代碼來達到目的。如果不想改變程序的運行方式,可以添加一個信號處理函數解決問題(這樣對代碼修改最少),例如:
static void sighandler( int sig_no )
{
exit(0);
}
signal( SIGUSR1, sighandler );
當使用kill -USR1 pid 後,程序退出,生成gmon.out文件。
四、GProfile舉例
五、GProfile對於結果的分析
-b 不再輸出統計圖表中每個字段的詳細描述。
-p 只輸出函數的調用圖(Call graph的那部分信息)。
-q 只輸出函數的時間消耗列表。
-e Name 不再輸出函數Name 及其子函數的調用圖(除非它們有未被限制的其它父函數)。可以給定多個 -e 標誌。一個 -e 標誌只能指定一個函數。
-E Name 不再輸出函數Name 及其子函數的調用圖,此標誌類似於 -e 標誌,但它在總時間和百分比時間的計算中排除了由函數Name 及其子函數所用的時間。
-f Name 輸出函數Name 及其子函數的調用圖。可以指定多個 -f 標誌。一個 -f 標誌只能指定一個函數。
-F Name 輸出函數Name 及其子函數的調用圖,它類似於 -f 標誌,但它在總時間和百分比時間計算中僅使用所打印的例程的時間。可以指定多個 -F 標誌。一個 -F 標誌只能指定一個函數。-F 標誌覆蓋 -E 標誌。
-z 顯示使用次數爲零的例程(按照調用計數和累積時間計算)。
GProfile的詳細請參考:http://www.cs.utah.edu/dept/old/texinfo/as/gprof.html
這個文檔對GProfile說的很詳細,很好。