使用Gnu gprof進行Linux平臺下的程序分析

Gprof 簡介:

Gprof功能:打印出程序運行中各個函數消耗的時間,可以幫助程序員找出衆多函數中耗時最多的函數。產生程序運行時候的函數調用關係,包括調用次數,可以幫助程序員分析程序的運行流程。

有了函數的調用關係,這會讓開發人員大大提高工作效率,不用費心地去一點點找出程序的運行流程,這對小程序來說可能效果不是很明顯,但對於有幾萬,幾十萬代碼量的工程來說,效率是毋庸置疑的!而且這個功能對於維護舊代碼或者是分析Open Source來說那是相當誘人的,有了調用圖,對程序的運行框架也就有了一個大體瞭解,知道了程序的“骨架“,分析它也就不會再那麼茫然,尤其是對自己不熟悉的代碼和Open Source。費話不多說了,讓我們開始我們的分析之旅吧!

Gprof 實現原理:

通過在編譯和鏈接你的程序的時候(使用 -pg 編譯和鏈接選項),gcc 在你應用程序的每個函數中都加入了一個名爲mcount ( or  “_mcount”  , or  “__mcount” , 依賴於編譯器或操作系統)的函數,也就是說你的應用程序裏的每一個函數都會調用mcount, 而mcount 會在內存中保存一張函數調用圖,並通過函數調用堆棧的形式查找子函數和父函數的地址。這張調用圖也保存了所有與函數相關的調用時間,調用次數等等的所有信息。

Gprof基本用法:

1. 使用 -pg 編譯和鏈接你的應用程序。

2. 執行你的應用程序使之生成供gprof 分析的數據。

3. 使用gprof 程序分析你的應用程序生成的數據。

Gprof 簡單使用:

讓我們簡單的舉個例子來看看Gprof是如何使用的。

1.打開linux終端。新建一個test.c文件,並生用-pg 編譯和鏈接該文件。 test.c 文件內容如下: 看到這裏你也可能覺得上面的函數調用圖實在是不方便察看,也看不出來一個程序調用的整體框架。沒有關係,我再介紹一個有用的工具給你,使用 Graphviz,Graphviz or Graph Visualization 是由 AT&T 開發的一個開源的圖形可視化工具。它提供了多種畫圖能力,但是我們重點關注的是它使用 Dot 語言直連圖的能力。在這裏,將簡單介紹如何使用 Dot 來創建一個圖形,並展示如何將分析數據轉換成 Graphviz 可以使用的規範, Dot 使用的圖形規範。

使用 Dot 語言,你可以指定三種對象:圖、節點和邊。爲了讓你理解這些對象的含義,我將構建一個例子來展示這些元素的用法。

下圖給出了一個簡單的定向圖(directed graph),其中包含 3 個節點。第一行聲明這個圖爲 G,並且聲明瞭該圖的類型(digraph)。接下來的三行代碼用於創建該圖的節點,這些節點分別名爲 node1、node2 和 node3。節點是在它們的名字出現在圖規範中時創建的。邊是在在兩個節點使用邊操作(->)連接在一起時創建的,如第 6 行到第 8 行所示。我還對邊使用了一個可選的屬性 label,用它來表示邊在圖中的名稱。最後,在第 9 行完成對該圖規範的定義。

使用 Dot 符號表示的示例圖(test.dot)

1: digraph G {

2:   node1;

3:   node2;

4:   node3;

5:

6:   node1 -> node2 [label="edge_1_2"];

7:   node1 -> node3 [label="edge_1_3"];

8:   node2 -> node3 [label="edge_2_3"];

9: }
要將這個 .dot 文件轉換成一個圖形映像,則需要使用 Dot 工具,這個工具是在 Graphviz 包中提供的。清單 6 介紹了這種轉換。

清單 6. 使用 Dot 來創建 JPG 映像

[linux /home]$ dot -Tjpg test.dot -o test.jpg

在這段代碼中,我告訴 Dot 使用 test.dot 圖形規範,並生成一個 JPG 圖像,將其保存在文件 test.jpg 中。所生成的圖像如圖1所示。在此處,我使用了 JPG 格式,但是 Dot 工具也可以支持其他格式,其中包括 GIF、PNG 和 postscript等等。

使用Gnu gprof進行Linux平臺下的程序分析(圖二)
圖 1. Dot 創建的示例圖


Dot 語言還可以支持其他一些選項,包括外形、顏色和很多屬性。有興趣可以查看graphviz相關文檔。

2.從gprof的輸出中提取調用圖信息,產生可供Graphviz使用的dot文件。

這樣的腳本有人已經實現了,我們只要下載一個現成的就可以了,首先從http://www.ioplex.com/~miallen/ 網站下載一個mkgraph腳本。解壓該腳本到包含gmon.out文件的目錄下。使用mkgraph0.sh產生調用的jpg圖像文件。例如:使用上面的例子,生成cflow的調用圖。

[linux /home/cflow-1.1/src]$ mkgraph0.sh cflow gmon.out

部分調用圖如下,有了這個圖是不是對程序整體框架有了個清晰地瞭解,如果你對生成的調用圖效果不滿意,你還可以通過修改mkgraph0腳本使之產生合適的dot文件即可:

使用Gnu gprof進行Linux平臺下的程序分析(圖三)
部分調用圖如下


總結:

使用gprof , Graphviz , mkgraph 生成函數調用圖

1. 使用 -pg 編譯和鏈接你的應用程序。

2. 執行你的應用程序使之生成供gprof 分析的數據。

3. 使用mkgraph腳本生成圖形化的函數調用圖。

相關資料:

文檔:用 Graphviz 可視化函數調用

文檔:Speed your code with the GNU profiler

文檔:gropf 幫助文件

Mkgraph 腳本:http://www.ioplex.com/~miallen/

Graphviz 工具:http://www.graphviz.org

Cflow         :http://www.gnu.org/software/cflow/

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章