程式分析工具gprof介紹

2021-06-16 08:26:18 字數 3377 閱讀 1399

程式分析是以某種語言書寫的程式為物件,對其內部的運作流程進行分析。程式分析的目的主要有三點:一是通過程式內部各個模組之間的呼叫關係,整體上把握程式的執行流程,從而更好地理解程式,從中汲取有價值的內容。二是以系統優化為目的,通過對程式中關鍵函式的跟蹤或者執行時資訊的統計,找到系統效能的瓶頸,從而採取進一步行動對程式進行優化。最後一點,程式分析也有可能用於系統測試和程式除錯中。當系統跟蹤起來比較複雜,而某個bug又比較難找時,可以通過一些特殊的資料構造乙個測試用例,然後將分析到的函式呼叫關係和執行時實際的函式呼叫關係進行對比,從而找出錯誤**的位置。

程式分析工具不同於偵錯程式,它只產生程式執行時某些函式的呼叫次數、執行時間等等巨集觀資訊,而不是每條語句執行時的詳細資訊。gprof是linux下乙個強有力的程式分析工具。對於c、pascal或者fortran77語言的程式,它能夠以「日誌」的形式記錄程式執行時的統計資訊:程式執行中各個函式消耗的時間和函式呼叫關係,以及每個函式被呼叫的次數等等。從而可以幫助程式設計師找出眾多函式中耗時最多的函式,也可以幫助程式設計師分析程式的執行流程。相信這些功能對於分析開源**的程式設計師來說,有著相當大的**力。

用gprof分析程式

用gprof對程式進行分析主要分以下三個步驟:

l         用編譯器對程式進行編譯,加上-pg引數。

l         執行編譯後的程式。

l         用gprof命令檢視程式的執行時資訊。

先以乙個簡單的例子演示一下吧。隨便找乙個能夠執行的程式的源**,比如下面的檔案test.c:

int iseven(int x)

