本申請涉及視頻直播領(lǐng)域,尤其涉及一種統(tǒng)計應(yīng)用程序中的函數(shù)調(diào)用的方法及組件。
背景技術(shù):
目前,隨著網(wǎng)絡(luò)通信技術(shù)的進(jìn)步和寬帶網(wǎng)絡(luò)的提速,網(wǎng)絡(luò)直播得到了越來越多的發(fā)展和應(yīng)用。尤其在游戲直播領(lǐng)域,越來越多的觀眾會觀看游戲主播的直播。對于游戲直播,主播是通過使用直播平臺提供的直播軟件進(jìn)行直播。對于客戶端軟件,通常需要統(tǒng)計其軟件的性能瓶頸,從而提升軟件的性能,提高用戶的體驗。如果是在軟件開發(fā)的時候,比較容易的可以加入對每個函數(shù)的調(diào)用時間和調(diào)用次數(shù)進(jìn)行統(tǒng)計,但是如果軟件已經(jīng)發(fā)布,則是沒有辦法來統(tǒng)計每個函數(shù)的調(diào)用時間和調(diào)用次數(shù)的。
技術(shù)實現(xiàn)要素:
本發(fā)明了提供了一種統(tǒng)計應(yīng)用程序中的函數(shù)調(diào)用的方法及組件,以解決目前面臨的如果軟件已經(jīng)發(fā)布,則沒有辦法來統(tǒng)計每個函數(shù)的調(diào)用時間和調(diào)用次數(shù)的技術(shù)問題。
為解決上述技術(shù)問題,本發(fā)明提供了一種統(tǒng)計應(yīng)用程序中的函數(shù)調(diào)用的方法,所述方法應(yīng)用在統(tǒng)計應(yīng)用程序中的函數(shù)調(diào)用的組件中,所述方法包括:
在所述應(yīng)用程序運行時,利用所述組件中的鉤子函數(shù)庫監(jiān)控統(tǒng)計調(diào)用信息文件map文件中的所有函數(shù)的函數(shù)頭在預(yù)設(shè)時間內(nèi)各自的調(diào)用次數(shù),和所述所有函數(shù)的函數(shù)頭各自的調(diào)用時刻;其中,所述組件注入所述應(yīng)用程序的進(jìn)程中;
利用所述鉤子函數(shù)庫監(jiān)控統(tǒng)計所述map文件中的所有函數(shù)的函數(shù)尾各自的調(diào)用時刻;
基于所述map文件中的所述所有函數(shù)的函數(shù)頭各自的調(diào)用時刻以及所述所有函數(shù)的函數(shù)尾各自的調(diào)用時刻,確定出所述所有函數(shù)在所述預(yù)設(shè)時間內(nèi)的調(diào)用時間。
為了避免發(fā)布之后的應(yīng)用程序無法監(jiān)控其函數(shù)調(diào)用情況(調(diào)用時間、調(diào)用次數(shù)等等),本發(fā)明通過上述方法在應(yīng)用程序運行時對其進(jìn)行監(jiān)控,然后將該組件注入到運行的應(yīng)用程序進(jìn)程中,該組件具有監(jiān)控應(yīng)用程序的所有函數(shù)調(diào)用情況的功能,并統(tǒng)計每個函數(shù)的調(diào)用次數(shù)和調(diào)用時間,最后將統(tǒng)計的結(jié)果輸出。
優(yōu)選的,所述map文件中至少記錄了所述所有函數(shù)的函數(shù)名稱、函數(shù)地址,函數(shù)長度、所有的全局變量、全局變量名的地址。有了map文件,本發(fā)明就可以直接調(diào)用map文件,進(jìn)而為對所有函數(shù)進(jìn)行監(jiān)控。
優(yōu)選的,所述利用所述組件中的鉤子函數(shù)庫鉤子函數(shù)庫監(jiān)控統(tǒng)計調(diào)用信息文件map文件中的所有函數(shù)的函數(shù)頭在預(yù)設(shè)時間內(nèi)各自的調(diào)用次數(shù),和所述所有函數(shù)的函數(shù)頭各自的調(diào)用時刻之前,還包括:利用所述鉤子函數(shù)庫的鉤子函數(shù)監(jiān)控所述所有函數(shù)的函數(shù)頭。鉤子函數(shù)庫可以將自身的代碼“融入”被監(jiān)控的程序的進(jìn)程中,成為目標(biāo)進(jìn)程的一個部分,從而可以對程序進(jìn)行監(jiān)控,還可以在目標(biāo)代碼中加入自己的邏輯。
優(yōu)選的,所述利用所述鉤子函數(shù)庫的鉤子函數(shù)監(jiān)控所述所有函數(shù)的函數(shù)頭,包括:獲取所述組件在終端設(shè)備的內(nèi)存中的起始地址;讀取所述map文件中的所有函數(shù)的函數(shù)名稱、函數(shù)地址;其中,所述所有函數(shù)的函數(shù)地址為各自相對于所述組件的函數(shù)地址;將所述所有函數(shù)的函數(shù)地址各自相對于所述組件的函數(shù)地址分別和所述組件在內(nèi)存中的起始地址求和,獲得所述所有函數(shù)各自的內(nèi)存地址;所述所有函數(shù)各自的內(nèi)存地址就是所述所有函數(shù)各自的函數(shù)頭;利用所述鉤子函數(shù)庫對所述所有函數(shù)各自的內(nèi)存地址進(jìn)行監(jiān)控。
優(yōu)選的,所述將所述所有函數(shù)的函數(shù)地址各自相對于所述組件的函數(shù)地址分別和所述組件在內(nèi)存中的起始地址求和,獲得所述所有函數(shù)各自的內(nèi)存地址;所述所有函數(shù)各自的內(nèi)存地址就是所述所有函數(shù)各自的函數(shù)頭,包括:利用所述鉤子函數(shù)庫監(jiān)控所述所有函數(shù)從各自的內(nèi)存地址調(diào)用的調(diào)用次數(shù)和調(diào)用時刻。
優(yōu)選的,所述利用所述鉤子函數(shù)庫監(jiān)控統(tǒng)計所述map文件中的所有函數(shù)的函數(shù)尾各自的調(diào)用時刻,包括:讀取所述所有函數(shù)的函數(shù)名稱、函數(shù)地址、函數(shù)長度;將所述所有函數(shù)各自的函數(shù)地址和函數(shù)長度求和,獲得所述所有函數(shù)各自的尾地址;利用所述鉤子函數(shù)庫對所述所有函數(shù)各自的尾地址進(jìn)行監(jiān)控,獲得所述所有函數(shù)各自的尾地址的調(diào)用時刻。
本發(fā)明公開了一種統(tǒng)計應(yīng)用程序中的函數(shù)調(diào)用的組件,所述組件注入在所述應(yīng)用程序的進(jìn)程中,用以對所述應(yīng)用程序中的所有函數(shù)的調(diào)用時間和調(diào)用次數(shù)進(jìn)行監(jiān)控,包括:
第一監(jiān)控模塊,用于在所述應(yīng)用程序運行時,利用所述組件中的鉤子函數(shù)庫監(jiān)控統(tǒng)計調(diào)用信息文件map文件中的所有函數(shù)的函數(shù)頭在預(yù)設(shè)時間內(nèi)各自的調(diào)用次數(shù),和所述所有函數(shù)的函數(shù)頭各自的調(diào)用時刻;其中,所述組件注入所述應(yīng)用程序的進(jìn)程中;
第二監(jiān)控模塊,用于利用所述鉤子函數(shù)庫監(jiān)控統(tǒng)計所述map文件中的所有函數(shù)的函數(shù)尾各自的調(diào)用時刻;
確定模塊,用于基于所述map文件中的所述所有函數(shù)的函數(shù)頭各自的調(diào)用時刻以及所述所有函數(shù)的函數(shù)尾各自的調(diào)用時刻,確定出所述所有函數(shù)在所述預(yù)設(shè)時間內(nèi)的調(diào)用時間。
優(yōu)選的,所述map文件中至少記錄了所述所有函數(shù)的函數(shù)名稱、函數(shù)地址,函數(shù)長度、所有的全局變量、全局變量名的地址。
優(yōu)選的,所述組件還包括:
第三監(jiān)控模塊,用于利用所述鉤子函數(shù)庫的鉤子函數(shù)監(jiān)控所述所有函數(shù)的函數(shù)頭。
優(yōu)選的,所述第三監(jiān)控模塊,包括:
獲取模塊,用于獲取所述組件在終端設(shè)備的內(nèi)存中的起始地址;
讀取模塊,用于讀取所述map文件中的所有函數(shù)的函數(shù)名稱、函數(shù)地址;其中,所述所有函數(shù)的函數(shù)地址為各自相對于所述組件的函數(shù)地址;
獲得模塊,用于將所述所有函數(shù)的函數(shù)地址各自相對于所述組件的函數(shù)地址分別和所述組件在內(nèi)存中的起始地址求和,獲得所述所有函數(shù)各自的內(nèi)存地址;所述所有函數(shù)各自的內(nèi)存地址就是所述所有函數(shù)各自的函數(shù)頭;
監(jiān)控子模塊,用于利用所述鉤子函數(shù)庫對所述所有函數(shù)各自的內(nèi)存地址進(jìn)行監(jiān)控。
通過本發(fā)明的一個或者多個技術(shù)方案,本發(fā)明具有以下有益效果或者優(yōu)點:
本發(fā)明公開了一種統(tǒng)計應(yīng)用程序中的函數(shù)調(diào)用的方法,為了避免發(fā)布之后的應(yīng)用程序無法監(jiān)控其函數(shù)調(diào)用情況,所述方法應(yīng)用在統(tǒng)計應(yīng)用程序中的函數(shù)調(diào)用的組件中,用以監(jiān)控應(yīng)用程序的函數(shù)調(diào)用情況。在該應(yīng)用程序運行時,利用所述組件中的鉤子函數(shù)庫監(jiān)控統(tǒng)計調(diào)用信息文件map文件中的所有函數(shù)的函數(shù)頭在預(yù)設(shè)時間內(nèi)各自的調(diào)用次數(shù),和所有函數(shù)的函數(shù)頭各自的調(diào)用時刻;然后利用所述鉤子函數(shù)庫監(jiān)控統(tǒng)計所述map文件中的所有函數(shù)的函數(shù)尾各自的調(diào)用時刻;基于所述map文件中的所述所有函數(shù)的函數(shù)頭各自的調(diào)用時刻以及所述所有函數(shù)的函數(shù)尾各自的調(diào)用時刻,確定出所述所有函數(shù)在所述預(yù)設(shè)時間內(nèi)的調(diào)用時間。進(jìn)而,本發(fā)明可以在應(yīng)用程序運行時,實時統(tǒng)計函數(shù)的調(diào)用情況。
附圖說明
圖1為本發(fā)明實施例中一種統(tǒng)計應(yīng)用程序中的函數(shù)調(diào)用的方法的流程圖;
圖2為本發(fā)明實施例中一種統(tǒng)計應(yīng)用程序中的函數(shù)調(diào)用的組件的示意圖。
具體實施方式
本發(fā)明了提供了一種統(tǒng)計應(yīng)用程序中的函數(shù)調(diào)用的方法及組件,為了避免發(fā)布之后的應(yīng)用程序無法監(jiān)控其函數(shù)調(diào)用情況(調(diào)用時間、調(diào)用次數(shù)等等),本發(fā)明編寫了一個可以用于在應(yīng)用程序運行時對其進(jìn)行監(jiān)控的組件,然后將該組件注入到運行的應(yīng)用程序進(jìn)程中,該組件具有監(jiān)控應(yīng)用程序的所有函數(shù)調(diào)用情況的功能,并統(tǒng)計每個函數(shù)的調(diào)用次數(shù)和調(diào)用時間,最后將統(tǒng)計的結(jié)果輸出。所以后續(xù)的hook(鉤子函數(shù),用來監(jiān)控函數(shù)的調(diào)用情況)功能代碼都編寫在這個組件中。組件注入的方式則有很多,可以是遠(yuǎn)程線程注入、消息鉤子注入等等。
本發(fā)明的應(yīng)用程序可為任意應(yīng)用程序,例如直播視頻軟件、語音聊天軟件等等,對此本發(fā)明不做限制。
為了使本申請所屬技術(shù)領(lǐng)域中的技術(shù)人員更清楚地理解本申請,下面結(jié)合附圖,通過具體實施例對本申請技術(shù)方案作詳細(xì)描述。
本發(fā)明公開了一種統(tǒng)計應(yīng)用程序中的函數(shù)調(diào)用的方法,所述方法應(yīng)用在統(tǒng)計應(yīng)用程序中的函數(shù)調(diào)用的組件中。
參看圖1,是本發(fā)明提供的一種統(tǒng)計應(yīng)用程序中的函數(shù)調(diào)用的方法的流程圖,該方法包括:
步驟11,在所述應(yīng)用程序運行時,利用所述組件中的鉤子函數(shù)庫監(jiān)控統(tǒng)計調(diào)用信息文件map文件中的所有函數(shù)的函數(shù)頭在預(yù)設(shè)時間內(nèi)各自的調(diào)用次數(shù),和所述所有函數(shù)的函數(shù)頭各自的調(diào)用時刻。
在具體的實施過程中,本發(fā)明的組件注入在所述應(yīng)用程序的進(jìn)程中。故而,在應(yīng)用程序運行時,該組件即可利用組件中的鉤子函數(shù)庫對該應(yīng)用程序中的所有函數(shù)進(jìn)行監(jiān)控,進(jìn)而避免無法對發(fā)布后的軟件中的函數(shù)的調(diào)用時間、調(diào)用次數(shù)進(jìn)行監(jiān)控的漏洞。后續(xù)本發(fā)明會介紹應(yīng)用在組件中的統(tǒng)計應(yīng)用程序中的函數(shù)調(diào)用的具體實施過程,即如何對應(yīng)用程序的所有函數(shù)進(jìn)行監(jiān)控統(tǒng)計。在此,本發(fā)明先介紹map文件的創(chuàng)建。
map文件,是事先在使用編譯器生成軟件(即應(yīng)用程序)的執(zhí)行文件時加入生成的。在使用編譯器編譯軟件的代碼的時候,可以在編譯器選項中加入‘生成map文件’這一選項,進(jìn)而編譯器則會根據(jù)開發(fā)者的操作來生成map文件。
其中,map文件實際是一個調(diào)用信息文件,其包含有該應(yīng)用程序中所有函數(shù)的函數(shù)名稱、函數(shù)地址(即:函數(shù)的相對于模塊的地址),函數(shù)長度,所有的全局變量名,全局變量名的地址等。有了map文件,就具有了對應(yīng)于該模塊的所有函數(shù)的名稱,以及該函數(shù)在運行時的內(nèi)存地址,以及函數(shù)的代碼的長度信息。有了map文件,組件即可以調(diào)用map文件,進(jìn)而為對所有函數(shù)進(jìn)行監(jiān)控,通過使用鉤子函數(shù)將自身的代碼“融入”被監(jiān)控的程序的進(jìn)程中,成為目標(biāo)進(jìn)程的一個部分,從而可以對程序進(jìn)行監(jiān)控,還可以在目標(biāo)代碼中加入自己的邏輯。
作為一種可選的實施方式,鉤子函數(shù)庫可采用detours庫,detours庫是一個hook(監(jiān)控)工具庫,里面包含了各類鉤子函數(shù),可滿足對任一函數(shù)進(jìn)行監(jiān)控的可能。
下面介紹如何對應(yīng)用程序的所有函數(shù)進(jìn)行監(jiān)控統(tǒng)計。
在此之前,需要利用所述鉤子函數(shù)庫的鉤子函數(shù)監(jiān)控所述所有函數(shù)的函數(shù)頭。
在監(jiān)控所有函數(shù)的函數(shù)頭時,本發(fā)明使用內(nèi)聯(lián)監(jiān)控方式,其原理是在函數(shù)的開頭加入一個匯編的“jmp”指令,通過這個挑戰(zhàn)則可以跳轉(zhuǎn)到我們插入的代碼邏輯中,代碼邏輯是組件的組成代碼,運行代碼邏輯即執(zhí)行該組件的功能,然后等插入的代碼邏輯執(zhí)行完成后,再跳轉(zhuǎn)到hook的函數(shù)接著其邏輯繼續(xù)執(zhí)行。本發(fā)明在插入的代碼邏輯中,加入了對函數(shù)的調(diào)用次數(shù)統(tǒng)計信息,用以對函數(shù)的調(diào)用次數(shù)進(jìn)行統(tǒng)計。例如,可以加入一個變量來統(tǒng)計函數(shù)的調(diào)用次數(shù),并且沒執(zhí)行一次則計數(shù)加1,最終統(tǒng)計完成時,該變量的值則是該段統(tǒng)計時段內(nèi)函數(shù)的調(diào)用次數(shù)。
另外,本發(fā)明也可以記錄下當(dāng)前調(diào)用的時刻,后續(xù)在函數(shù)尾進(jìn)行監(jiān)控時也會加入當(dāng)前調(diào)用的時刻,通過函數(shù)尾的時刻減去函數(shù)頭的時刻則可以得到監(jiān)控的這個函數(shù)在執(zhí)行一次所花費的時間。
本文使用微軟提供的開源的內(nèi)聯(lián)監(jiān)控工具detours(detours是微軟開發(fā)的一個hook工具庫)來實現(xiàn)監(jiān)控功能。
下面介紹具體的實施過程。
第1步,獲取所述組件在終端設(shè)備的內(nèi)存中的起始地址。
對于組件在內(nèi)存的加載起始地址每次都是不一樣的,所以需要先獲取組件在終端設(shè)備的內(nèi)存的起始地址。
hmodulegetmodulehandle(lpctstrlpmodulename);
通過調(diào)用windowsapi函數(shù)getmodulehandle來獲取組件的內(nèi)存起始地址。
其中,參數(shù)pmodulename則傳入組件的名稱。
其中,返回值hmodule則是組件的內(nèi)存起始地址。
第2步,讀取所述map文件中的所有函數(shù)的函數(shù)名稱、函數(shù)地址。
其中,所述所有函數(shù)的函數(shù)地址為各自相對于組件的函數(shù)地址。在map文件中會有所有函數(shù)的名稱及函數(shù)地址,通過讀取map文件的內(nèi)容則可以獲取到所有函數(shù)的名稱和函數(shù)地址。
第3步,將所述所有函數(shù)的函數(shù)地址各自相對于所述組件的函數(shù)地址分別和所述組件在內(nèi)存中的起始地址求和,獲得所述所有函數(shù)各自的內(nèi)存地址。其中,所述所有函數(shù)各自的內(nèi)存地址就是所述所有函數(shù)各自的函數(shù)頭。
第4步,利用所述鉤子函數(shù)庫對所述所有函數(shù)各自的內(nèi)存地址進(jìn)行監(jiān)控。
故而,在調(diào)用時,利用所述鉤子函數(shù)庫監(jiān)控所述所有函數(shù)從各自的內(nèi)存地址調(diào)用的調(diào)用次數(shù)和調(diào)用時刻。
步驟12,利用所述鉤子函數(shù)庫監(jiān)控統(tǒng)計所述map文件中的所有函數(shù)的函數(shù)尾各自的調(diào)用時刻。
在具體的實施過程中,利用所述鉤子函數(shù)庫監(jiān)控統(tǒng)計所述map文件中的所有函數(shù)的函數(shù)尾各自的調(diào)用時刻,包括:讀取所述所有函數(shù)的函數(shù)名稱、函數(shù)地址、函數(shù)長度;
將所述所有函數(shù)各自的函數(shù)地址和函數(shù)長度求和,獲得所述所有函數(shù)各自的尾地址;
利用所述鉤子函數(shù)庫對所述所有函數(shù)各自的尾地址進(jìn)行監(jiān)控,獲得所述所有函數(shù)各自的尾地址的調(diào)用時刻。
步驟13,基于所述map文件中的所述所有函數(shù)的函數(shù)頭各自的調(diào)用時刻以及所述所有函數(shù)的函數(shù)尾各自的調(diào)用時刻,確定出所述所有函數(shù)在所述預(yù)設(shè)時間內(nèi)的調(diào)用時間。
在對map中的所有函數(shù)的函數(shù)頭和函數(shù)尾進(jìn)行監(jiān)控后,并且在函數(shù)頭有計算每個函數(shù)頭的調(diào)用次數(shù)統(tǒng)計,并且在函數(shù)頭和函數(shù)尾都有記錄當(dāng)前調(diào)用的時刻,通過對同一個函數(shù)的這2個時刻則可以計算出該函數(shù)執(zhí)行一次的時間。所以可以統(tǒng)計軟件在一段時間內(nèi)所有函數(shù)的執(zhí)行次數(shù)以及執(zhí)行時間,并且可以將統(tǒng)計結(jié)果輸出成文本的形式,從而可以方便的定位軟件的性能瓶頸等問題。
基于同一發(fā)明構(gòu)思,本發(fā)明還公開了一種統(tǒng)計應(yīng)用程序中的函數(shù)調(diào)用的組件,所述組件注入在所述應(yīng)用程序的進(jìn)程中,用以對所述應(yīng)用程序中的所有函數(shù)的調(diào)用時間和調(diào)用次數(shù)進(jìn)行監(jiān)控。
參看圖2,本發(fā)明還公開的一種統(tǒng)計應(yīng)用程序中的函數(shù)調(diào)用的組件,包括:
第一監(jiān)控模塊21,用于在所述應(yīng)用程序運行時,利用所述組件中的鉤子函數(shù)庫監(jiān)控統(tǒng)計調(diào)用信息文件map文件中的所有函數(shù)的函數(shù)頭在預(yù)設(shè)時間內(nèi)各自的調(diào)用次數(shù),和所述所有函數(shù)的函數(shù)頭各自的調(diào)用時刻;其中,所述組件注入所述應(yīng)用程序的進(jìn)程中;
第二監(jiān)控模塊22,用于利用所述鉤子函數(shù)庫監(jiān)控統(tǒng)計所述map文件中的所有函數(shù)的函數(shù)尾各自的調(diào)用時刻;
確定模塊23,用于基于所述map文件中的所述所有函數(shù)的函數(shù)頭各自的調(diào)用時刻以及所述所有函數(shù)的函數(shù)尾各自的調(diào)用時刻,確定出所述所有函數(shù)在所述預(yù)設(shè)時間內(nèi)的調(diào)用時間。
作為一種可選的實施例,所述map文件中至少記錄了所述所有函數(shù)的函數(shù)名稱、函數(shù)地址,函數(shù)長度、所有的全局變量、全局變量名的地址。
作為一種可選的實施例,所述組件還包括:
第三監(jiān)控模塊,用于利用所述鉤子函數(shù)庫的鉤子函數(shù)監(jiān)控所述所有函數(shù)的函數(shù)頭。
作為一種可選的實施例,所述第三監(jiān)控模塊,包括:
獲取模塊,用于獲取所述組件在終端設(shè)備的內(nèi)存中的起始地址;
讀取模塊,用于讀取所述map文件中的所有函數(shù)的函數(shù)名稱、函數(shù)地址;其中,所述所有函數(shù)的函數(shù)地址為各自相對于所述組件的函數(shù)地址;
獲得模塊,用于將所述所有函數(shù)的函數(shù)地址各自相對于所述組件的函數(shù)地址分別和所述組件在內(nèi)存中的起始地址求和,獲得所述所有函數(shù)各自的內(nèi)存地址;所述所有函數(shù)各自的內(nèi)存地址就是所述所有函數(shù)各自的函數(shù)頭;
監(jiān)控子模塊,用于利用所述鉤子函數(shù)庫對所述所有函數(shù)各自的內(nèi)存地址進(jìn)行監(jiān)控。
本文提供了一種統(tǒng)計應(yīng)用程序中的函數(shù)調(diào)用的方法及組件,來對已經(jīng)發(fā)布的客戶端軟件來統(tǒng)計每個函數(shù)的調(diào)用次數(shù)及每個函數(shù)的調(diào)用時間統(tǒng)計。從而無需在軟件開發(fā)的時候加入函數(shù)統(tǒng)計的功能。對于已經(jīng)發(fā)布的軟件通過使用本文的方法也可以進(jìn)行統(tǒng)計函數(shù)的調(diào)用次數(shù)及時間功能。
通過本發(fā)明的一個或者多個實施例,本發(fā)明具有以下有益效果或者優(yōu)點:
本發(fā)明公開了一種統(tǒng)計應(yīng)用程序中的函數(shù)調(diào)用的方法,為了避免發(fā)布之后的應(yīng)用程序無法監(jiān)控其函數(shù)調(diào)用情況,所述方法應(yīng)用在統(tǒng)計應(yīng)用程序中的函數(shù)調(diào)用的組件中,用以監(jiān)控應(yīng)用程序的函數(shù)調(diào)用情況。在該應(yīng)用程序運行時,利用所述組件中的鉤子函數(shù)庫監(jiān)控統(tǒng)計調(diào)用信息文件map文件中的所有函數(shù)的函數(shù)頭在預(yù)設(shè)時間內(nèi)各自的調(diào)用次數(shù),和所有函數(shù)的函數(shù)頭各自的調(diào)用時刻;然后利用所述鉤子函數(shù)庫監(jiān)控統(tǒng)計所述map文件中的所有函數(shù)的函數(shù)尾各自的調(diào)用時刻;基于所述map文件中的所述所有函數(shù)的函數(shù)頭各自的調(diào)用時刻以及所述所有函數(shù)的函數(shù)尾各自的調(diào)用時刻,確定出所述所有函數(shù)在所述預(yù)設(shè)時間內(nèi)的調(diào)用時間。進(jìn)而,本發(fā)明可以在應(yīng)用程序運行時,實時統(tǒng)計函數(shù)的調(diào)用情況。
盡管已描述了本申請的優(yōu)選實施例,但本領(lǐng)域內(nèi)的普通技術(shù)人員一旦得知了基本創(chuàng)造性概念,則可對這些實施例作出另外的變更和修改。所以,所附權(quán)利要求意欲解釋為包括優(yōu)選實施例以及落入本申請范圍的所有變更和修改。
顯然,本領(lǐng)域的技術(shù)人員可以對本申請進(jìn)行各種改動和變型而不脫離本申請的精神和范圍。這樣,倘若本申請的這些修改和變型屬于本申請權(quán)利要求及其等同技術(shù)的范圍之內(nèi),則本申請也意圖包含這些改動和變型在內(nèi)。