gprof使用詳細(xì)介紹_第1頁
gprof使用詳細(xì)介紹_第2頁
gprof使用詳細(xì)介紹_第3頁
gprof使用詳細(xì)介紹_第4頁
gprof使用詳細(xì)介紹_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、gprof使用詳細(xì)介紹linux下c/c+編程gprof介紹gprof是GNU profiler工具。可以顯示程序運(yùn)行的“flat profile”,包括每個(gè)函數(shù)的調(diào)用次 數(shù),每個(gè)函數(shù)消耗的處理器時(shí)間。也可以顯示“調(diào)用圖”,包括函數(shù)的調(diào)用關(guān)系,每個(gè)函 數(shù)調(diào)用花費(fèi)了多少時(shí)間。還可以顯示“注釋的源代碼”,是程序源代碼的一個(gè)復(fù)本,標(biāo)記 有程序中每行代碼的執(zhí)行次數(shù)?;居梅ǎ菏褂?pg選項(xiàng)編譯和鏈接你的應(yīng)用程序。執(zhí)行你的應(yīng)用程序,使之運(yùn)行完成后生成供gprof分析的數(shù)據(jù)文件(默認(rèn)是 gmon.out)。使用gprof程序分析你的應(yīng)用程序生成的數(shù)據(jù),例如:gprof a.out gmon.out。舉例g

2、cc -Wall -pg -o test test.c程序文件名稱test.c編譯時(shí)使用-pg 現(xiàn)在我們可以再次運(yùn)行test,并使用我們前面使用的測(cè)試數(shù)據(jù)。這次我們運(yùn)行的時(shí)候, test運(yùn)行的分析數(shù)據(jù)會(huì)被搜集并保存在gmon.out文件中,我們可以通過運(yùn)行g(shù)prof test 來查看結(jié)果。./testgprof test gprof實(shí)現(xiàn)原理:gprof并不神奇,在編譯和鏈接程序的時(shí)候(使用-pg編譯和鏈接選項(xiàng)),gcc在你 應(yīng)用程序的每個(gè)函數(shù)中都加入了一個(gè)名為mcount (or“_mcount”, or_mcount”)的函 數(shù),也就是說-pg編譯的應(yīng)用程序里的每一個(gè)函數(shù)都會(huì)調(diào)用mcount

3、,而mcount會(huì)在內(nèi) 存中保存一張函數(shù)調(diào)用圖,并通過函數(shù)調(diào)用堆棧的形式查找子函數(shù)和父函數(shù)的地址。這 張調(diào)用圖也保存了所有與函數(shù)相關(guān)的調(diào)用時(shí)間,調(diào)用次數(shù)等等的所有信息。程序運(yùn)行結(jié)束后,會(huì)在程序退出的路徑下生成一個(gè)gmon.out文件。這個(gè)文件就是記錄 并保存下來的監(jiān)控?cái)?shù)據(jù)。可以通過命令行方式的gprof或圖形化的Kprof來解讀這些數(shù) 據(jù)并對(duì)程序的性能進(jìn)行分析。另外,如果想查看庫函數(shù)的profiling,需要在編譯是再加入“-lc_p”編譯參數(shù)代替“-lc”編 譯參數(shù),這樣程序會(huì)鏈接libc_p.a庫,才可以產(chǎn)生庫函數(shù)的profiling信息。如果想執(zhí)行 一行一行的profiling,還需要加

4、入“-g”編譯參數(shù)。gprof產(chǎn)生的信息%the percentage of the total running time of thetimeprogram used by this function.函數(shù)使用時(shí)間占所有時(shí)間的百分比。cumulative secondsa running sum of the number of seconds accounted for by this function and those listed above it.函數(shù)和上列函數(shù)累計(jì)執(zhí)行的時(shí)間。self secondsthe number of seconds accounted for by th

5、is function alone. This is the major sort for this listing.函數(shù)本身所執(zhí)行的時(shí)間。callsthe number of times this function was invoked, if this function is profiled, else blank.函數(shù)被調(diào)用的次數(shù)self ms/callthe average number of milliseconds spent in this function per call, if this function is profiled,else blank.每一次調(diào)用花費(fèi)在函

6、數(shù)的時(shí)間microseconds。totalms/callthe average number of milliseconds spent in this function and its descendents per call, if this function is profiled, else blank.每一次調(diào)用,花費(fèi)在函數(shù)及其衍生函數(shù)的平均時(shí)間microseconds。namethe name of the function. This is the minor sort for this listing. The index shows the location of the