int main(int argc, char *argv

首先,用以下命令進行編譯:

[root@localhost]#gcc –o test –pg test.c

然後,執行可執行檔案test.

[root@localhost]#./test

執行後,在當前目錄下將生成乙個檔案gmon.out,這就是gprof生成的檔案,儲存有程式執行期間函式呼叫等資訊。

最後,用gprof命令檢視gmon.out儲存的資訊:

[root@localhost]#gprof test gmon.out –b

這樣就有一大堆資訊輸出到螢幕上,有函式執行單間,函式呼叫關係圖等等,如下:

flat profile:

each sample counts as 0.01 seconds.

no time accumulated

%   cumulative   self              self     total          

time   seconds   seconds    calls  ts/call  ts/call  name   

0.00      0.00     0.00     1000     0.00     0.00  iseven(int)

call graph

granularity: each sample hit covers 2 byte(s) no time propagated

index % time    self  children    called     name

0.00    0.00    1000/1000        main [7]

[8]      0.0    0.00    0.00    1000         iseven(int) [8]

index by function name

[8] iseven(int)

以上介紹了gprof最簡單的使用方法,下面針對其使用過程中的三個步驟詳細說明。

編譯和鏈結

上面的例子中,程式比較簡單,只有乙個檔案。如果源**有多個檔案,或者**結構比較複雜,編譯過程中先生成若干個目標檔案,然後又由鏈結器將這些目標檔案鏈結到一起,這時該怎麼使用gprof呢?

對於由多個原始檔組成的程式,編譯時需要在生成每個.o檔案的時候加上-pg引數,同時在鏈結的時候也要加上-pg引數。對於鏈結器不是gcc的情況,如ld,又有特殊的要求。

同時,-pg引數只能記錄源**中各個函式的呼叫關係,而不能記錄庫函式的呼叫情況。要想記錄每個庫函式的呼叫情況,鏈結的時候必須指定庫函式的動態(或者靜態)鏈結庫libc_p.a,即加上-lc_p,而不是-lc。

還要說明的是,如果有一部分**在編譯時指定了-pg引數,而另一部分**沒有指定,則生成的gmon.out檔案中將缺少一部分函式,也沒有那些函式的呼叫關係。但是並不影響gprof對其它函式進行記錄。

執行 編譯好的程式執行時和執行一般的程式沒有什麼不同,只是比正常的程式多生成了乙個檔案gmon.out。注意,這個檔名是固定的,沒法通過引數的設定進行改變。如果程式目錄中已經有乙個gmon.out,則它會被新的gmon.out覆蓋掉。

關於生成的gmon.out檔案所在的目錄,也有以下約定:程式退出時所執行的檔案所在目錄就是生成的gmon.out檔案所在的目錄。如果乙個程式執行過程中呼叫了另乙個程式,並在另乙個程式的執行中終止,則gmon.out會在另乙個程式所在的目錄中生成。

還有一點要注意的就是當程式非正常終止時不會生成gmon.out檔案,也因此就沒法檢視程式執行時的資訊。只有當程式從main函式中正常退出,或者通過系統呼叫exit()函式而退出時,才會生成gmon.out檔案。而通過底層呼叫如_exit()等退出時不會生成gmon.out。

檢視 檢視程式執行資訊的命令是gprof,它以gmon.out檔案作為輸入,也就是將gmon.out檔案翻譯成可讀的形式展現給使用者。其命令格式如下:

gprof [可執行檔案] [gmon.out檔案] [其它引數]

l         -b 不再輸出統計圖表中每個欄位的詳細描述。

l         -p 只輸出函式的呼叫圖(call graph的那部分資訊)。

l         -q 只輸出函式的時間消耗列表。

l         -e name 不再輸出函式name 及其子函式的呼叫圖(除非它們有未被限制的其它父函式)。可以給定多個 -e 標誌。乙個 -e 標誌只能指定乙個函式。

l         -e name 不再輸出函式name 及其子函式的呼叫圖,此標誌類似於 -e 標誌,但它在總時間和百分比時間的計算中排除了由函式name 及其子函式所用的時間。

l         -f name 輸出函式name 及其子函式的呼叫圖。可以指定多個 -f 標誌。乙個 -f 標誌只能指定乙個函式。

l         -f name 輸出函式name 及其子函式的呼叫圖,它類似於 -f 標誌,但它在總時間和百分比時間計算中僅使用所列印的例程的時間。可以指定多個 -f 標誌。乙個 -f 標誌只能指定乙個函式。-f 標誌覆蓋 -e 標誌。

l         -z 顯示使用次數為零的例程(按照呼叫計數和累積時間計算)。

不過,gprof不能顯示物件之間的繼承關係,這也是它的弱點.

**:

gprof工具使用

gprof會精確的給出函式被呼叫的時間和次數,給出函式呼叫關係 gprof使用 1.在編譯和鏈結階段加入 pg 2.重新編譯 3.執行生成的可執行程式,在可執行程式當前目錄下生成gmon.out 4.用 gprof 工具分析 gmon.out 檔案 gprof gwcap gmon.out p p引...

gprof使用介紹

gprof實際上只是乙個用於讀取profile結果檔案的工具。gprof採用混合方法來收集程式的統計資訊,他使用檢測方法,在編譯過程中在函式入口處插入計數器用於收集每個函式的被呼叫情況和被呼叫次數 也使用取樣方法,在執行時按一定間隔去檢查程式計數器並在分析時找出程式計數器對應的函式來統計函式占用的時...

gprof使用介紹 gcc pg

linux服務端程式設計,效能總是不可避免要思考的問題。而單機 嚴格的說是單核 單執行緒程式 嚴格的說是邏輯 又是所有複雜應用的基礎。所以,這塊的效能是整個應用的基礎。當遇到應用相應很慢的時候我們往往會疑問 這麼強勁的cpu到底在幹什麼,反應這麼慢。滿足你!linux下常用的效能工具就是跟gcc一起...