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