7、function in the gprof listing. If the index is in parenthesis it shows where it would appear in the gprof listing if it were to be printed.函數(shù)名更多詳細(xì)介紹在內(nèi)存中分配一些內(nèi)存,存儲(chǔ)程序執(zhí)行期間的統(tǒng)計(jì)數(shù)據(jù)在GCC使用-pg選項(xiàng)編譯后,gcc會(huì)在程序的入口處(main函數(shù)之前)調(diào)用void monstartup(lowpc, highpc)在每個(gè)函數(shù)的入口處調(diào)用void _mcount()在程序退出時(shí)(在atexit ()里)調(diào)用void _mcleanup

8、()monstartup:負(fù)責(zé)初始化profile環(huán)境,分配內(nèi)存空間_mcount:記錄每個(gè)函數(shù)代碼的caller和callee的位置_mcleanup:清除profile環(huán)境,保存結(jié)果數(shù)據(jù)為gmon.out,供gprof分析結(jié)果在_mcount函數(shù)中跟蹤程序的執(zhí)行狀況,記錄程序代碼的執(zhí)行次數(shù),時(shí)間等數(shù)據(jù)。常用的gprof命令選項(xiàng):-b不再輸出統(tǒng)計(jì)圖表中每個(gè)字段的詳細(xì)描述。-p只輸出函數(shù)的調(diào)用圖(Call graph的那部分信息)。-q只輸出函數(shù)的時(shí)間消耗列表。-e Name不再輸出函數(shù)Name及其子函數(shù)的調(diào)用圖(除非它們有未被限制的其它父函數(shù))??梢越o定多個(gè)-e標(biāo)志。一個(gè)-e標(biāo)志只能指定一個(gè)

9、函數(shù)。-E Name 不再輸出函數(shù)Name及其子函數(shù)的調(diào)用圖,此標(biāo)志類似于-e標(biāo)志,但 它在總時(shí)間和百分比時(shí)間的計(jì)算中排除了由函數(shù)Name及其子函數(shù)所用的時(shí)間。-f Name輸出函數(shù)Name及其子函數(shù)的調(diào)用圖??梢灾付ǘ鄠€(gè)-f標(biāo)志。一個(gè)-f標(biāo)志只能指定一個(gè)函數(shù)。-F Name 輸出函數(shù)Name及其子函數(shù)的調(diào)用圖,它類似于-f標(biāo)志,但它在總時(shí)間 和百分比時(shí)間計(jì)算中僅使用所打印的例程的時(shí)間??梢灾付ǘ鄠€(gè)-F標(biāo)志。一個(gè)-F標(biāo) 志只能指定一個(gè)函數(shù)。-F標(biāo)志覆蓋-E標(biāo)志。-z顯示使用次數(shù)為零的例程(按照調(diào)用計(jì)數(shù)和累積時(shí)間計(jì)算)。使用注意:一般gprof只能查看用戶函數(shù)信息。如果想查看庫函數(shù)的信息,需要在

