日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

程序分析工具gprof介绍

發布時間:2023/11/27 生活经验 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 程序分析工具gprof介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
程序分析是以某種語言書寫的程序為對象,對其內部的運作流程進行分析。程序分析的目的主要有三點:一是通過程序內部各個模塊之間的調用關系,整體上把握程序的運行流程,從而更好地理解程序,從中汲取有價值的內容。二是以系統優化為目的,通過對程序中關鍵函數的跟蹤或者運行時信息的統計,找到系統性能的瓶頸,從而采取進一步行動對程序進行優化。最后一點,程序分析也有可能用于系統測試和程序調試中。當系統跟蹤起來比較復雜,而某個BUG又比較難找時,可以通過一些特殊的數據構造一個測試用例,然后將分析到的函數調用關系和運行時實際的函數調用關系進行對比,從而找出錯誤代碼的位置。

程序分析工具不同于調試器,它只產生程序運行時某些函數的調用次數、執行時間等等宏觀信息,而不是每條語句執行時的詳細信息。Gprof是Linux下一個強有力的程序分析工具。對于C、Pascal或者Fortran77語言的程序,它能夠以“日志”的形式記錄程序運行時的統計信息:程序運行中各個函數消耗的時間和函數調用關系,以及每個函數被調用的次數等等。從而可以幫助程序員找出眾多函數中耗時最多的函數,也可以幫助程序員分析程序的運行流程。相信這些功能對于分析開源代碼的程序員來說,有著相當大的誘惑力。

用gprof分析程序

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

l???????? 用編譯器對程序進行編譯,加上-pg參數。

l???????? 運行編譯后的程序。

l???????? 用gprof命令查看程序的運行時信息。

先以一個簡單的例子演示一下吧。隨便找一個能夠運行的程序的源代碼,比如下面的文件test.c:

?

#include <stdio.h> 
#include <string.h>
#include <stdlib.h>
static void my_print (char *); 
static void my_print2 (char *); main () 
{ 
char my_string[] = "hello world!"; 
my_print (my_string); 
my_print2 (my_string); 
my_print (my_string); 
} void count_sum() 
{ 
int i,sum=0; 
for(i=0; i<1000000; i++) 
sum += i; 
} 
void my_print (char *string) 
{ 
count_sum(); 
printf ("The string is %s ", string); 
} void my_print2 (char *string) 
{ 
char *string2; int size, i,sum =0; count_sum(); 
size = strlen (string); 
string2 = (char *) malloc (size + 1);
for (i = 0; i < size; i++) 
string2[size -1 - i] = string[i]; string2[size] =' ';
for(i=0; i<5000000; i++) 
sum += i; 
printf ("The string printed backward is %s ", string2); 
} 



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

?????? [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

這樣就有一大堆信息輸出到屏幕上,有函數執行單間,函數調用關系圖等等,如下:

?也可以使用命令$ gprof hello | more

以上介紹了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文件] [其它參數]

方括號中的內容可以省略。如果省略了“可執行文件”,gprof會在當前目錄下搜索a.out文件作為可執行文件,而如果省略了gmon.out文件,gprof也會在當前目錄下尋找gmon.out。其它參數可以控制gprof輸出內容的格式等信息。最常用的參數如下:

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
并不神奇,在編譯和鏈接程序的時候(使用 -pg 編 譯和鏈接選項),gcc 在你應用程序的每個函數中都加入了一個名為mcount(or“_mcount”, or“__mcount”) 的函數,也就是說-pg編譯的應用程序里的每一個函數都會調用mcount, 而mcount會在內存中保存一張函數 調用圖,并通過函數調用堆棧的形式查找子函數和父函數的地址。這張調用圖也保存了所有與函數相關的調用時間,調用次數等等的所有信息。

?

總結

以上是生活随笔為你收集整理的程序分析工具gprof介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。