本發(fā)明涉及計(jì)算機(jī)領(lǐng)域,尤其涉及一種熱點(diǎn)函數(shù)確定的方法及相關(guān)設(shè)備。
背景技術(shù):
:程序是由一個(gè)個(gè)函數(shù)構(gòu)成的,當(dāng)終端(例如,計(jì)算機(jī),手機(jī)等)在運(yùn)行程序的過(guò)程中,程序中的函數(shù)執(zhí)行次數(shù)是不同的,而且有可能不同的函數(shù)執(zhí)行的次數(shù)千差萬(wàn)別,以游戲程序?yàn)槔?,在游戲中那些?zhí)行次數(shù)非常多的函數(shù)的執(zhí)行效率嚴(yán)重影響整個(gè)游戲的執(zhí)行性能。傳統(tǒng)的方法中,測(cè)試人員通過(guò)手動(dòng)方式對(duì)關(guān)注的函數(shù)進(jìn)行執(zhí)行情況分析,需要確定函數(shù)原型并且需要針對(duì)目標(biāo)函數(shù)編寫對(duì)應(yīng)的代碼,如果關(guān)注的函數(shù)發(fā)生變化或關(guān)注的函數(shù)增加了,都需要重新編碼來(lái)獲取信息。需要花費(fèi)很大的人力成本。并且僅僅可以獲取關(guān)注的函數(shù)的執(zhí)行次數(shù),無(wú)法確定該函數(shù)是否是熱點(diǎn)函數(shù)。技術(shù)實(shí)現(xiàn)要素:本發(fā)明實(shí)施例提供了一種熱點(diǎn)函數(shù)確定的方法及相關(guān)設(shè)備。第一方面,本發(fā)明實(shí)施例提供了一種熱點(diǎn)函數(shù)確定的方法,包括:終端獲取目標(biāo)程序中的程序數(shù)據(jù)庫(kù)文件PDB文件;所述終端對(duì)所述目標(biāo)程序中的PDB文件進(jìn)行解析,得到所述目標(biāo)程序中全部函數(shù)及所述全部函數(shù)對(duì)應(yīng)的函數(shù)信息集合,所述函數(shù)信息集合包括各函數(shù)的標(biāo)識(shí);所述終端將所述各函數(shù)的標(biāo)識(shí)存儲(chǔ)至預(yù)置的存儲(chǔ)區(qū);當(dāng)所述終端執(zhí)行所述目標(biāo)程序時(shí),每當(dāng)執(zhí)行到任一第一函數(shù)時(shí),跳轉(zhuǎn)到與所述任一第一函數(shù)的標(biāo)識(shí)所對(duì)應(yīng)的存儲(chǔ)區(qū),對(duì)所述任一第一函數(shù)的被執(zhí)行的次數(shù)加1;所述終端根據(jù)所述存儲(chǔ)區(qū)中的各函數(shù)的執(zhí)行次數(shù)的記錄信息,確定所述目標(biāo)程序中的熱點(diǎn)函數(shù)。第二方面,本發(fā)明實(shí)施例提供了一種熱點(diǎn)函數(shù)確定的方法,包括:服務(wù)器接收終端發(fā)送的目標(biāo)程序中的程序數(shù)據(jù)庫(kù)文件PDB文件;所述服務(wù)器對(duì)所述PDB文件進(jìn)行解析,得到所述目標(biāo)程序中的全部函數(shù);所述服務(wù)器確定所述全部函數(shù)中的各第一函數(shù),所述各第一函數(shù)為與執(zhí)行次數(shù)具有跳轉(zhuǎn)關(guān)系的函數(shù);所述服務(wù)器通過(guò)hook將函數(shù)記錄操作注入到所述第一函數(shù)里生成測(cè)試工具包;所述服務(wù)器將所述測(cè)試工具包發(fā)送給所述終端,以使所述終端根據(jù)所述測(cè)試工具包對(duì)所述目標(biāo)程序中的全部函數(shù)的執(zhí)行次數(shù)進(jìn)行測(cè)試,以確定所述目標(biāo)程序中的熱點(diǎn)函數(shù)。第三方面,本發(fā)明實(shí)施例提供了一種終端,包括:獲取模塊,用于獲取目標(biāo)程序中的程序數(shù)據(jù)庫(kù)文件PDB文件;解析模塊,用于對(duì)所述獲取模塊獲取的所述目標(biāo)程序中的PDB文件進(jìn)行解析,得到所述目標(biāo)程序中全部函數(shù)及所述全部函數(shù)對(duì)應(yīng)的函數(shù)信息集合,所述函數(shù)信息集合包括各函數(shù)的標(biāo)識(shí),所述PDB文件還用于確定所述全部函數(shù)中的各第一函數(shù),所述各第一函數(shù)為被hook后與執(zhí)行次數(shù)具有跳轉(zhuǎn)關(guān)系的函數(shù);存儲(chǔ)模塊,用于將所述各函數(shù)的標(biāo)識(shí)存儲(chǔ)至預(yù)置的存儲(chǔ)區(qū);執(zhí)行模塊,用于當(dāng)執(zhí)行所述目標(biāo)程序時(shí),每當(dāng)執(zhí)行到任一第一函數(shù)時(shí),跳轉(zhuǎn)到與所述確定模塊確定的所述任一第一函數(shù)的所述存儲(chǔ)模塊存儲(chǔ)的標(biāo)識(shí)所對(duì)應(yīng)的存儲(chǔ)區(qū),對(duì)所述任一第一函數(shù)的被執(zhí)行的次數(shù)加1;第一確定模塊,用于根據(jù)所述存儲(chǔ)區(qū)中的所述執(zhí)行模塊執(zhí)行的各函數(shù)的執(zhí)行次數(shù)的記錄信息,確定所述目標(biāo)程序中的熱點(diǎn)函數(shù)。第四方面,本發(fā)明提供了一種服務(wù)器,包括:接收模塊,用于接收終端發(fā)送的目標(biāo)程序中的程序數(shù)據(jù)庫(kù)文件PDB文件;解析模塊,用于對(duì)所述接收模塊接收的所述PDB文件進(jìn)行解析,得到所述目標(biāo)程序中的全部函數(shù);確定模塊,用于確定所述解析模塊解析的所述全部函數(shù)中的各第一函數(shù),所述各第一函數(shù)為與執(zhí)行次數(shù)具有跳轉(zhuǎn)關(guān)系的函數(shù);工具包生成模塊,用于通過(guò)hook將函數(shù)記錄操作注入到所述確定模塊確定的所述第一函數(shù)里生成測(cè)試工具包;發(fā)送模塊,用于將所述工具包生成模塊生成的所述測(cè)試工具包發(fā)送給所述終端,以使所述終端根據(jù)所述測(cè)試工具包對(duì)所述目標(biāo)程序中的全部函數(shù)的執(zhí)行次數(shù)進(jìn)行測(cè)試,以確定所述目標(biāo)程序中的熱點(diǎn)函數(shù)。從以上技術(shù)方案可以看出,本發(fā)明實(shí)施例具有以下優(yōu)點(diǎn):本發(fā)明實(shí)施例中,在解析出目標(biāo)程序中的全部函數(shù)后,使用hook技術(shù)將函數(shù)記錄操作注入到全部函數(shù)里,在目標(biāo)程序運(yùn)行的過(guò)程中,同步記錄目標(biāo)程序中各函數(shù)的被執(zhí)行次數(shù),不影響目標(biāo)程序的運(yùn)行。當(dāng)目標(biāo)程序結(jié)束后,生成各函數(shù)的被執(zhí)行次數(shù)的記錄信息,根據(jù)該記錄信息中記錄的各函數(shù)的被執(zhí)行的次數(shù),確定出目標(biāo)程序中的熱點(diǎn)函數(shù)。從而使得后續(xù)可以根據(jù)這些熱點(diǎn)函數(shù)對(duì)目標(biāo)程序進(jìn)行有目的的優(yōu)化,可以提升目標(biāo)程序的性能。附圖說(shuō)明圖1為本發(fā)明實(shí)施例中的通信系統(tǒng)的架構(gòu)示意圖;圖2為本發(fā)明實(shí)施例中的一種熱點(diǎn)函數(shù)確定的方法的一個(gè)實(shí)施例示意圖;圖3為本發(fā)明實(shí)施例中的函數(shù)信息的示意圖;圖4為本發(fā)明實(shí)施例中的工具圖形界面的示意圖;圖5為本發(fā)明實(shí)施例中的測(cè)試工具包包括的文件的示意圖;圖6為本發(fā)明實(shí)施例中的代碼片段的示意圖;圖7為本發(fā)明實(shí)施例中的統(tǒng)計(jì)函數(shù)被執(zhí)行次數(shù)的原理示意圖;圖8為本發(fā)明實(shí)施例中的終端展示熱點(diǎn)函數(shù)的展示界面示意圖;圖9為本發(fā)明實(shí)施例中的一種熱點(diǎn)函數(shù)確定的方法的另一個(gè)實(shí)施例示意圖;圖10為本發(fā)明實(shí)施例中的一種終端的一個(gè)實(shí)施例的結(jié)構(gòu)示意圖;圖11為本發(fā)明實(shí)施例中的一種終端的另一個(gè)實(shí)施例的結(jié)構(gòu)示意圖;圖12為本發(fā)明實(shí)施例中的一種終端的另一個(gè)實(shí)施例的結(jié)構(gòu)示意圖;圖13為本發(fā)明實(shí)施例中的一種終端的另一個(gè)實(shí)施例的結(jié)構(gòu)示意圖;圖14為本發(fā)明實(shí)施例中的一種服務(wù)器的一個(gè)實(shí)施例的結(jié)構(gòu)示意圖;圖15為本發(fā)明實(shí)施例中的一種服務(wù)器的另一個(gè)實(shí)施例的結(jié)構(gòu)示意圖;圖16為本發(fā)明實(shí)施例中的一種服務(wù)器的另一個(gè)實(shí)施例的結(jié)構(gòu)示意圖;圖17為本發(fā)明實(shí)施例中的一種服務(wù)器的另一個(gè)實(shí)施例的結(jié)構(gòu)示意圖。具體實(shí)施方式本發(fā)明實(shí)施例提供了一種熱點(diǎn)函數(shù)確定的方法,用于確定目標(biāo)程序中的熱點(diǎn)函數(shù)。從而使得后續(xù)可以根據(jù)這些熱點(diǎn)函數(shù)對(duì)目標(biāo)程序進(jìn)行有目的的優(yōu)化,可以提升目標(biāo)程序的性能。為了使本
技術(shù)領(lǐng)域:
的人員更好地理解本發(fā)明方案,下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分的實(shí)施例,而不是全部的實(shí)施例。基于本發(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒(méi)有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都應(yīng)當(dāng)屬于本發(fā)明保護(hù)的范圍。本發(fā)明的說(shuō)明書和權(quán)利要求書及上述附圖中的術(shù)語(yǔ)“第一”、“第二”、“第三”“第四”等(如果存在)是用于區(qū)別類似的對(duì)象,而不必用于描述特定的順序或先后次序。應(yīng)該理解這樣使用的數(shù)據(jù)在適當(dāng)情況下可以互換,以便這里描述的實(shí)施例能夠以除了在這里圖示或描述的內(nèi)容以外的順序?qū)嵤4送?,術(shù)語(yǔ)“包括”和“具有”以及他們的任何變形,意圖在于覆蓋不排他的包含,例如,包含了一系列步驟或單元的過(guò)程、方法、系統(tǒng)、產(chǎn)品或設(shè)備不必限于清楚地列出的那些步驟或單元,而是可包括沒(méi)有清楚地列出的或?qū)τ谶@些過(guò)程、方法、產(chǎn)品或設(shè)備固有的其它步驟或單元。為了方便理解,首先對(duì)本發(fā)明實(shí)施例中設(shè)計(jì)的詞語(yǔ)進(jìn)行解釋說(shuō)明:PDB文件:是使用微軟提供的集成開(kāi)發(fā)環(huán)境軟件(MicrosoftVisualstudio,VS)生成的用于調(diào)試的符號(hào)文件(programdatabase),保存著調(diào)試信息。熱點(diǎn)函數(shù):一個(gè)程序在運(yùn)行過(guò)程中,會(huì)執(zhí)行很多的函數(shù),而執(zhí)行次數(shù)最多的那些函數(shù)被稱為熱點(diǎn)函數(shù)。在一個(gè)程序中可以將各函數(shù)的被執(zhí)行次數(shù)按照從大到小的順序進(jìn)行排序,位于第N個(gè)位次之前的函數(shù)為熱點(diǎn)函數(shù),N為大于等于2的正整數(shù)。例如N為10,則按照被執(zhí)行次數(shù)進(jìn)行排序,前9個(gè)函數(shù)為該程序中的熱點(diǎn)函數(shù)。因?yàn)闊狳c(diǎn)函數(shù)被執(zhí)行的次數(shù)多,所以這些函數(shù)的執(zhí)行效率對(duì)程序的整體執(zhí)行性能影響很大。函數(shù)hook技術(shù):一種對(duì)目標(biāo)函數(shù)進(jìn)行hook,用于改變函數(shù)執(zhí)行結(jié)果或獲取想要信息的技術(shù)。使用這種技術(shù)可以改變或增加一個(gè)函數(shù)的原有功能?;痉椒ㄊ钦业叫枰薷牡暮瘮?shù)入口點(diǎn),改變它的地址指向新的自定義函數(shù)。其中,Inlinehook技術(shù)是函數(shù)hook技術(shù)的一種,Inlinehook技術(shù)可以理解為:通過(guò)函數(shù)頭部的代碼來(lái)使改變后的代碼跳轉(zhuǎn)到預(yù)設(shè)的函數(shù)里。DLL:DLL(DynamicLinkLibrary)文件是動(dòng)態(tài)鏈接庫(kù)文件,是軟件文件類型。在系統(tǒng)中,許多應(yīng)用程序并不是一個(gè)完整的可執(zhí)行文件,它們被分割成一些相對(duì)獨(dú)立的動(dòng)態(tài)鏈接庫(kù),即DLL文件。當(dāng)執(zhí)行某一個(gè)程序時(shí),相應(yīng)的DLL文件就會(huì)被調(diào)用,每個(gè)DLL實(shí)現(xiàn)不同的軟件功能。測(cè)試人員可以編寫新的DLL文件并讓目標(biāo)程序加載執(zhí)行。上面對(duì)本發(fā)明實(shí)施例中涉及的詞語(yǔ)進(jìn)行了解釋,下面對(duì)本發(fā)明提供的一種熱點(diǎn)函數(shù)確定的方法的一個(gè)實(shí)施例進(jìn)行說(shuō)明。該方法可以應(yīng)用于一種測(cè)試系統(tǒng),該測(cè)試系統(tǒng)包括服務(wù)器110和終端120,該終端可以為包括手機(jī)、電腦、PDA(PersonalDigitalAssistant,個(gè)人數(shù)字助理)等,本發(fā)明實(shí)施例中,該終端可以以電腦為例進(jìn)行說(shuō)明。請(qǐng)參閱圖1所示,圖1為通信系統(tǒng)的架構(gòu)示意圖,終端120用于獲取目標(biāo)程序中的程序數(shù)據(jù)庫(kù)文件PDB文件。終端120獲取PDB文件,并將所述PDB文件發(fā)送給服務(wù)器。需要說(shuō)明的是,本發(fā)明實(shí)施例中的目標(biāo)程序可以為一個(gè)游戲程序(例如,自由足球游戲、歡樂(lè)農(nóng)場(chǎng)、龍之崛起等等),也可以為社交應(yīng)用程序(QQ,263等),或者,也可以為軟件管理類程序(QQ管家等)。本發(fā)明實(shí)施例中,該目標(biāo)程序可以為游戲程序?yàn)槔M(jìn)行說(shuō)明,而在具體的實(shí)際應(yīng)用中,本發(fā)明中對(duì)于目標(biāo)程序并不限定。終端120對(duì)所述目標(biāo)程序中的PDB文件進(jìn)行解析,得到所述目標(biāo)程序中全部函數(shù)及所述全部函數(shù)對(duì)應(yīng)的函數(shù)信息集合,所述函數(shù)信息集合包括各函數(shù)的標(biāo)識(shí),將所述各函數(shù)的標(biāo)識(shí)存儲(chǔ)至預(yù)置的存儲(chǔ)區(qū)。服務(wù)器110用于生成測(cè)試工具包。服務(wù)器110接收到終端發(fā)送的目標(biāo)程序中的PDB文件,對(duì)PDB文件進(jìn)行解析,得到所述目標(biāo)程序中的全部函數(shù);確定所述全部函數(shù)中的各第一函數(shù),所述各第一函數(shù)為與執(zhí)行次數(shù)具有跳轉(zhuǎn)關(guān)系的函數(shù);通過(guò)hook將函數(shù)記錄操作注入到所述第一函數(shù)里生成測(cè)試工具包,并將該測(cè)試工具包發(fā)送給終端120。終端120還用于通過(guò)測(cè)試工具包對(duì)目標(biāo)程序中的函數(shù)的執(zhí)行次數(shù)進(jìn)行測(cè)試。終端120接收到該測(cè)試工具包后,加載該測(cè)試工具包,當(dāng)終端120在執(zhí)行目標(biāo)程序的同時(shí)對(duì)目標(biāo)程序中的各函數(shù)的執(zhí)行次數(shù)進(jìn)行測(cè)試:當(dāng)執(zhí)行所述目標(biāo)程序時(shí),每當(dāng)執(zhí)行到任一第一函數(shù)時(shí),跳轉(zhuǎn)到與所述任一第一函數(shù)的標(biāo)識(shí)所對(duì)應(yīng)的存儲(chǔ)區(qū),對(duì)所述任一第一函數(shù)的被執(zhí)行的次數(shù)加1,通過(guò)對(duì)各第一函數(shù)被執(zhí)行的次數(shù)的記錄,得到各函數(shù)的執(zhí)行次數(shù)的記錄信息。服務(wù)器110用于根據(jù)記錄信息,確定所述目標(biāo)程序中的熱點(diǎn)函數(shù)?;蛘撸K端120也可以根據(jù)記錄信息,確定所述目標(biāo)程序中的熱點(diǎn)函數(shù),在實(shí)際的部署中,由服務(wù)器110確定熱點(diǎn)函數(shù)或者由終端120確定熱點(diǎn)函數(shù)本發(fā)明并不限定。請(qǐng)參閱圖2所示,圖2為本發(fā)明實(shí)施例中提供的一種熱點(diǎn)函數(shù)確定的方法的一個(gè)實(shí)施例的步驟流程示意圖,下面對(duì)該方法提供的一個(gè)實(shí)施例進(jìn)行詳細(xì)描述:步驟201、終端獲取目標(biāo)程序中的程序數(shù)據(jù)庫(kù)文件PDB文件。本發(fā)明實(shí)施例中,目標(biāo)程序以自由足球游戲?yàn)槔M(jìn)行說(shuō)明,終端獲取目標(biāo)程序中的程序數(shù)據(jù)庫(kù)文件PDB文件??蛇x的,終端還可以進(jìn)一步獲取目標(biāo)程序中的DLL文件。步驟202、終端對(duì)目標(biāo)程序的PDB文件進(jìn)行解析,得到目標(biāo)程序中全部函數(shù)及全部函數(shù)對(duì)應(yīng)的函數(shù)信息集合,函數(shù)信息集合包括各函數(shù)的標(biāo)識(shí)。終端使用腳本程序?qū)DB文件進(jìn)行解析,解析出游戲中全部函數(shù)及全部函數(shù)對(duì)應(yīng)的函數(shù)信息集合,請(qǐng)結(jié)合圖3進(jìn)行理解,圖3為函數(shù)信息的示意圖。該函數(shù)信息集合包括各函數(shù)的標(biāo)識(shí),偏移地址、函數(shù)大小等信息,其中函數(shù)的標(biāo)識(shí)包括函數(shù)名稱和函數(shù)的索引編號(hào)。步驟203、終端將各函數(shù)的標(biāo)識(shí)存儲(chǔ)至預(yù)置的存儲(chǔ)區(qū)。該預(yù)置的存儲(chǔ)區(qū)可以為預(yù)先設(shè)置的共享內(nèi)存,將各函數(shù)的標(biāo)識(shí)可以為函數(shù)名稱,也可以是函數(shù)的索引編號(hào),在一種優(yōu)選的方案中,為了減少存儲(chǔ)區(qū)的資源占用量,在存儲(chǔ)區(qū)中存儲(chǔ)的各函數(shù)的標(biāo)識(shí)可以為各函數(shù)的索引編號(hào)。步驟204、終端將獲取的目標(biāo)程序的PDB文件發(fā)送至服務(wù)器。終端將獲取的該游戲的PDB文件發(fā)送至服務(wù)器,可選的,終端可以將該目標(biāo)程序?qū)?yīng)的PDB文件和DLL文件發(fā)送至服務(wù)器。步驟205、服務(wù)器對(duì)PDB文件進(jìn)行解析,得到目標(biāo)程序中的全部函數(shù)。服務(wù)器解析PDB文件,服務(wù)器解析出PDB文件中全部函數(shù)及全部函數(shù)對(duì)應(yīng)的函數(shù)信息集合,請(qǐng)結(jié)合圖3進(jìn)行理解,該函數(shù)信息集合包括各函數(shù)的名稱、偏移地址、大小與索引編號(hào)等信息。在一種可能的實(shí)現(xiàn)方式中,為了方便后續(xù)調(diào)用這些函數(shù)信息,該函數(shù)信息集合可以被保存到數(shù)據(jù)庫(kù)。步驟206、服務(wù)器確定全部函數(shù)中的各第一函數(shù)。首先,全部函數(shù)可能包括第一函數(shù)和第二函數(shù),其中,第一函數(shù)為能被hook的函數(shù),第二函數(shù)為不能被hook的函數(shù),而且第一函數(shù)為在全部函數(shù)中除了第二函數(shù)之外的函數(shù)。其次,在一種可能的實(shí)現(xiàn)的方式中,該全部函數(shù)為均能被hook的函數(shù),也就是說(shuō)全部函數(shù)的數(shù)量與第一函數(shù)的數(shù)量相同。全部函數(shù)中不包括第二函數(shù)。服務(wù)器可以生成第一格式文件,例如,該第一格式文件可以為.flf文件(protobuf格式,一種用戶自定義的數(shù)據(jù)交換格式,獨(dú)立于語(yǔ)言與平臺(tái))。服務(wù)器將全部函數(shù)寫入第一格式文件。再次,在另一種可能的實(shí)現(xiàn)方式中,全部函數(shù)中包括第一函數(shù)和第二函數(shù),并不是所有的函數(shù)都能進(jìn)行hook操作,對(duì)不能hook的第二函數(shù)進(jìn)行hook會(huì)導(dǎo)致程序崩潰。所以需要找出程序中那些不能hook的第二函數(shù)并跳過(guò)對(duì)它們的inlinehook。進(jìn)而就需要解析DLL文件來(lái)確定不能被hook的第二函數(shù)。解析DLL文件確定不能被hook的第二函數(shù)的具體方法可以為:IDA工具可以反匯編二進(jìn)制程序獲取到函數(shù)的匯編指令。通過(guò)IDA工具對(duì)DLL文件進(jìn)行反匯編生成目標(biāo)格式文件。例如,該目標(biāo)格式文件可以為.asm格式文件。然后對(duì).asm文件里的匯編指令進(jìn)行分析處理,分析出不能被hook的地址,該地址也就是第二函數(shù)的地址,并將不能被hook的各第二函數(shù)保存到第二格式文件中。例如,該第二格式文件可以為.json文件。服務(wù)器確定出第二函數(shù)后,在全部函數(shù)中除了第二函數(shù)就可以確定出第一函數(shù)。需要說(shuō)明的是,服務(wù)器確定第二函數(shù)的具體方法可以為:函數(shù)頭部的預(yù)置字節(jié)內(nèi)(例如,5個(gè)字節(jié)內(nèi)),不包括跳轉(zhuǎn)指令;或者,函數(shù)體頭部小于預(yù)置字節(jié)(例如,5個(gè)字節(jié));或者,函數(shù)頭部不能被跳轉(zhuǎn)指令指向??梢岳斫獾氖?,服務(wù)器也可以直接出全部函數(shù)中的第一函數(shù),但是由于在全部函數(shù)中,第二函數(shù)的數(shù)量較少,通過(guò)確定出第二函數(shù)進(jìn)行確定第一函數(shù)的方式是一種優(yōu)選方式,能夠提高效率。將確定出的第一函數(shù)寫入第一格式文件。例如,該第一格式文件可以為.flf文件中。步驟207、服務(wù)器通過(guò)hook將函數(shù)記錄操作注入到第一函數(shù)里生成測(cè)試工具包。該工具包中包括兩類DLL文件、該第一格式文件和該第二格式文件:通過(guò)hook將函數(shù)記錄操作注入到第一函數(shù)里的具體實(shí)現(xiàn)需要包括兩類DLL文件:第一DLL文件(例如,QpAPI.dll):基于微軟Detours庫(kù)的基礎(chǔ),實(shí)現(xiàn)了可以對(duì)任意位置匯編代碼進(jìn)行InlineHook的方法,對(duì)外以函數(shù)的形式提供InlineHook功能。第二DLL文件(例如,QpPlugin.dll):通過(guò)注冊(cè)表方式注入到目標(biāo)進(jìn)程中,根據(jù)配置第一格式文件(.flf)和第二格式文件(.json)對(duì)目標(biāo)進(jìn)程中可執(zhí)行文件和DLL中的函數(shù)入口進(jìn)行inlinehook。inlinehook每次在函數(shù)執(zhí)行的頭部跳轉(zhuǎn)后,將函數(shù)執(zhí)次數(shù)加1,然后再跳轉(zhuǎn)回函數(shù)體繼續(xù)執(zhí)行函數(shù)代碼。第一函數(shù)為與其被執(zhí)行次數(shù)具有跳轉(zhuǎn)關(guān)系的函數(shù)。步驟208、服務(wù)器將測(cè)試工具包發(fā)送至終端。步驟209、終端接收服務(wù)器發(fā)送的測(cè)試工具包,加載該測(cè)試工具包,測(cè)試工具包用于對(duì)目標(biāo)程序中的全部函數(shù)的執(zhí)行次數(shù)進(jìn)行測(cè)試。終端接收服務(wù)器發(fā)送的測(cè)試工具包,請(qǐng)結(jié)合圖4進(jìn)行理解,圖4為終端加載測(cè)試工具包后,工具圖形界面的示意圖。加載該測(cè)試工具包后,終端顯示該工具圖形界面,例如,該工具圖形界面標(biāo)示了要測(cè)試的游戲名稱、游戲版本、測(cè)試任務(wù)等內(nèi)容。請(qǐng)結(jié)合圖5進(jìn)行理解,圖5為該測(cè)試工具包包括的文件的示意圖。其中圖界面工具在CC_Log_GUI文件夾里,測(cè)試工具包括中包括QpAPI.dll、QpPlugin.dll,.flf和.json文件。需要說(shuō)明的是,QpAPI.dll、QpPlugin.dll,.flf和.json的文件格式只是舉例說(shuō)明,并不對(duì)本發(fā)明中第一DLL文件、第二DLL文件,第一格式文件和第二格式文件的限定性說(shuō)明。步驟210、終端通過(guò)該測(cè)試工具包對(duì)目標(biāo)程序中第一函數(shù)的執(zhí)行次數(shù)進(jìn)行統(tǒng)計(jì),得到第一函數(shù)的執(zhí)行次數(shù)的記錄信息。工具包需要放置在目標(biāo)程序(例如,自由足球游戲)的同級(jí)目錄,否則啟動(dòng)工具時(shí)會(huì)有警告提示。終端接收了測(cè)試人員輸入的開(kāi)始測(cè)試的操作指令,終端提示開(kāi)始運(yùn)行該自由足球游戲的測(cè)試工作,并顯示所hook的函數(shù)數(shù)目。終端對(duì)目標(biāo)程序的具體的測(cè)試的過(guò)程請(qǐng)結(jié)合圖6和圖7所示,圖6為代碼片段的示意圖,圖7為統(tǒng)計(jì)函數(shù)被執(zhí)行次數(shù)的原理示意圖。針對(duì)圖6中所示的代碼片段,在一種可能的實(shí)現(xiàn)方式中,假設(shè)函數(shù)f1,f2,f3,f4這四個(gè)函數(shù)都是第一函數(shù),也就是說(shuō)這四個(gè)函數(shù)都是能被執(zhí)行hook的函數(shù)。從圖6所示的代碼片段中可以看出,函數(shù)執(zhí)行的流程是f1→f3→f4→f4。當(dāng)執(zhí)行函數(shù)f1時(shí),跳轉(zhuǎn)到與函數(shù)f1的索引編號(hào)對(duì)應(yīng)的存儲(chǔ)區(qū),將f1的被執(zhí)行次數(shù)加1,然后再跳轉(zhuǎn)回到函數(shù)f1繼續(xù)執(zhí)行流程;當(dāng)執(zhí)行函數(shù)f3時(shí),跳轉(zhuǎn)到與函數(shù)f3的索引編號(hào)對(duì)應(yīng)的存儲(chǔ)區(qū),將f3的被執(zhí)行次數(shù)加1,然后再跳轉(zhuǎn)回到函數(shù)f3繼續(xù)執(zhí)行流程;同理,函數(shù)f4被執(zhí)行一次,跳轉(zhuǎn)到與函數(shù)f4的索引編號(hào)對(duì)應(yīng)的存儲(chǔ)區(qū)將f4的被執(zhí)行次數(shù)加1,函數(shù)f4再被執(zhí)行一次,將f4的被執(zhí)行次數(shù)再加1。也就是說(shuō),在執(zhí)行f1→f3→f4→f4的過(guò)程中,函數(shù)f1的被執(zhí)行次數(shù)加1,函數(shù)f3的被執(zhí)行次數(shù)加1,函數(shù)f4的被執(zhí)行次數(shù)加2,由于函數(shù)f2沒(méi)有被執(zhí)行,則函數(shù)f2的被執(zhí)行次數(shù)不變。在另一種可能的實(shí)現(xiàn)方式中,假設(shè)在函數(shù)f1,f2,f3,f4中,函數(shù)f3是第一函數(shù),也就是說(shuō)函數(shù)f3時(shí)不能被hook的函數(shù),函數(shù)f1,f2和f4均為第一函數(shù),f1,f2和f4均是能被hook的函數(shù)。函數(shù)執(zhí)行的流程還是f1→f3→f4→f4。當(dāng)執(zhí)行函數(shù)f1時(shí),跳轉(zhuǎn)到與函數(shù)f1的索引編號(hào)對(duì)應(yīng)的存儲(chǔ)區(qū),將f1的被執(zhí)行次數(shù)加1,然后再跳轉(zhuǎn)回到函數(shù)f1繼續(xù)執(zhí)行流程;當(dāng)執(zhí)行函數(shù)f3時(shí),不會(huì)發(fā)生跳轉(zhuǎn),而是繼續(xù)執(zhí)行函數(shù)f4,當(dāng)執(zhí)行函數(shù)f4時(shí),跳轉(zhuǎn)到與函數(shù)f4的索引編號(hào)對(duì)應(yīng)的存儲(chǔ)區(qū),將f4的被執(zhí)行次數(shù)加1,然后再跳轉(zhuǎn)回到函數(shù)f4繼續(xù)執(zhí)行流程,繼續(xù)執(zhí)行函數(shù)f4,再跳轉(zhuǎn)到與函數(shù)f4的索引編號(hào)對(duì)應(yīng)的存儲(chǔ)區(qū),將f4的被執(zhí)行次數(shù)再加1。也就是說(shuō),在執(zhí)行f1→f3→f4→f4的過(guò)程中,函數(shù)f1的被執(zhí)行次數(shù)加1,函數(shù)f3的被執(zhí)行次不被統(tǒng)計(jì),函數(shù)f4的被執(zhí)行次數(shù)加2,由于函數(shù)f2沒(méi)有被執(zhí)行,則函數(shù)f2的被執(zhí)行次數(shù)不變。從上述例子可以看出,當(dāng)執(zhí)行目標(biāo)程序時(shí),每當(dāng)執(zhí)行到任一第一函數(shù)時(shí),跳轉(zhuǎn)到與任一第一函數(shù)的標(biāo)識(shí)所對(duì)應(yīng)的存儲(chǔ)區(qū),對(duì)任一第一函數(shù)的被執(zhí)行的次數(shù)加1。當(dāng)執(zhí)行目標(biāo)程序時(shí),每當(dāng)執(zhí)行到任一第二函數(shù)時(shí),則繼續(xù)執(zhí)行下一個(gè)待執(zhí)行的函數(shù)。終端根據(jù)存儲(chǔ)區(qū)中記錄的各函數(shù)的執(zhí)行次數(shù),得到各函數(shù)的被執(zhí)行次數(shù)的記錄信息。需要說(shuō)明的是,若目標(biāo)程序中全部函數(shù)均為第一函數(shù),則記錄信息中包括了全部函數(shù)的被執(zhí)行次數(shù)的信息。若目標(biāo)程序的全部函數(shù)中包括第一函數(shù)和第二函數(shù),在實(shí)際應(yīng)用中,第二函數(shù)的數(shù)量較少,則記錄信息中可以只包括第一函數(shù)的標(biāo)識(shí)及該第一函數(shù)被執(zhí)行次數(shù)?;蛘?,記錄信息中包括全部函數(shù)的被執(zhí)行次數(shù),各第二函數(shù)的標(biāo)識(shí)對(duì)應(yīng)的函數(shù)被執(zhí)行次數(shù)為“0”,各第一函數(shù)的被執(zhí)行次數(shù)的信息。步驟211、終端將各函數(shù)被執(zhí)行次數(shù)的記錄信息發(fā)送至服務(wù)器。終端將各函數(shù)被執(zhí)行次數(shù)的記錄信息寫入.bin格式的日志文件。該日志文件的格式(.bin格式)為舉例說(shuō)明,并非限定性說(shuō)明。終端可以將該日記文件發(fā)送至服務(wù)器。步驟212、服務(wù)器對(duì)記錄信息進(jìn)行分析,確定熱點(diǎn)函數(shù)。請(qǐng)結(jié)合下表1所示,下表1為為熱點(diǎn)函數(shù)的展示樣例表。服務(wù)器可以根據(jù)一個(gè)終端發(fā)送的記錄信息進(jìn)行分析,通過(guò)記錄信息中的函數(shù)的索引編號(hào)和解析出的PDB文件中的函數(shù)信息,確定各函數(shù)的函數(shù)名稱,得到各函數(shù)的執(zhí)行次數(shù),根據(jù)各函數(shù)的執(zhí)行次數(shù)按照?qǐng)?zhí)行次數(shù)的大小進(jìn)行排序,確定出目標(biāo)程序中的熱點(diǎn)函數(shù)。表1假設(shè)上表1中的11個(gè)函數(shù)為目標(biāo)程序中全部函數(shù)中按各函數(shù)被執(zhí)行次數(shù)從大到小的順序進(jìn)行排序,上述11個(gè)函數(shù)為第1位次到第11位次,那么上述表1中的11個(gè)函數(shù)為目標(biāo)程序中的熱點(diǎn)函數(shù)。需要說(shuō)明的是,上述表1中的各函數(shù)的名稱,及各函數(shù)被執(zhí)行的次數(shù)均為舉例說(shuō)明,并不造成對(duì)本發(fā)明的限定。需要說(shuō)明的是,一個(gè)目標(biāo)程序可以被多臺(tái)終端進(jìn)行測(cè)試,或者可以被多次測(cè)試,那么服務(wù)器可以接收到多個(gè)終端發(fā)送的針對(duì)該目標(biāo)程序的多個(gè)記錄信息,服務(wù)器根據(jù)多個(gè)記錄信息,對(duì)多個(gè)記錄信息中的各函數(shù)的對(duì)應(yīng)的執(zhí)行次數(shù)進(jìn)行累加,得到各函數(shù)的累加后的執(zhí)行次數(shù)。根據(jù)各函數(shù)的累加后的執(zhí)行次數(shù)確定目標(biāo)程序中的熱點(diǎn)函數(shù)。在另一可能的實(shí)現(xiàn)方式中,服務(wù)器根據(jù)多個(gè)記錄信息,對(duì)多個(gè)記錄信息中的各函數(shù)的對(duì)應(yīng)的執(zhí)行次數(shù)進(jìn)行平均計(jì)算,得到各函數(shù)的平均計(jì)算后的執(zhí)行次數(shù)。根據(jù)各函數(shù)的平均計(jì)算后的執(zhí)行次數(shù)確定目標(biāo)程序中的熱點(diǎn)函數(shù)。通過(guò)服務(wù)器確定熱點(diǎn)函數(shù)的一個(gè)應(yīng)用場(chǎng)景為:目標(biāo)程序?yàn)樽杂勺闱蛴螒?,多個(gè)測(cè)試人員或者多個(gè)用戶玩家啟動(dòng)游戲,終端在游戲運(yùn)行的過(guò)程中,邊記錄各函數(shù)的執(zhí)行次數(shù),針對(duì)不同的測(cè)試人員或者用戶,在一個(gè)目標(biāo)程序中對(duì)于同一個(gè)函數(shù)的執(zhí)行次數(shù)可能有所不同。例如,第一個(gè)用戶玩家可能是“帶球過(guò)人”的次數(shù)較多,而第二個(gè)用戶玩家可能是“傳球”的次數(shù)較多,第三個(gè)用戶玩家可能是“加速跑”的次數(shù)較多。因此服務(wù)器可以接收多個(gè)測(cè)試人員或用戶玩家的記錄信息,并對(duì)該自由足球游戲中的各函數(shù)的執(zhí)行次數(shù)進(jìn)行累加,或者將各函數(shù)的執(zhí)行次數(shù)進(jìn)行平均計(jì)算,確定熱點(diǎn)函數(shù)??梢砸苑?wù)器接收到3個(gè)記錄信息,每個(gè)記錄信息包括4個(gè)函數(shù),該4個(gè)函數(shù)分別為f1,f2,f3和f4:為例進(jìn)行說(shuō)明,請(qǐng)參閱下表2所示:表2函數(shù)名稱測(cè)試人員1測(cè)試人員2測(cè)試人員3平均次數(shù)累加次數(shù)f1700073007200736721500f2600063206300650718620f3500048005100506714900f4400045004500483313000從上表2所示,若熱點(diǎn)函數(shù)的選取數(shù)量為2個(gè),則熱點(diǎn)函數(shù)為f1和f2。需要說(shuō)明的是,上述表1中函數(shù)的名稱、各函數(shù)被執(zhí)行的次數(shù),及熱點(diǎn)函數(shù)選取的數(shù)量均為舉例說(shuō)明,并不造成對(duì)本發(fā)明的限定??蛇x的,服務(wù)器可以將該目標(biāo)程序的各函數(shù)的被執(zhí)行次數(shù)存儲(chǔ)至數(shù)據(jù)庫(kù),以備后續(xù)調(diào)用。步驟213、服務(wù)器將熱點(diǎn)函數(shù)的信息發(fā)送至終端。步驟213為可選步驟,可以不執(zhí)行。當(dāng)測(cè)試人員需要查看該目標(biāo)程序中的熱點(diǎn)函數(shù)的相關(guān)信息時(shí),終端可以向服務(wù)器發(fā)送用于獲取熱點(diǎn)函數(shù)的信息的請(qǐng)求,服務(wù)器將目標(biāo)程序的熱點(diǎn)函數(shù)信息發(fā)送至終端,終端展示熱點(diǎn)函數(shù)的信息,請(qǐng)結(jié)合圖8進(jìn)行理解,圖8為終端展示熱點(diǎn)函數(shù)的展示界面示意圖。測(cè)試人員可以點(diǎn)擊目標(biāo)程序?qū)?yīng)的一個(gè)DLL的熱點(diǎn)函數(shù)按鈕,就可以查看其中的熱點(diǎn)函數(shù)詳情。在另一種可能實(shí)現(xiàn)的方式中,服務(wù)器開(kāi)始分析PDB時(shí)就已經(jīng)把函數(shù)名稱與函數(shù)索引序號(hào)存入數(shù)據(jù)庫(kù),當(dāng)測(cè)試人員查看熱點(diǎn)函數(shù)詳情的時(shí)候,服務(wù)器會(huì)根據(jù)用戶請(qǐng)求將數(shù)據(jù)庫(kù)中的函數(shù)名稱數(shù)據(jù)和函數(shù)執(zhí)行次數(shù)信息結(jié)合起來(lái)以網(wǎng)頁(yè)的形式展示于終端。上述實(shí)施例中,是通過(guò)服務(wù)器對(duì)目標(biāo)程序的PDB文件進(jìn)行分析,并生成針對(duì)目標(biāo)程序的測(cè)試工具包,并向終端發(fā)送該測(cè)試工具包,終端加載該測(cè)試工具包后,對(duì)目標(biāo)程序中的各函數(shù)的被執(zhí)行次數(shù)進(jìn)行統(tǒng)計(jì)。例如,上述實(shí)施例適應(yīng)的場(chǎng)景為:例如,某公司開(kāi)發(fā)多項(xiàng)游戲,如,10項(xiàng)游戲,針對(duì)每一項(xiàng)游戲,生成一個(gè)用于統(tǒng)計(jì)函數(shù)被執(zhí)行次數(shù)的測(cè)試工具包,當(dāng)測(cè)試人員需要測(cè)試其中某一項(xiàng)游戲時(shí),終端接收用于下載測(cè)試工具包的下載指令,終端向服務(wù)器發(fā)送請(qǐng)求,服務(wù)器將該游戲?qū)?yīng)的測(cè)試工具包發(fā)送給終端,終端加載該測(cè)試工具包后,在該游戲運(yùn)行的過(guò)程中,記錄該游戲中各函數(shù)的執(zhí)行次數(shù)。本發(fā)明實(shí)施例中,在解析出目標(biāo)程序中的全部函數(shù)后,使用hook技術(shù)將函數(shù)記錄操作注入到全部函數(shù)里,在目標(biāo)程序運(yùn)行的過(guò)程中,同步記錄目標(biāo)程序中各函數(shù)的被執(zhí)行次數(shù),不影響目標(biāo)程序的運(yùn)行。當(dāng)目標(biāo)程序結(jié)束后,生成各函數(shù)的被執(zhí)行次數(shù)的記錄信息,根據(jù)該記錄信息中記錄的各函數(shù)的被執(zhí)行的次數(shù),確定出目標(biāo)程序中的熱點(diǎn)函數(shù)。從而使得后續(xù)可以根據(jù)這些熱點(diǎn)函數(shù)對(duì)目標(biāo)程序進(jìn)行有目的的優(yōu)化,可以提升目標(biāo)程序的性能。請(qǐng)參閱圖9所示,本發(fā)明實(shí)施例提供了一種熱點(diǎn)函數(shù)確定的方法的另一個(gè)實(shí)施例,該方法可以應(yīng)用于終端。步驟901、終端獲取目標(biāo)程序中的程序數(shù)據(jù)庫(kù)文件PDB文件。本步驟可以結(jié)合圖2對(duì)應(yīng)的實(shí)施例中的步驟201進(jìn)行理解,此處不贅述。步驟902、終端對(duì)目標(biāo)程序中的PDB文件進(jìn)行解析,得到目標(biāo)程序中全部函數(shù)及全部函數(shù)對(duì)應(yīng)的函數(shù)信息集合,函數(shù)信息集合包括各函數(shù)的標(biāo)識(shí)。本步驟可以結(jié)合圖2對(duì)應(yīng)的實(shí)施例中的步驟202進(jìn)行理解,此處不贅述。步驟903、終端確定全部函數(shù)中的各第一函數(shù),各第一函數(shù)為被hook后與執(zhí)行次數(shù)具有跳轉(zhuǎn)關(guān)系的函數(shù)。首先,全部函數(shù)可能包括第一函數(shù)和第二函數(shù),其中,第一函數(shù)為能被hook的函數(shù),第二函數(shù)為不能被hook的函數(shù),而且第一函數(shù)為在全部函數(shù)中除了第二函數(shù)之外的函數(shù)。其次,在一種可能的實(shí)現(xiàn)的方式中,該全部函數(shù)均能被hook的函數(shù),也就是說(shuō)全部函數(shù)的數(shù)量與第一函數(shù)的數(shù)量相同。全部函數(shù)中不包括第二函數(shù)。終端可以生成第一格式文件,例如,該第一格式文件可以為.flf文件(protobuf格式,一種用戶自定義的數(shù)據(jù)交換格式,獨(dú)立于語(yǔ)言與平臺(tái))。終端將全部函數(shù)寫入第一格式文件。再次,在另一種可能的實(shí)現(xiàn)方式中,全部函數(shù)中包括第一函數(shù)和第二函數(shù),并不是所有的函數(shù)都能進(jìn)行hook操作,對(duì)不能hook的函數(shù)進(jìn)行hook會(huì)導(dǎo)致程序崩潰。所以需要找出程序中那些不能hook的函數(shù)并跳過(guò)對(duì)它們的inlinehook。進(jìn)而就需要解析DLL文件來(lái)確定不能被hook的第二函數(shù)。解析DLL文件確定不能被hook的第二函數(shù)的具體方法可以為:IDA工具可以反匯編二進(jìn)制程序獲取到函數(shù)的匯編指令。通過(guò)IDA工具對(duì)DLL文件進(jìn)行反匯編生成目標(biāo)格式文件,例如,該目標(biāo)格式文件可以為.asm格式文件。然后對(duì).asm文件里的匯編指令進(jìn)行分析處理,分析出不能hook的地址,該地址也就是第二函數(shù)的地址,并將不能被hook的各第二函數(shù)保存到第二格式文件中,例如,該第二格式文件可以為.json文件。終端確定出第二函數(shù)后,在全部函數(shù)中除了第二函數(shù)就可以確定出第一函數(shù)。需要說(shuō)明的是,終端確定第二函數(shù)的具體方法可以為:函數(shù)頭部的預(yù)置字節(jié)內(nèi)(例如,5個(gè)字節(jié)內(nèi)),不包括跳轉(zhuǎn)指令;或者,函數(shù)體頭部小于預(yù)置字節(jié)(例如,5個(gè)字節(jié));或者,函數(shù)頭部不能被跳轉(zhuǎn)指令指向??梢岳斫獾氖牵K端也可以直接出全部函數(shù)中的第一函數(shù),但是由于在全部函數(shù)中,第二函數(shù)的數(shù)量較少,通過(guò)確定出第二函數(shù)進(jìn)行確定第一函數(shù)的方式是一種優(yōu)選方式,能夠提高效率。將確定出的第一函數(shù)寫入第一格式文件。例如,該第一格式文件可以為.flf文件中。對(duì)目標(biāo)格式文件進(jìn)行分析處理,分析出第二函數(shù)。第一函數(shù)能夠被hook,可以理解為:通過(guò)hook將函數(shù)記錄操作注入到第一函數(shù)里的具體實(shí)現(xiàn)需要包括兩類DLL文件:第一DLL文件(例如,QpAPI.dll):基于微軟Detours庫(kù)的基礎(chǔ),實(shí)現(xiàn)了可以對(duì)任意位置匯編代碼進(jìn)行InlineHook的方法,對(duì)外以函數(shù)的形式提供InlineHook功能。第二DLL文件(例如,QpPlugin.dll):通過(guò)注冊(cè)表方式注入到目標(biāo)進(jìn)程中,根據(jù)配置第一格式文件(.flf)和第二格式文件(.json)對(duì)目標(biāo)進(jìn)程中可執(zhí)行文件和DLL中的函數(shù)入口進(jìn)行inlinehook。inlinehook每次在函數(shù)執(zhí)行的頭部跳轉(zhuǎn)后,將函數(shù)執(zhí)次數(shù)加1,然后再跳轉(zhuǎn)回函數(shù)體繼續(xù)執(zhí)行函數(shù)代碼。第一函數(shù)為與其被執(zhí)行次數(shù)具有跳轉(zhuǎn)關(guān)系的函數(shù)。步驟904、終端將各函數(shù)的標(biāo)識(shí)存儲(chǔ)至預(yù)置的存儲(chǔ)區(qū)。該預(yù)置的存儲(chǔ)區(qū)可以為預(yù)先設(shè)置的共享內(nèi)存。本步驟請(qǐng)結(jié)合圖2對(duì)應(yīng)的實(shí)施例中的步驟203進(jìn)行理解,此處不贅述。需要說(shuō)明的是,步驟903和步驟904沒(méi)有時(shí)序上的限定,步驟1104也可以在步驟903之前。步驟901至步驟904為測(cè)試前準(zhǔn)備步驟,步驟905為對(duì)目標(biāo)程序開(kāi)始測(cè)試。步驟905、當(dāng)終端執(zhí)行目標(biāo)程序時(shí),每當(dāng)執(zhí)行到任一第一函數(shù)時(shí),跳轉(zhuǎn)到與任一第一函數(shù)的標(biāo)識(shí)所對(duì)應(yīng)的存儲(chǔ)區(qū),對(duì)任一第一函數(shù)的被執(zhí)行的次數(shù)加1;當(dāng)執(zhí)行目標(biāo)程序時(shí),每當(dāng)執(zhí)行到任一第二函數(shù)時(shí),則繼續(xù)執(zhí)行下一個(gè)待執(zhí)行的函數(shù)。本步驟可以結(jié)合圖2對(duì)應(yīng)的實(shí)施例中的步驟209進(jìn)行理解,此處不贅述。步驟906、根據(jù)存儲(chǔ)區(qū)中的各函數(shù)的執(zhí)行次數(shù)的記錄信息,確定目標(biāo)程序中的熱點(diǎn)函數(shù)。請(qǐng)結(jié)合表1進(jìn)行理解。終端可以根據(jù)一個(gè)終端發(fā)送的記錄信息進(jìn)行分析,通過(guò)記錄信息中的函數(shù)的索引編號(hào)和解析出的PDB文件中的函數(shù)信息,確定各函數(shù)的函數(shù)名稱,得到各函數(shù)的執(zhí)行次數(shù),根據(jù)各函數(shù)的執(zhí)行次數(shù)按照?qǐng)?zhí)行次數(shù)的大小進(jìn)行排序,確定出目標(biāo)程序中的熱點(diǎn)函數(shù)。本發(fā)明實(shí)施例中,通過(guò)終端對(duì)目標(biāo)程序的PDB文件進(jìn)行解析,得到PDB中的全部函數(shù),并確定出能被hook的第一函數(shù),通過(guò)hook技術(shù)將記錄操作注入到第一函數(shù)中,并在終端運(yùn)行目標(biāo)程序的同時(shí),記錄各函數(shù)的被執(zhí)行的次數(shù),從而確定出熱點(diǎn)函數(shù),從而使得后續(xù)可以根據(jù)這些熱點(diǎn)函數(shù)對(duì)目標(biāo)程序進(jìn)行有目的的優(yōu)化,可以提升目標(biāo)程序的性能。進(jìn)一步的,本發(fā)明實(shí)施中,測(cè)試前的準(zhǔn)備工作和測(cè)試工作均由終端離線完成,不需要通過(guò)網(wǎng)絡(luò)借助服務(wù)器,節(jié)省了網(wǎng)絡(luò)資源。請(qǐng)參閱圖10所示,本發(fā)明實(shí)施例中還提供了一種終端1000的一個(gè)實(shí)施例,該終端包括:獲取模塊1010,用于獲取目標(biāo)程序中的程序數(shù)據(jù)庫(kù)文件PDB文件;解析模塊1020,用于對(duì)獲取模塊1010獲取的目標(biāo)程序中的PDB文件進(jìn)行解析,得到目標(biāo)程序中全部函數(shù)及全部函數(shù)對(duì)應(yīng)的函數(shù)信息集合,函數(shù)信息集合包括各函數(shù)的標(biāo)識(shí),PDB文件還用于確定全部函數(shù)中的各第一函數(shù),各第一函數(shù)為被hook后與執(zhí)行次數(shù)具有跳轉(zhuǎn)關(guān)系的函數(shù);存儲(chǔ)模塊1030,用于將解析模塊1020解析出的各函數(shù)的標(biāo)識(shí)存儲(chǔ)至預(yù)置的存儲(chǔ)區(qū);執(zhí)行模塊1040,用于當(dāng)執(zhí)行目標(biāo)程序時(shí),每當(dāng)執(zhí)行到解析模塊1020解析出的任一第一函數(shù)時(shí),跳轉(zhuǎn)到與確定模塊確定的任一第一函數(shù)的存儲(chǔ)模塊1030存儲(chǔ)的標(biāo)識(shí)所對(duì)應(yīng)的存儲(chǔ)區(qū),對(duì)任一第一函數(shù)的被執(zhí)行的次數(shù)加1;第一確定模塊1050,用于根據(jù)存儲(chǔ)區(qū)中的執(zhí)行模塊1040執(zhí)行的各函數(shù)的執(zhí)行次數(shù)的記錄信息,確定目標(biāo)程序中的熱點(diǎn)函數(shù)。第一確定模塊1050還具體用于:獲取對(duì)目標(biāo)程序多次測(cè)試,得出的多個(gè)記錄信息;對(duì)多個(gè)記錄信息中的各函數(shù)的執(zhí)行次數(shù)進(jìn)行累加,得到各函數(shù)的累加后的執(zhí)行次數(shù);根據(jù)各函數(shù)的累加后的執(zhí)行次數(shù)確定目標(biāo)程序中的熱點(diǎn)函數(shù)。該終端還包括第二確定模塊1060;請(qǐng)參閱圖11所示,在圖10的基礎(chǔ)上,本發(fā)明實(shí)施例中還提供了一種終端1100的另一個(gè)實(shí)施例,還包括第二確定模塊1060;第二確定模塊1060,用于確定解析模塊1020解析的全部函數(shù)中的各第一函數(shù),各第一函數(shù)為與執(zhí)行次數(shù)具有跳轉(zhuǎn)關(guān)系的函數(shù)。第二確定模塊1060包括第一確定單元1061和第二確定單元1062;第一確定單元1061,用于確定全部函數(shù)中的各第二函數(shù),各第二函數(shù)為不能為hook的函數(shù);第二確定單元1062,用于根據(jù)第一確定單元1061確定的各第二函數(shù)確定各第一函數(shù),第一函數(shù)為全部函數(shù)中除第二函數(shù)之外的函數(shù),第一函數(shù)為能被hook的函數(shù)。在一種可能的實(shí)現(xiàn)方式中,第一確定單元1061還具體用于:獲取目標(biāo)程序的動(dòng)態(tài)鏈接庫(kù)DLL文件;通過(guò)IDA工具對(duì)DLL文件進(jìn)行反匯編生成目標(biāo)格式文件;對(duì)目標(biāo)格式文件進(jìn)行分析處理,分析出第二函數(shù)。執(zhí)行模塊1040,還用于當(dāng)執(zhí)行目標(biāo)程序時(shí),每當(dāng)執(zhí)行到任一第二函數(shù)時(shí),則繼續(xù)執(zhí)行下一個(gè)待執(zhí)行的函數(shù)。請(qǐng)參閱圖12所示,在圖10的基礎(chǔ)上,本發(fā)明中還提供了一種終端1200的另一個(gè)實(shí)施例,該終端還包括發(fā)送模塊1070和接收模塊1080;發(fā)送模塊1070,用于將獲取模塊1010獲取的PDB文件發(fā)送至服務(wù)器,PDB文件用于服務(wù)器生成測(cè)試工具包,測(cè)試工具包為通過(guò)hook將函數(shù)記錄操作注入到全部函數(shù)里而生成的執(zhí)行文件。接收模塊1080,用于接收測(cè)試工具包,測(cè)試工具包用于對(duì)目標(biāo)程序中的解析模塊1020解析出的全部函數(shù)的執(zhí)行次數(shù)進(jìn)行測(cè)試。進(jìn)一步的,圖10至圖12中的終端是以功能模塊的形式來(lái)呈現(xiàn)。這里的“模塊”可以指特定應(yīng)用集成電路(application-specificintegratedcircuit,ASIC),電路,執(zhí)行一個(gè)或多個(gè)軟件或固件程序的處理器和存儲(chǔ)器,集成邏輯電路,和/或其他可以提供上述功能的器件。在一個(gè)簡(jiǎn)單的實(shí)施例中,圖10至圖12中的終端可以采用圖13所示的形式。各模塊可以通過(guò)圖13所示的結(jié)構(gòu)來(lái)實(shí)現(xiàn)。終端包括:收發(fā)器1310、存儲(chǔ)器1320、輸入單元1330、顯示單元1340、音頻電路1360、處理器1380、以及電源1390等部件。本領(lǐng)域技術(shù)人員可以理解,圖13中示出的終端結(jié)構(gòu)并不構(gòu)成對(duì)終端的限定,可以包括比圖示更多或更少的部件,或者組合某些部件,或者不同的部件布置。收發(fā)器1310,用于接收信息的接收和發(fā)送,用于將所述獲取模塊獲取的所述PDB文件發(fā)送至服務(wù)器,所述PDB文件用于所述服務(wù)器生成測(cè)試工具包,所述測(cè)試工具包為通過(guò)hook將函數(shù)記錄操作注入到所述全部函數(shù)里而生成的執(zhí)行文件;還用于接收所述測(cè)試工具包,所述測(cè)試工具包用于對(duì)所述目標(biāo)程序中的全部函數(shù)的執(zhí)行次數(shù)進(jìn)行測(cè)試。存儲(chǔ)器1320可用于存儲(chǔ)軟件程序以及模塊,處理器1380通過(guò)運(yùn)行存儲(chǔ)在存儲(chǔ)器1320的軟件程序以及模塊,從而執(zhí)行終端的各種功能應(yīng)用以及數(shù)據(jù)處理。存儲(chǔ)器1320可主要包括存儲(chǔ)程序區(qū)和存儲(chǔ)數(shù)據(jù)區(qū),其中,存儲(chǔ)程序區(qū)可存儲(chǔ)操作系統(tǒng)、至少一個(gè)功能所需的應(yīng)用程序,存儲(chǔ)器存儲(chǔ)目標(biāo)程序,及PDB解析出的全部函數(shù)。還可以包括非易失性存儲(chǔ)器,例如至少一個(gè)磁盤存儲(chǔ)器件、閃存器件、或其他易失性固態(tài)存儲(chǔ)器件。輸入單元1330可用于接收輸入的數(shù)字或字符信息,以及產(chǎn)生與終端的用戶設(shè)置以及功能控制有關(guān)的鍵信號(hào)輸入。具體地,輸入單元1330可包括觸控面板1331以及其他輸入設(shè)備1332。其他輸入設(shè)備1332可以包括但不限于物理鍵盤、鼠標(biāo)、操作桿等中的一種或多種。顯示單元1340可用于顯示由用戶輸入的信息或提供給用戶的信息以及終端的各種菜單。顯示單元1340可包括顯示面板1341,可選的,可以采用液晶顯示器(LiquidCrystalDisplay,LCD)、有機(jī)發(fā)光二極管(OrganicLight-EmittingDiode,OLED)等形式來(lái)配置顯示面板1341。進(jìn)一步的,觸控面板1331可覆蓋顯示面板1341,當(dāng)觸控面板1331檢測(cè)到在其上或附近的觸摸操作后,傳送給處理器1380以確定觸摸事件的類型,隨后處理器1380根據(jù)觸摸事件的類型在顯示面板1341上提供相應(yīng)的視覺(jué)輸出。雖然在圖13中,觸控面板1331與顯示面板1341是作為兩個(gè)獨(dú)立的部件來(lái)實(shí)現(xiàn)終端的輸入和輸入功能,但是在某些實(shí)施例中,可以將觸控面板1331與顯示面板1341集成而實(shí)現(xiàn)終端的輸入和輸出功能。還用于顯示應(yīng)用界面,目標(biāo)程序的運(yùn)行界面,及顯示熱點(diǎn)函數(shù)。音頻電路1360、揚(yáng)聲器1361,傳聲器1362可提供用戶與終端之間的音頻接口。音頻電路1360可將接收到的音頻數(shù)據(jù)轉(zhuǎn)換后的電信號(hào),傳輸?shù)綋P(yáng)聲器1361,由揚(yáng)聲器1361轉(zhuǎn)換為聲音信號(hào)輸出。處理器1380是終端的控制中心,利用各種接口和線路連接整個(gè)終端的各個(gè)部分,通過(guò)運(yùn)行或執(zhí)行存儲(chǔ)在存儲(chǔ)器1320內(nèi)的軟件程序和/或模塊,以及調(diào)用存儲(chǔ)在存儲(chǔ)器1320內(nèi)的數(shù)據(jù),執(zhí)行終端的各種功能和處理數(shù)據(jù),從而對(duì)終端進(jìn)行整體監(jiān)控??蛇x的,處理器1380可包括一個(gè)或多個(gè)處理單元;優(yōu)選的,處理器1380可集成應(yīng)用處理器和調(diào)制解調(diào)處理器,其中,應(yīng)用處理器主要處理操作系統(tǒng)、用戶界面和應(yīng)用程序等,調(diào)制解調(diào)處理器主要處理無(wú)線通信。可以理解的是,上述調(diào)制解調(diào)處理器也可以不集成到處理器1380中。處理器,用于執(zhí)行存儲(chǔ)器中的指令時(shí),使終端執(zhí)行圖2對(duì)應(yīng)的實(shí)施例中的終端所執(zhí)行的步驟,執(zhí)行圖9對(duì)應(yīng)的實(shí)施例中的終端所執(zhí)行的步驟。請(qǐng)參閱圖14所示,圖14為本發(fā)明中提供的一種服務(wù)器1400的一個(gè)實(shí)施例示意圖。該服務(wù)器1400包括:接收模塊,用于接收終端發(fā)送的目標(biāo)程序中的程序數(shù)據(jù)庫(kù)文件PDB文件;解析模塊,用于對(duì)接收模塊接收的PDB文件進(jìn)行解析,得到目標(biāo)程序中的全部函數(shù);確定模塊,用于確定解析模塊解析的全部函數(shù)中的各第一函數(shù),各第一函數(shù)為與執(zhí)行次數(shù)具有跳轉(zhuǎn)關(guān)系的函數(shù);工具包生成模塊,用于通過(guò)hook將函數(shù)記錄操作注入到確定模塊確定的第一函數(shù)里生成測(cè)試工具包;發(fā)送模塊,用于將工具包生成模塊生成的測(cè)試工具包發(fā)送給終端,以使終端根據(jù)測(cè)試工具包對(duì)目標(biāo)程序中的全部函數(shù)的執(zhí)行次數(shù)進(jìn)行測(cè)試,以確定目標(biāo)程序中的熱點(diǎn)函數(shù)。請(qǐng)參閱圖15所示,在圖14對(duì)應(yīng)的實(shí)施例的基礎(chǔ)上,本發(fā)明實(shí)施例提供了一種服務(wù)器1500的另一個(gè)實(shí)施例。該確定模塊還包括第一確定單元和第二確定單元;第一確定單元,用于確定全部函數(shù)中的各第二函數(shù),各第二函數(shù)為不能被hook的函數(shù);第二確定單元,用于根據(jù)第一確定單元確定的各第二函數(shù)確定各第一函數(shù),各第一函數(shù)為全部函數(shù)中除第二函數(shù)之外的函數(shù),第一函數(shù)為能被hook的函數(shù)??蛇x的,第二確定單元還具體用于:獲取目標(biāo)程序的動(dòng)態(tài)鏈接庫(kù)DLL文件;通過(guò)IDA工具對(duì)DLL文件進(jìn)行反匯編生成目標(biāo)格式文件;對(duì)目標(biāo)格式文件進(jìn)行分析處理,分析出第二函數(shù)。請(qǐng)參閱圖16所示,在圖14對(duì)應(yīng)的實(shí)施例的基礎(chǔ)上,本發(fā)明實(shí)施例提供了一種服務(wù)器1600的另一個(gè)實(shí)施例。該服務(wù)器還包括熱點(diǎn)函數(shù)分析模塊;接收模塊,還用于接收終端發(fā)送的多個(gè)記錄信息;熱點(diǎn)函數(shù)分析模塊,用于對(duì)多個(gè)記錄信息中的各函數(shù)的執(zhí)行次數(shù)進(jìn)行累加,得到各函數(shù)的累加后的執(zhí)行次數(shù),并根據(jù)各函數(shù)的累加后的執(zhí)行次數(shù)確定目標(biāo)程序中的熱點(diǎn)函數(shù)。進(jìn)一步的,圖13至圖16中的服務(wù)器是以功能模塊的形式來(lái)呈現(xiàn)。這里的“模塊”可以指特定應(yīng)用集成電路(application-specificintegratedcircuit,ASIC),電路,執(zhí)行一個(gè)或多個(gè)軟件或固件程序的處理器和存儲(chǔ)器,集成邏輯電路,和/或其他可以提供上述功能的器件。在一個(gè)簡(jiǎn)單的實(shí)施例中,圖13至圖16中的終端可以采用圖17所示的形式。各模塊可以通過(guò)圖17所示的結(jié)構(gòu)來(lái)實(shí)現(xiàn)。圖17是本發(fā)明實(shí)施例提供的一種服務(wù)器1700結(jié)構(gòu)示意圖,該服務(wù)器1700可因配置或性能不同而產(chǎn)生比較大的差異,可以包括一個(gè)或一個(gè)處理器1722和存儲(chǔ)器1732,一個(gè)或一個(gè)以上存儲(chǔ)應(yīng)用程序1742或數(shù)據(jù)1744的存儲(chǔ)介質(zhì)1730(例如一個(gè)或一個(gè)以上海量存儲(chǔ)設(shè)備)。其中,存儲(chǔ)器1732和存儲(chǔ)介質(zhì)1730可以是短暫存儲(chǔ)或持久存儲(chǔ)。存儲(chǔ)在存儲(chǔ)介質(zhì)1730的程序可以包括一個(gè)或一個(gè)以上模塊(圖示沒(méi)標(biāo)出),每個(gè)模塊可以包括對(duì)服務(wù)器中的一系列指令操作。更進(jìn)一步地,處理器1722可以設(shè)置為與存儲(chǔ)介質(zhì)1730通信,在服務(wù)器1700上執(zhí)行存儲(chǔ)介質(zhì)1730中的一系列指令操作。服務(wù)器1700還可以包括一個(gè)或一個(gè)以上電源1726,一個(gè)或一個(gè)以上有線或無(wú)線網(wǎng)絡(luò)接口1750,一個(gè)或一個(gè)以上輸入輸出接口1758,和/或,一個(gè)或一個(gè)以上操作系統(tǒng)1741,例如WindowsServerTM,MacOSXTM,UnixTM,LinuxTM,F(xiàn)reeBSDTM等等。上述實(shí)施例中由服務(wù)器所執(zhí)行的步驟可以基于該圖17所示的服務(wù)器結(jié)構(gòu)。處理器1722,用于在執(zhí)行存儲(chǔ)器中的指令時(shí),使服務(wù)器執(zhí)行圖2對(duì)應(yīng)的實(shí)施例中服務(wù)器所實(shí)際執(zhí)行的步驟。所屬領(lǐng)域的技術(shù)人員可以清楚地了解到,為描述的方便和簡(jiǎn)潔,上述描述的系統(tǒng),裝置和單元的具體工作過(guò)程,可以參考前述方法實(shí)施例中的對(duì)應(yīng)過(guò)程,在此不再贅述。在本申請(qǐng)所提供的幾個(gè)實(shí)施例中,應(yīng)該理解到,所揭露的系統(tǒng),裝置和方法,可以通過(guò)其它的方式實(shí)現(xiàn)。例如,以上所描述的裝置實(shí)施例僅僅是示意性的,例如,所述單元的劃分,僅僅為一種邏輯功能劃分,實(shí)際實(shí)現(xiàn)時(shí)可以有另外的劃分方式,例如多個(gè)單元或組件可以結(jié)合或者可以集成到另一個(gè)系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另一點(diǎn),所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過(guò)一些接口,裝置或單元的間接耦合或通信連接,可以是電性,機(jī)械或其它的形式。所述作為分離部件說(shuō)明的單元可以是或者也可以不是物理上分開(kāi)的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個(gè)地方,或者也可以分布到多個(gè)網(wǎng)絡(luò)單元上。可以根據(jù)實(shí)際的需要選擇其中的部分或者全部單元來(lái)實(shí)現(xiàn)本實(shí)施例方案的目的。另外,在本發(fā)明各個(gè)實(shí)施例中的各功能單元可以集成在一個(gè)處理單元中,也可以是各個(gè)單元單獨(dú)物理存在,也可以兩個(gè)或兩個(gè)以上單元集成在一個(gè)單元中。上述集成的單元既可以采用硬件的形式實(shí)現(xiàn),也可以采用軟件功能單元的形式實(shí)現(xiàn)。所述集成的單元如果以軟件功能單元的形式實(shí)現(xiàn)并作為獨(dú)立的產(chǎn)品銷售或使用時(shí),可以存儲(chǔ)在一個(gè)計(jì)算機(jī)可讀取存儲(chǔ)介質(zhì)中。基于這樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說(shuō)對(duì)現(xiàn)有技術(shù)做出貢獻(xiàn)的部分或者該技術(shù)方案的全部或部分可以以軟件產(chǎn)品的形式體現(xiàn)出來(lái),該計(jì)算機(jī)軟件產(chǎn)品存儲(chǔ)在一個(gè)存儲(chǔ)介質(zhì)中,包括若干指令用以使得一臺(tái)計(jì)算機(jī)設(shè)備(可以是個(gè)人計(jì)算機(jī),服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個(gè)實(shí)施例所述方法的全部或部分步驟。而前述的存儲(chǔ)介質(zhì)包括:U盤、移動(dòng)硬盤、只讀存儲(chǔ)器(ROM,Read-OnlyMemory)、隨機(jī)存取存儲(chǔ)器(RAM,RandomAccessMemory)、磁碟或者光盤等各種可以存儲(chǔ)程序代碼的介質(zhì)。以上所述,以上實(shí)施例僅用以說(shuō)明本發(fā)明的技術(shù)方案,而非對(duì)其限制;盡管參照前述實(shí)施例對(duì)本發(fā)明進(jìn)行了詳細(xì)的說(shuō)明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解:其依然可以對(duì)前述各實(shí)施例所記載的技術(shù)方案進(jìn)行修改,或者對(duì)其中部分技術(shù)特征進(jìn)行等同替換;而這些修改或者替換,并不使相應(yīng)技術(shù)方案的本質(zhì)脫離本發(fā)明各實(shí)施例技術(shù)方案的精神和范圍。當(dāng)前第1頁(yè)1 2 3