GPROF 統計函式執行時間

2021-07-23 12:00:11 字數 1555 閱讀 4498

gprof的基本用法:

1. 使用 -pg 選項編譯和鏈結你的應用程式 ,在gcc編譯程式的時候,加上-pg選項,如果是大專案,就在makefile裡面修改編譯選項,-pg放在那裡都行。例如:

gcc -pg -o test test.c

2. 執行你的應用程式使之生成供gprof 分析的資料,

執行剛才的程式:

./test,

這樣就生成了乙個gmon.out檔案,該檔案就包含了profiling的資料。

3. gprof ./test gmon.out

通過在編譯和鏈結你的程式的時候(使用 -pg 編譯和鏈結選項),gcc 在你應用程式的每個函式中都加入了乙個名為mcount ( or "_mcount" , or "__mcount" , 依賴於

編譯器或作業系統)的函式,也就是說你的應用程式裡的每乙個函式都會呼叫mcount, 而mcount 會在記憶體中儲存一張

函式呼叫圖,並通過函式呼叫

堆疊的形式查詢子函式和父函式的位址。這張呼叫圖也儲存了所有與函式相關的呼叫時間,呼叫次數等等的所有資訊。

一,gprof只能檢視使用者函式資訊。如果想檢視庫函式的資訊,需要在編譯是再加入"-lc_p"編譯引數代替"-lc"編譯引數,這樣程式會鏈結libc_p.a庫,如果系統沒有libc_p.a庫,需要自己編譯這個庫。

二,gprof不能產生gmom.out檔案的原因:gprof只能在程式正常結束退出之後才能生成程式測評報告,原因是gprof通過在atexit()裡註冊了乙個函式來產生結果資訊,任何非正常退出都不會執行atexit()的動作,所以不會產生gmon.out檔案。所以,以下情況可能不會有gmon.out檔案產生:

1,程式不是從main return或exit()退出,則可能不生成gmon.out。

2,程式如果崩潰,可能不生成gmon.out。

3,測試發現在虛擬機器上執行,可能不生成gmon.out。

4,程式忽略sigprof訊號!一定不能捕獲、忽略sigprof訊號。man手冊對sigprof的解釋是:profiling timer expired. 如果忽略這個訊號,gprof的輸出則是:each sample counts as 0.01 seconds. no time accumulated.

5,如果程式執行時間非常短,則gprof可能無效。因為受到啟動、初始化、退出等函式執行時間的影響。如果你的程式是乙個不會退出的服務程式,那就只有修改**來達到目的。如果不想改變程式的執行方式,可以新增乙個訊號處理函式解決問題(這樣對**修改最少),例如: 

static void sighandler( int sig_no ) 

signal( sigusr1, sighandler ); 

這樣當使用kill -usr1 pid 後,程式退出,生成gmon.out檔案。 

三,多執行緒使用:

gprof無法分析多執行緒程式。緣故是gprof使用itimer_prof定時器, 當超時時由核心向應用程式傳送訊號。但多執行緒程式只有主線程接收itimer_prof。 這裡有乙個簡單的實現方法: 對pthread_create進行保證,並以動態庫的形式在程式執行前載入。

0 給主人留下些什麼吧!~~

C Qt 統計執行時間

1.c c c中有基礎庫用於實現該功能,功能在time.h標頭檔案中,例項如下 1 include 2 include 3 include 4 5 void main 6 2.qt qt程式中也可以使用c的方法,當然qt內部封裝了乙個時間統計的方法 qtime類 注意不是qtimer,qtimer是...

Spring AOP 統計函式方法執行時間例項

package com.packtpub.aop import org.apache.commons.logging.log import org.apache.commons.logging.logfactory import org.aspectj.lang.proceedingjoinpoin...

函式執行時間計算

在最近的工作中,遇到了需要檢視某些函式執行具體時間的需求,現在分享給大家,如果有更好的改進,大家相互交流,這裡只做拋磚引玉的作用。既然要想計算時間,那麼就必須知道如何計算時間,這裡選用的計算時間的函式為 do gettimeofday returns the time of day in a tim...