10、編譯是再加 入“-lc_p ”編譯參數(shù)代替“-lc ”編譯參數(shù),這樣程序會(huì)鏈接libc_p.a庫,才可以產(chǎn)生庫函數(shù) 的 profiling 信息。gprof只能在程序正常結(jié)束退出之后才能生成程序測(cè)評(píng)報(bào)告,原因是gprof通過在 atexit()里注冊(cè)了一個(gè)函數(shù)來產(chǎn)生結(jié)果信息,任何非正常退出都不會(huì)執(zhí)行atexit()的動(dòng)作, 所以不會(huì)產(chǎn)生gmon.out文件。如果你的程序是一個(gè)不會(huì)退出的服務(wù)程序,那就只有修 改代碼來達(dá)到目的。如果不想改變程序的運(yùn)行方式,可以添加一個(gè)信號(hào)處理函數(shù)解決問 題(這樣對(duì)代碼修改最少),例如:static void sighandler( int sig_no )(exi

11、t(0);signal( SIGUSR1, sighandler );當(dāng)使用kill -USR1 pid后,程序退出,生成gmon.out文件。編輯其他C/C+程序分析器 還有其他很多分析器可以使用gprof的數(shù)據(jù),例如KProf (截屏)和cgprof。雖然圖形 界面的看起來更舒服,但我個(gè)人認(rèn)為命令行的gprof使用更方便。來自: HYPERLINK /zojoyo/blog/item/0ad631ee9aee302e2cf5341f.html /zojoyo/blog/item/0ad631ee9aee302e2cf5341f.html同時(shí),-pg參數(shù)只能記錄源代碼中各個(gè)函數(shù)的調(diào)用關(guān)系,而

12、不能記錄庫函數(shù)的調(diào)用情況。 要想記錄每個(gè)庫函數(shù)的調(diào)用情況,鏈接的時(shí)候必須指定庫函數(shù)的動(dòng)態(tài)(或者靜態(tài))鏈接 庫libc_p.a,即加上-lc_p,而不是-lc。還要說明的是,如果有一部分代碼在編譯時(shí)指定了-pg參數(shù),而另一部分代碼沒有 指定,則生成的gmon.out文件中將缺少一部分函數(shù),也沒有那些函數(shù)的調(diào)用關(guān)系。但 是并不影響gprof對(duì)其它函數(shù)進(jìn)行記錄。運(yùn)行編譯好的程序運(yùn)行時(shí)和運(yùn)行一般的程序沒有什么不同,只是比正常的程序多生成了 一個(gè)文件gmon.out。注意,這個(gè)文件名是固定的,沒法通過參數(shù)的設(shè)置進(jìn)行改變。如 果程序目錄中已經(jīng)有一個(gè)gmon.out,則它會(huì)被新的gmon.out覆蓋掉。關(guān)于

13、生成的gmon.out文件所在的目錄,也有以下約定:程序退出時(shí)所運(yùn)行的文件 所在目錄就是生成的gmon.out文件所在的目錄。如果一個(gè)程序執(zhí)行過程中調(diào)用了另一 個(gè)程序,并在另一個(gè)程序的運(yùn)行中終止,則gmon.out會(huì)在另一個(gè)程序所在的目錄中生 成。還有一點(diǎn)要注意的就是當(dāng)程序非正常終止時(shí)不會(huì)生成gmon.out文件,也因此就沒 法查看程序運(yùn)行時(shí)的信息。只有當(dāng)程序從main函數(shù)中正常退出,或者通過系統(tǒng)調(diào)用exit() 函數(shù)而退出時(shí),才會(huì)生成gmon.out文件。而通過底層調(diào)用如_exit()等退出時(shí)不會(huì)生成 gmon.out。查看查看程序運(yùn)行信息的命令是gprof,它以gmon.out文件作為輸入

14、,也就是將 gmon.out文件翻譯成可讀的形式展現(xiàn)給用戶。其命令格式如下:gprof 可執(zhí)行文件gmon.out文件其它參數(shù)方括號(hào)中的內(nèi)容可以省略。如果省略了 “可執(zhí)行文件”,gprof會(huì)在當(dāng)前目錄下搜 索a.out文件作為可執(zhí)行文件,而如果省略了 gmon.out文件,gprof也會(huì)在當(dāng)前目錄下 尋找gmon.out。其它參數(shù)可以控制gprof輸出內(nèi)容的格式等信息。最常用的參數(shù)如下:l-b不再輸出統(tǒng)計(jì)圖表中每個(gè)字段的詳細(xì)描述。l-p只輸出函數(shù)的調(diào)用圖(Call graph的那部分信息)。l-q只輸出函數(shù)的時(shí)間消耗列表。l-e Name不再輸出函數(shù)Name及其子函數(shù)的調(diào)用圖(除非它們有未被限制的其它父函數(shù))。可以給定多個(gè)-e標(biāo)志。一個(gè)-e標(biāo)志只能指定一個(gè)函數(shù)。l-E Name不再輸出函數(shù)Name及其子函數(shù)的調(diào)用圖,此標(biāo)志類似于-e標(biāo)志,但它在總時(shí)間和百分比時(shí)間的計(jì)算中排除了由函數(shù)Name及其子函數(shù)所用的時(shí) 間。l-f Name輸出函數(shù)Name及其子函數(shù)的調(diào)用圖??梢灾付ǘ鄠€(gè)-f標(biāo)志。一個(gè)-f標(biāo)志只能指定一個(gè)函數(shù)。l-F Name輸出函數(shù)Nam

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論