本申請(qǐng)主要涉及計(jì)算機(jī)技術(shù)領(lǐng)域,更具體地說(shuō)是涉及性能測(cè)試方法及系統(tǒng)。
背景技術(shù):
性能測(cè)試在軟件的質(zhì)量保證中起著重要的作用,其包括的測(cè)試內(nèi)容豐富多樣,可以分為應(yīng)用在客戶端性能的測(cè)試、應(yīng)用在網(wǎng)絡(luò)上性能的測(cè)試以及應(yīng)用在服務(wù)器性能的測(cè)試等三方面。
基于此,實(shí)際應(yīng)用中,在開發(fā)新的應(yīng)用程序或者對(duì)已有應(yīng)用程序進(jìn)行升級(jí)或變更等情況下,通常需要對(duì)新得到的應(yīng)用程序進(jìn)行性能測(cè)試,以明確其對(duì)其他應(yīng)用程序或設(shè)備運(yùn)行情況的影響。
然而,現(xiàn)有的性能測(cè)試方法多是利用代碼打點(diǎn)技術(shù),Hook技術(shù)或Trace技術(shù)等實(shí)現(xiàn),在實(shí)際測(cè)試過程中,代碼打點(diǎn)技術(shù)和Hook技術(shù)需要在每次測(cè)試時(shí)修改代碼源碼,非常麻煩;而Trace技術(shù)需要依賴客戶端的操作系統(tǒng)或相應(yīng)的測(cè)試工具,使其應(yīng)用具有很大的局限性。
技術(shù)實(shí)現(xiàn)要素:
有鑒于此,本發(fā)明提供了一種性能測(cè)試方法及系統(tǒng),通過插入斷點(diǎn)的方式,實(shí)現(xiàn)了對(duì)任意被測(cè)試對(duì)象性能的測(cè)試,無(wú)需修改源碼,也不依賴客戶端的操作系統(tǒng)或相應(yīng)的測(cè)試工作,非常靈活且方便。
為了實(shí)現(xiàn)上述目的,本申請(qǐng)?zhí)峁┝艘韵录夹g(shù)方案:
一種性能測(cè)試方法,所述方法包括:
記錄在被測(cè)試對(duì)象的開始位置插入的入口斷點(diǎn)的位置,以及在所述被測(cè)試對(duì)象的結(jié)束位置插入的出口斷點(diǎn)的位置;
捕獲所述被測(cè)試對(duì)象運(yùn)行過程中觸發(fā)的斷點(diǎn)異常;
基于獲得的與所述入口斷點(diǎn)的位置匹配的斷點(diǎn)異常的屬性信息,以及與所述出口斷點(diǎn)的位置匹配的斷點(diǎn)異常的屬性信息,獲得所述被測(cè)試對(duì)象的性能測(cè)試結(jié)果。
本申請(qǐng)實(shí)施例還提供了一種性能測(cè)試系統(tǒng),所述系統(tǒng)包括:
存儲(chǔ)模塊,用于記錄在被測(cè)試對(duì)象的開始位置插入的入口斷點(diǎn)的位置,以及在所述被測(cè)試對(duì)象的結(jié)束位置插入的出口斷點(diǎn)的位置;
異常捕獲模塊,用于捕獲所述被測(cè)試對(duì)象運(yùn)行過程中觸發(fā)的斷點(diǎn)異常;
處理模塊,用于基于獲得的與所述入口斷點(diǎn)的位置匹配的斷點(diǎn)異常的屬性信息,以及與所述出口斷點(diǎn)的位置匹配的斷點(diǎn)異常的屬性信息,獲得所述被測(cè)試對(duì)象的性能測(cè)試結(jié)果。
由此可見,與現(xiàn)有技術(shù)相比,本申請(qǐng)?zhí)峁┝艘环N性能測(cè)試方法及系統(tǒng),對(duì)于任何需要進(jìn)行性能測(cè)試的被測(cè)試對(duì)象,通過在其開始位置和結(jié)束位置都插入斷點(diǎn),并記錄在被測(cè)試對(duì)象的開始位置插入的入口斷點(diǎn)的位置以及在結(jié)束位置插入的出口斷點(diǎn)的位置,這樣,在被測(cè)試對(duì)象的運(yùn)行過程中,系統(tǒng)會(huì)自動(dòng)捕獲到斷點(diǎn)異常,之后,就能夠基于與該入口斷點(diǎn)的位置匹配的斷點(diǎn)異常的屬性信息,以及與出口斷點(diǎn)的位置匹配的斷點(diǎn)異常的屬性信息,獲得被測(cè)試對(duì)象的性能測(cè)試結(jié)果??梢姡旧暾?qǐng)?zhí)峁┑男阅軠y(cè)試方法適用于任何測(cè)試對(duì)象;而且,該測(cè)試過程中并未對(duì)被測(cè)試對(duì)象的代碼源碼進(jìn)行修改,操作簡(jiǎn)便,提高了測(cè)試效率;并且,該測(cè)試過程的實(shí)現(xiàn)并不依賴客戶端的操作系統(tǒng)或?qū)iT的測(cè)試工具,易于實(shí)現(xiàn),進(jìn)一步擴(kuò)大了適用范圍。
附圖說(shuō)明
為了更清楚地說(shuō)明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)提供的附圖獲得其他的附圖。
圖1為本申請(qǐng)實(shí)施例提供的一種性能測(cè)試方法的流程圖;
圖2為本申請(qǐng)實(shí)施例提供的另一種性能測(cè)試方法的部分流程圖;
圖3為本申請(qǐng)實(shí)施例提供的又一種性能測(cè)試方法的流程圖;
圖4為本申請(qǐng)實(shí)施例提供的一種性能測(cè)試系統(tǒng)的結(jié)構(gòu)框圖;
圖5為本申請(qǐng)實(shí)施例提供的另一種性能測(cè)試系統(tǒng)的部分結(jié)構(gòu)框圖;
圖6為本申請(qǐng)實(shí)施例提供的又一種性能測(cè)試系統(tǒng)的結(jié)構(gòu)框圖;
圖7為本申請(qǐng)實(shí)施例提供的一種性能測(cè)試系統(tǒng)的硬件結(jié)構(gòu)圖。
具體實(shí)施方式
下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
為了使本發(fā)明的上述目的、特征和優(yōu)點(diǎn)能夠更加明顯易懂,下面結(jié)合附圖和具體實(shí)施方式對(duì)本發(fā)明作進(jìn)一步詳細(xì)的說(shuō)明。
參照?qǐng)D1,為本申請(qǐng)實(shí)施例提供的一種性能測(cè)試方法的流程圖,該方法可以包括以下步驟:
步驟S11,記錄在被測(cè)試對(duì)象的開始位置插入的入口斷點(diǎn)的位置,以及在該被測(cè)試對(duì)象的結(jié)束位置插入的出口斷點(diǎn)的位置;
在實(shí)際應(yīng)用中,中斷是一種可恢復(fù)的陷阱型異常,可以將其稱為斷點(diǎn)異常,該斷點(diǎn)異常的恢復(fù)需要從引發(fā)斷點(diǎn)異常的那條指令的下一條指令開始執(zhí)行。因此,當(dāng)需要對(duì)某一程序或某一段代碼進(jìn)行性能測(cè)試時(shí),本申請(qǐng)可以在該程序或該段代碼的開始位置和結(jié)束位置分別插入斷點(diǎn),以使系統(tǒng)能夠得知需要對(duì)什么進(jìn)行測(cè)試。
具體的,本申請(qǐng)可以通過在上述被測(cè)試對(duì)象(如某一個(gè)程序或一段代碼等等)的開始位置和結(jié)束位置寫入int3指令,以使被測(cè)試對(duì)象運(yùn)行到該位置時(shí),系統(tǒng)能夠及時(shí)識(shí)別到此處設(shè)置了斷點(diǎn),但并不局限于這一種斷點(diǎn)設(shè)置方式,本實(shí)施例僅以此為例進(jìn)行說(shuō)明。
按照上述方式插入斷點(diǎn)之后,為了描述方便,本申請(qǐng)可以將在被測(cè)試對(duì)象的開始位置插入的斷點(diǎn)記為入口斷點(diǎn),將在被測(cè)試對(duì)象的結(jié)束位置插入的斷點(diǎn)記為出口斷點(diǎn),此時(shí),將入口斷點(diǎn)的位置以及出口斷點(diǎn)的位置記錄下來(lái),以便后續(xù)調(diào)用。
其中,入口斷點(diǎn)的位置以及出口斷點(diǎn)的位置具體可以包括對(duì)應(yīng)指令的地址等。
步驟S12,捕獲被測(cè)試對(duì)象運(yùn)行過程中觸發(fā)的斷點(diǎn)異常;
需要說(shuō)明的是,該斷點(diǎn)異??赡馨ū旧暾?qǐng)插入的斷點(diǎn)引起的異常,也可能包括由于其他位置斷點(diǎn)或其他因素引起的斷點(diǎn)異常,因此,本申請(qǐng)?jiān)诓东@到斷點(diǎn)異常后,需要驗(yàn)證其是否是由于本申請(qǐng)插入的斷點(diǎn)引起的斷點(diǎn)異常,以保證據(jù)此對(duì)被測(cè)試對(duì)象的性能測(cè)試結(jié)果的準(zhǔn)確性。
步驟S13,基于獲得的與入口斷點(diǎn)的位置匹配的斷點(diǎn)異常的屬性信息,以及與出口斷點(diǎn)的位置匹配的斷點(diǎn)異常的屬性信息,獲得被測(cè)試對(duì)象的性能測(cè)試結(jié)果。
其中,斷點(diǎn)異常的屬性信息可以包括發(fā)生斷點(diǎn)異常的時(shí)間、地址、異常向量等等,在需要測(cè)試該被測(cè)試對(duì)象的運(yùn)行時(shí)間的情況下,本申請(qǐng)可以直接獲取發(fā)生斷點(diǎn)異常的時(shí)間。
在實(shí)際應(yīng)用中,本申請(qǐng)可以在捕獲到與入口斷點(diǎn)的位置匹配的斷點(diǎn)異常時(shí),獲得此時(shí)系統(tǒng)時(shí)間,并將其作為該斷點(diǎn)異常的屬性信息;同理,在捕獲到與出口斷點(diǎn)的位置匹配的斷點(diǎn)異常時(shí),也可以獲得此時(shí)的系統(tǒng)時(shí)間,并將其作為此時(shí)捕獲到的斷點(diǎn)異常的屬性信息。
可選的,本申請(qǐng)也可以在捕獲到與入口斷點(diǎn)的位置匹配的斷點(diǎn)異常時(shí),觸發(fā)計(jì)時(shí)器開始計(jì)時(shí),直至捕獲到與出口斷點(diǎn)的位置匹配的斷點(diǎn)異常結(jié)束計(jì)時(shí),在這種情況下,可以將該計(jì)時(shí)器輸出的時(shí)間作為捕獲到的相應(yīng)的斷點(diǎn)異常的屬性信息。
需要說(shuō)明的是,關(guān)于上述斷點(diǎn)異常的屬性信息的獲取方式并不局限于上述列舉的方式,其可以根據(jù)實(shí)際需要屬性信息的類型確定,本申請(qǐng)?jiān)诖瞬辉僖灰涣信e。
基于此,在實(shí)際應(yīng)用中,為了獲得被測(cè)試對(duì)象的運(yùn)行時(shí)間,可以直接獲取與入口斷點(diǎn)的位置匹配的斷點(diǎn)異常對(duì)應(yīng)的第一時(shí)間,以及與出口斷點(diǎn)的位置匹配的斷點(diǎn)異常的第二時(shí)間,之后,計(jì)算該第一時(shí)間與第二時(shí)間的時(shí)間差,從而得到被測(cè)試對(duì)象的運(yùn)行時(shí)間,
其中,結(jié)合上述描述,第一時(shí)間和第二時(shí)間可以是系統(tǒng)時(shí)間,也可以是計(jì)時(shí)器輸出的時(shí)間等,需要說(shuō)明的是,無(wú)論是系統(tǒng)時(shí)間還是計(jì)時(shí)器輸出的時(shí)間,都是會(huì)隨著被測(cè)試對(duì)象的運(yùn)行而相應(yīng)改變,以使該時(shí)間能夠表示被測(cè)試對(duì)象的運(yùn)行進(jìn)度。
綜上所述,本申請(qǐng)采用在需要進(jìn)行性能測(cè)試的被測(cè)試對(duì)象中插入斷點(diǎn)的方式,來(lái)獲得因插入斷點(diǎn)引起的斷點(diǎn)異常的屬性信息,進(jìn)而據(jù)此實(shí)現(xiàn)對(duì)該被測(cè)試對(duì)象的性能測(cè)試,不需要修改代碼源碼,也不用依賴客戶端的操作系統(tǒng)或?qū)iT的測(cè)試工作,操作非常簡(jiǎn)便,提高了測(cè)試效率;而且,本申請(qǐng)這種插入斷點(diǎn)的方式能夠?qū)θ我庖欢位驇锥未a進(jìn)行測(cè)試,并不局限于整個(gè)程序代碼,應(yīng)用更加靈活,適用范圍更廣。
可選的,在上述步驟S11之前,為了實(shí)現(xiàn)斷點(diǎn)的設(shè)置,本申請(qǐng)可以基于被測(cè)試對(duì)象的測(cè)試需求,生成斷點(diǎn)插入請(qǐng)求,使得該斷點(diǎn)插入請(qǐng)求包括插入斷點(diǎn)的位置信息,如上述被測(cè)試對(duì)象的開始位置和結(jié)束位置,但并不局限于此。這樣,當(dāng)獲得該斷點(diǎn)插入請(qǐng)求后,可以根據(jù)其包含的插入斷點(diǎn)的位置信息,在被測(cè)試對(duì)象的開始位置插入入口斷點(diǎn),并在該被測(cè)試對(duì)象的結(jié)束位置插入出口斷點(diǎn)。
仍以上述int3指令為例,由于其二進(jìn)制可以表示為0xCC,所以,當(dāng)確定被測(cè)試對(duì)象需要插入斷點(diǎn)的位置后,可以將該位置對(duì)應(yīng)的指令第一個(gè)字節(jié)修改為0xCC。例如,確定需要插入斷點(diǎn)的位置對(duì)應(yīng)的指令如下:
int b=2;
C7 45 F8 02 00 00 00 mov dword ptr[b],2
那么,插入斷點(diǎn)后,該指令將變?yōu)椋?/p>
CC 45 F8 02 00 00 00
在實(shí)際運(yùn)行過程中,可以通過檢測(cè)當(dāng)前運(yùn)行指令的第一個(gè)字節(jié),來(lái)判斷此時(shí)是否發(fā)生斷點(diǎn)異常,也就是說(shuō),一旦運(yùn)行到插入斷點(diǎn)的指令將會(huì)觸發(fā)斷點(diǎn)異常。
由此可見,如果要統(tǒng)計(jì)一段代碼之間的執(zhí)行時(shí)間,可以先確定該代碼段即被測(cè)試對(duì)象的開始和結(jié)束位置,而在實(shí)際應(yīng)用中,通常給出的是一個(gè)函數(shù)或整個(gè)程序代碼的開始或結(jié)束位置,所以,本申請(qǐng)可以利用預(yù)存的符號(hào)表來(lái)確定被測(cè)試對(duì)象的開始位置和結(jié)束位置。
具體的,為了獲得被測(cè)試對(duì)象的開始位置和結(jié)束位置,本申請(qǐng)實(shí)施例提供了另一種性能測(cè)試方法的流程圖,結(jié)合上述圖1所示的實(shí)施例流程,參照?qǐng)D2,該方法可以包括:
步驟S21,利用預(yù)存的符號(hào)表,查詢加載被測(cè)試對(duì)象的相對(duì)偏移位置以及所述被測(cè)試對(duì)象的指令條數(shù);
其中,預(yù)存的符號(hào)表可以是操作系統(tǒng)的pdb符號(hào)表,但并不局限于此,根據(jù)實(shí)際需要,其通??梢园ǜ鞯刂坊蛭恢脤?duì)應(yīng)的指令的相對(duì)偏移位置(RVA)及其函數(shù)塊大小即包含的指令條數(shù),以及名稱等等。
步驟S22,根據(jù)當(dāng)前加載被測(cè)試對(duì)象的基地址以及相對(duì)偏移位置,確定被測(cè)試對(duì)象的開始位置;
在實(shí)際應(yīng)用中,對(duì)于運(yùn)行的被測(cè)試對(duì)象,通常需要加載到內(nèi)存塊中,而該內(nèi)存塊加載任何程序代碼時(shí)通常都有一定的基地址,所以,本申請(qǐng)?jiān)诩虞d被測(cè)試對(duì)象時(shí),可以利用該基地址以及獲得的相對(duì)偏移位置,經(jīng)過簡(jiǎn)單的加減法運(yùn)算,計(jì)算得到該被測(cè)試對(duì)象的起始地址即起始位置。
步驟S23,利用被測(cè)試對(duì)象的開始位置及其指令條數(shù)的二進(jìn)制范圍,計(jì)算得到被測(cè)試對(duì)象的結(jié)束位置。
其中,根據(jù)被測(cè)試對(duì)象包含的指令條數(shù)的二進(jìn)制范圍,可以確定該被測(cè)試對(duì)象所占內(nèi)存地址,這樣,在得知被測(cè)試對(duì)象的起始地址的情況下,將其所占用的內(nèi)存地址加上該起始地址,就能夠得知該被測(cè)試對(duì)象的結(jié)束位置。當(dāng)然,也可以通過distorm函數(shù)庫(kù)反匯編被測(cè)試對(duì)象地址,尋找對(duì)應(yīng)的RET指令,得到被測(cè)試對(duì)象的返回地址即結(jié)束位置。
此時(shí),若需要測(cè)試該測(cè)試對(duì)象的運(yùn)行時(shí)間,可以按照上述方式修改其起始地址指令的第一個(gè)字節(jié)為0xCC,并修改所有結(jié)束地址指令的第一個(gè)字節(jié)為0xCC。
下面將以測(cè)試函數(shù)或某一段程序代碼等被測(cè)試對(duì)象的運(yùn)行時(shí)間為例,來(lái)實(shí)現(xiàn)該被測(cè)試對(duì)象的性能測(cè)試,如圖3所示,為本申請(qǐng)實(shí)施例提供的又一種性能測(cè)試方法的流程圖,結(jié)合上述圖1和2實(shí)施例描述的流程,該方法可以包括:
步驟S31,獲得斷點(diǎn)插入請(qǐng)求;
其中,該斷點(diǎn)插入請(qǐng)求可以包括插入斷點(diǎn)的位置信息,如被測(cè)試對(duì)象的開始位置和結(jié)束位置等等。
可選的,在實(shí)際應(yīng)用中,設(shè)置斷點(diǎn)之前,可以先判斷當(dāng)前是否已經(jīng)確定被測(cè)試對(duì)象的開始位置和結(jié)束位置,也就是說(shuō),判讀當(dāng)前是否需要對(duì)某一段程序代碼進(jìn)行性能測(cè)試,如果需要,才會(huì)按照上述方式設(shè)置斷點(diǎn);若不需要,將結(jié)束性能測(cè)試流程。
步驟S32,根據(jù)該斷點(diǎn)插入請(qǐng)求中的插入斷點(diǎn)的位置信息,在被測(cè)試對(duì)象的開始位置插入入口斷點(diǎn),并在該被測(cè)試對(duì)象的結(jié)束位置插入出口斷點(diǎn)。
在本實(shí)施例的實(shí)際應(yīng)用中,可以參照上述方式確定被測(cè)試對(duì)象的開始位置以及結(jié)束位置,并在相應(yīng)位置插入斷點(diǎn),本實(shí)施例在此不再贅述。
需要說(shuō)明的是,在插入斷點(diǎn)之前,需要保存將要插入斷點(diǎn)的指令的第一個(gè)字節(jié)的內(nèi)容,以便恢復(fù)該指令的第一個(gè)字節(jié)時(shí)調(diào)用。
步驟S33,記錄在被測(cè)試對(duì)象的開始位置插入的入口斷點(diǎn)的位置,以及在被測(cè)試對(duì)象的結(jié)束位置插入的出口斷點(diǎn)的位置;
步驟S34,捕獲該被測(cè)試對(duì)象運(yùn)行過程中觸發(fā)的斷點(diǎn)異常;
步驟S35,驗(yàn)證捕獲到的斷點(diǎn)異常的位置是否與記錄的入口斷點(diǎn)的位置或出口斷點(diǎn)的位置匹配,如果捕獲到的斷點(diǎn)異常的位置與記錄的入口斷點(diǎn)的位置匹配,進(jìn)入步驟S36;如果捕獲到的斷點(diǎn)異常的位置與記錄的出口斷點(diǎn)的位置匹配,執(zhí)行步驟S38;如果捕獲到的斷點(diǎn)異常的位置與記錄的入口斷點(diǎn)的位置和出口斷點(diǎn)的位置都不匹配,返回步驟S34;
步驟S36,在捕獲到的斷點(diǎn)異常的位置中添加入口標(biāo)識(shí);
需要說(shuō)明的是,本申請(qǐng)對(duì)該入口標(biāo)識(shí)的具體內(nèi)容不作限定,只要能夠據(jù)此識(shí)別出該斷點(diǎn)異常的位置是預(yù)先插入的斷點(diǎn)的位置即可。
步驟S37,獲取捕獲到斷點(diǎn)異常的當(dāng)前時(shí)間,并將其作為第一時(shí)間進(jìn)行記錄,返回步驟S34。
如上述實(shí)施例的描述,該當(dāng)前時(shí)間可以是系統(tǒng)時(shí)間,也可以是計(jì)時(shí)器的時(shí)間,對(duì)于后者,可以在捕獲到斷點(diǎn)異常觸發(fā)該計(jì)數(shù)器工作,從而獲得該計(jì)時(shí)器輸出的當(dāng)前時(shí)間。
步驟S38,檢測(cè)捕獲到斷點(diǎn)異常之前的位置中是否存在入口標(biāo)識(shí),若存在,進(jìn)入步驟S39,若不存在,返回步驟S34;
在這種情況下,即捕獲到的斷點(diǎn)異常是由于插入的出口斷點(diǎn)引起的,那么,此時(shí),可以檢測(cè)在此之前是否已經(jīng)捕獲到了因插入的入口斷點(diǎn)引起的斷點(diǎn)異常,本實(shí)施例可以基于上述入口標(biāo)識(shí)進(jìn)行檢測(cè)。
由于在捕獲到的斷點(diǎn)異常的位置中添加入口標(biāo)識(shí)后,可以將添加入口標(biāo)識(shí)后的斷點(diǎn)異常的位置存儲(chǔ)起來(lái),因此,本實(shí)施例可以通過查詢存儲(chǔ)器確定本次捕獲到斷點(diǎn)異常之前是否已經(jīng)存儲(chǔ)了入口標(biāo)識(shí),即在本次捕獲到斷點(diǎn)異常之前是否有插入的入口斷點(diǎn)。
需要說(shuō)明的是,關(guān)于對(duì)捕獲到的斷點(diǎn)異常的位置中添加的入口標(biāo)識(shí),通常會(huì)在完成本次測(cè)試后清除,所以,當(dāng)查詢存儲(chǔ)器時(shí)通常不會(huì)查找到多個(gè)入口標(biāo)識(shí)。
步驟S39,獲取捕獲到斷點(diǎn)異常的當(dāng)前時(shí)間,并將其作為第二時(shí)間進(jìn)行記錄;
本實(shí)施例中,該第二時(shí)間與上述第一時(shí)間的獲取方式相同,在此不再詳述。
步驟S310,計(jì)算第二時(shí)間與第一時(shí)間的時(shí)間差,得到被測(cè)試對(duì)象的運(yùn)行時(shí)間;
步驟S311,清除被測(cè)試對(duì)象中存在的入口標(biāo)識(shí);
如上述描述,為了避免影響對(duì)下一次測(cè)試或?qū)υ摫粶y(cè)試對(duì)象的其他性能測(cè)試,得到本次測(cè)試的時(shí)間差,即本次測(cè)試中被測(cè)試對(duì)象的運(yùn)行時(shí)間后,可以清除在上述斷點(diǎn)異常的位置中添加的入口標(biāo)識(shí)。
可選的,在得到本次測(cè)試的時(shí)間差后,還可以將對(duì)被測(cè)試對(duì)象的運(yùn)行時(shí)間的測(cè)試次數(shù)增加一次,并計(jì)算對(duì)該被測(cè)試對(duì)象完成的所有測(cè)試次數(shù)所得時(shí)間差的總時(shí)間。
步驟S312,判斷對(duì)被測(cè)試對(duì)象的測(cè)試次數(shù)是否達(dá)到預(yù)設(shè)測(cè)試閾值,若是,進(jìn)入步驟S313;如果否,返回步驟S31。
步驟S313,利用各次測(cè)試計(jì)算得到的時(shí)間差的總時(shí)間以及測(cè)試總次數(shù),計(jì)算每次測(cè)試的平均時(shí)間,并將該平均時(shí)間作為被測(cè)試對(duì)象的運(yùn)行時(shí)間。
在本實(shí)施例中,為了提高對(duì)被測(cè)試對(duì)象的性能測(cè)試結(jié)果的準(zhǔn)確性,可以對(duì)該被測(cè)試對(duì)象進(jìn)行多次測(cè)試,以便將所得平均測(cè)試結(jié)果作為該被測(cè)試對(duì)象的性能測(cè)試結(jié)果;當(dāng)然,根據(jù)具體測(cè)試性能的不同,也可以只進(jìn)行一次測(cè)試即可,本申請(qǐng)對(duì)測(cè)試次數(shù)不作具體限定,即對(duì)該預(yù)設(shè)測(cè)試閾值的具體數(shù)值不作限定。
綜上所述,當(dāng)需要對(duì)某一段程序代碼即上述被測(cè)試對(duì)象的運(yùn)行時(shí)間進(jìn)行測(cè)試時(shí),本申請(qǐng)可以通過在該代碼段的開始位置和結(jié)束位置都插入斷點(diǎn),從而利用捕獲到因插入的斷點(diǎn)引起的斷點(diǎn)異常對(duì)應(yīng)的時(shí)間,計(jì)算該代碼段的運(yùn)行時(shí)間,且還可以通過對(duì)該代碼段進(jìn)行多次測(cè)試,將得到的平均時(shí)間差作為該代碼段的運(yùn)行時(shí)間。由此可見,本申請(qǐng)能夠?qū)崿F(xiàn)對(duì)任意代碼段的運(yùn)行時(shí)間的測(cè)試,非常靈活且方便實(shí)用;而且,該測(cè)試過程不需要修改代碼源碼,也不用依賴客戶端的操作系統(tǒng)或?qū)iT的測(cè)試工作,操作非常簡(jiǎn)便,提高了測(cè)試效率。
可選的,在上述步驟S34之后,可以先驗(yàn)證捕獲到的斷點(diǎn)異常的位置是否與記錄的入口斷點(diǎn)的位置匹配,如果匹配,執(zhí)行上述步驟S36;如果不匹配,再驗(yàn)證捕獲到的斷點(diǎn)異常的位置是否與記錄的出口斷點(diǎn)的位置匹配,如果匹配,執(zhí)行步驟S38;如果仍然不匹配,則可以返回步驟S34繼續(xù)捕獲該被測(cè)試對(duì)象運(yùn)行過程中觸發(fā)的斷點(diǎn)異常,具體實(shí)現(xiàn)過程可以結(jié)合上述實(shí)施例對(duì)應(yīng)部分的描述,本實(shí)施例在此不再贅述。
作為本申請(qǐng)另一實(shí)施例,在上述實(shí)施例的基礎(chǔ)上,在捕獲到被測(cè)試對(duì)象運(yùn)行過程中觸發(fā)的斷點(diǎn)異常,為了保證被測(cè)試對(duì)象的繼續(xù)運(yùn)行,需要對(duì)該斷點(diǎn)異常進(jìn)行處理,并在處理該斷點(diǎn)異常后,指向該斷點(diǎn)異常的下一個(gè)指令運(yùn)行,具體可以將標(biāo)志寄存器減1,此時(shí),還可以利用預(yù)存的被測(cè)試對(duì)象的開始位置對(duì)應(yīng)指令的第一個(gè)字節(jié)或結(jié)束位置對(duì)應(yīng)指令的第一個(gè)字節(jié),恢復(fù)捕獲到的斷點(diǎn)異常對(duì)應(yīng)指令的第一個(gè)字節(jié),即取消設(shè)置的斷點(diǎn),之后,重置標(biāo)志寄存器的TF標(biāo)志位,并按照單步執(zhí)行策略繼續(xù)運(yùn)行被測(cè)試對(duì)象。
由此可見,完成對(duì)被測(cè)試對(duì)象的一次測(cè)試后,會(huì)將開始測(cè)試前設(shè)置的斷點(diǎn)取消,以便重置斷點(diǎn)進(jìn)行第二次的測(cè)試,如此循環(huán),以實(shí)現(xiàn)對(duì)被測(cè)試對(duì)象的多次測(cè)試。
其中,標(biāo)志寄存器的TF標(biāo)志位置1則開啟單步執(zhí)行調(diào)試模式,置0則關(guān)閉該單步執(zhí)行調(diào)試模式,在該單步執(zhí)行調(diào)試模式下,處理器在每條指令后產(chǎn)生一個(gè)調(diào)試異常,這樣在每條指令執(zhí)行后都可以查看執(zhí)行程序的狀態(tài)?;诖?,在實(shí)際測(cè)試過程中,由于每引發(fā)一次終端,通常會(huì)將上述標(biāo)志寄存器的TF標(biāo)志位置0,所以,當(dāng)需要進(jìn)行單步執(zhí)行時(shí),需要重置該TF標(biāo)志位,即將該TF標(biāo)志位置1,但并不局限于此。
如圖4所示,為本申請(qǐng)實(shí)施例提供的一種性能測(cè)試系統(tǒng)的結(jié)構(gòu)框圖,該系統(tǒng)可以包括:
存儲(chǔ)模塊41,用于記錄在被測(cè)試對(duì)象的開始位置插入的入口斷點(diǎn)的位置,以及在所述被測(cè)試對(duì)象的結(jié)束位置插入的出口斷點(diǎn)的位置;
其中,關(guān)于在被測(cè)試對(duì)象的開始位置和結(jié)束位置插入斷點(diǎn)的具體過程可以參照上述方法實(shí)施例對(duì)應(yīng)部分的描述,本實(shí)施例在此不再贅述。
異常捕獲模塊42,用于捕獲所述被測(cè)試對(duì)象運(yùn)行過程中觸發(fā)的斷點(diǎn)異常;
處理模塊43,用于基于獲得的與所述入口斷點(diǎn)的位置匹配的斷點(diǎn)異常的屬性信息,以及與所述出口斷點(diǎn)的位置匹配的斷點(diǎn)異常的屬性信息,獲得所述被測(cè)試對(duì)象的性能測(cè)試結(jié)果。
可選的,當(dāng)需要測(cè)試被測(cè)試對(duì)象的運(yùn)行時(shí)間,具體如一代碼段的運(yùn)行時(shí)間時(shí),上述獲得的斷點(diǎn)異常的屬性信息可以包括捕獲到該斷點(diǎn)異常的時(shí)間,基于此,可以利用兩次捕獲到的因插入斷點(diǎn)而引起的斷點(diǎn)異常的時(shí)間,計(jì)算該被測(cè)試對(duì)象的運(yùn)行時(shí)間。
基于此,該處理模塊43可以包括:
時(shí)間獲取單元,用于獲取與所述入口斷點(diǎn)的位置匹配的斷點(diǎn)異常對(duì)應(yīng)的第一時(shí)間,以及與所述出口斷點(diǎn)的位置匹配的斷點(diǎn)異常的第二時(shí)間;
其中,該第一時(shí)間和第二時(shí)間可以是系統(tǒng)時(shí)間,也可以是計(jì)時(shí)器輸出的時(shí)間等,本申請(qǐng)對(duì)其獲取來(lái)源不作限定。
計(jì)算單元,用于計(jì)算所述第一時(shí)間與所述第二時(shí)間的時(shí)間差,得到所述被測(cè)試對(duì)象的運(yùn)行時(shí)間。
由此可見,在本實(shí)施例中,通過插入斷點(diǎn)的方式,能夠?qū)崿F(xiàn)對(duì)任意代碼即上述被測(cè)試對(duì)象的運(yùn)行時(shí)間的測(cè)試非常靈活且方便實(shí)用,而且,測(cè)試過程不需要修改代碼源碼,也不用依賴客戶端的操作系統(tǒng)或?qū)iT的測(cè)試工作,操作非常簡(jiǎn)便,提高了測(cè)試效率。
作為本申請(qǐng)另一實(shí)施例,在實(shí)際應(yīng)用中,如圖5所示,上述時(shí)間獲取單元可以包括:
驗(yàn)證單元431,用于驗(yàn)證捕獲到的斷點(diǎn)異常的位置是否與記錄的所述入口斷點(diǎn)的位置或所述出口斷點(diǎn)的位置匹配;
第一記錄單元432,用于當(dāng)捕獲到的斷點(diǎn)異常的位置與記錄的所述入口斷點(diǎn)的位置匹配,在捕獲到的斷點(diǎn)異常的位置中添加入口標(biāo)識(shí),并將捕獲到斷點(diǎn)異常的當(dāng)前時(shí)間作為第一時(shí)間記錄,并觸發(fā)所述異常捕獲模塊繼續(xù)捕獲所述被測(cè)試對(duì)象運(yùn)行過程中觸發(fā)的斷點(diǎn)異常;
檢測(cè)單元433,用于當(dāng)捕獲到的斷點(diǎn)異常的位置與記錄的所述出口斷點(diǎn)的位置匹配,檢測(cè)捕獲到斷點(diǎn)異常之前的位置中是否存在入口標(biāo)識(shí),如果不存在,觸發(fā)所述異常捕獲模塊繼續(xù)捕獲所述被測(cè)試對(duì)象運(yùn)行過程中觸發(fā)的斷點(diǎn)異常;
第二記錄單元434,用于當(dāng)捕獲到斷點(diǎn)異常之前的位置中存在入口標(biāo)識(shí),將捕獲到斷點(diǎn)異常的當(dāng)前時(shí)間作為第二時(shí)間記錄。
可選的,為了在對(duì)被測(cè)試對(duì)象設(shè)置斷點(diǎn),如圖6所示,該系統(tǒng)還可以包括:
獲取模塊44,用于獲得斷點(diǎn)插入請(qǐng)求,所述斷點(diǎn)插入請(qǐng)求包括插入斷點(diǎn)的位置信息;
在實(shí)際應(yīng)用中,該獲取模塊44可以包括:
查詢單元,用于利用預(yù)存的符號(hào)表,查詢加載被測(cè)試對(duì)象的相對(duì)偏移位置以及所述被測(cè)試對(duì)象的指令條數(shù);
第一位置計(jì)算單元,用于根據(jù)當(dāng)前加載所述被測(cè)試對(duì)象的基地址以及所述相對(duì)偏移位置,確定所述被測(cè)試對(duì)象的開始位置;
第二位置計(jì)算單元,用于利用所述被測(cè)試對(duì)象的開始位置以及所述被測(cè)試對(duì)象的指令條數(shù)的二進(jìn)制范圍,計(jì)算得到所述被測(cè)試對(duì)象的結(jié)束位置
斷點(diǎn)插入模塊45,用于根據(jù)所述斷點(diǎn)插入請(qǐng)求中的插入斷點(diǎn)的位置信息,在被測(cè)試對(duì)象的開始位置插入入口斷點(diǎn),并在所述被測(cè)試對(duì)象的結(jié)束位置插入出口斷點(diǎn)。
進(jìn)一步地,為了提高對(duì)被測(cè)試對(duì)象的性能測(cè)試結(jié)果,在上述各實(shí)施例的基礎(chǔ)上,如圖6所示,系統(tǒng)還可以包括:
標(biāo)識(shí)清除模塊46,用于在計(jì)算得到第一時(shí)間與第二時(shí)間的時(shí)間差后,清除被測(cè)試對(duì)象中存在的入口標(biāo)識(shí);
平均時(shí)間計(jì)算模塊47,用于當(dāng)判斷對(duì)所述被測(cè)試對(duì)象的測(cè)試次數(shù)達(dá)到預(yù)設(shè)測(cè)試閾值,利用各次測(cè)試計(jì)算得到的所述時(shí)間差的總時(shí)間以及測(cè)試總次數(shù),計(jì)算每次測(cè)試的平均時(shí)間,并將所述平均時(shí)間作為所述被測(cè)試對(duì)象的運(yùn)行時(shí)間。
另外,在上述各實(shí)施例的基礎(chǔ)上,需要對(duì)捕獲到的斷點(diǎn)異常進(jìn)行處理,基于此,系統(tǒng)還可以包括:
異常處理模塊,用于處理所述斷點(diǎn)異常,并指向所述斷點(diǎn)異常的下一指令運(yùn)行;
斷點(diǎn)恢復(fù)模塊,用于利用預(yù)存的所述被測(cè)試對(duì)象的開始位置對(duì)應(yīng)指令的第一個(gè)字節(jié)或結(jié)束位置對(duì)應(yīng)指令的第一個(gè)字節(jié),恢復(fù)捕獲到的斷點(diǎn)異常對(duì)應(yīng)指令的第一個(gè)字節(jié);
單步調(diào)試模塊,用于重置標(biāo)志寄存器的TF標(biāo)志位,并按照單步執(zhí)行策略繼續(xù)運(yùn)行所述被測(cè)試對(duì)象。
上文描述的是性能測(cè)試系統(tǒng)的軟件功能模塊構(gòu)架,對(duì)于該系統(tǒng)的硬件結(jié)構(gòu),可以參照?qǐng)D7所示:
圖7為本申請(qǐng)實(shí)施例提供的一種性能測(cè)試系統(tǒng)的硬件結(jié)構(gòu)框圖,如圖7所示,該系統(tǒng)可以包括:處理器71、存儲(chǔ)器72、顯示器73、通信接口74以及通信總線75;
其中,處理器71、存儲(chǔ)器72、顯示器73以及通信接口74通過通信總線75完成相互間的通信。
可選的,該通信接口74可以是USB接口或者其他串口等等。
處理器71,用于執(zhí)行程序;
存儲(chǔ)器72,用于存放程序以及獲得的各種數(shù)據(jù)等;
顯示器73,可以用于顯示性能測(cè)試結(jié)果以及測(cè)試過程等;
在本實(shí)施例中,該處理器71可以是中央處理器CPU,或者是特定集成電路ASIC(Application Specific Integrated Circuit),或者是被配置成實(shí)施本發(fā)明實(shí)施例的一個(gè)或多個(gè)集成電路。
存儲(chǔ)器72可以包含高速RAM存儲(chǔ)器,也可能還包括非易失性存儲(chǔ)器(non-volatile memory),例如至少一個(gè)磁盤存儲(chǔ)器等。
其中,上述程序可具體用于:
記錄在被測(cè)試對(duì)象的開始位置插入的入口斷點(diǎn)的位置,以及在所述被測(cè)試對(duì)象的結(jié)束位置插入的出口斷點(diǎn)的位置;
捕獲所述被測(cè)試對(duì)象運(yùn)行過程中觸發(fā)的斷點(diǎn)異常;
基于獲得的與所述入口斷點(diǎn)的位置匹配的斷點(diǎn)異常的屬性信息,以及與所述出口斷點(diǎn)的位置匹配的斷點(diǎn)異常的屬性信息,獲得所述被測(cè)試對(duì)象的性能測(cè)試結(jié)果。
需要說(shuō)明的是,關(guān)于該程序執(zhí)行對(duì)被測(cè)試對(duì)象的性能測(cè)試的具體過程可以參照上述方法實(shí)施例對(duì)應(yīng)部分的描述,本實(shí)施例在此僅以對(duì)被測(cè)試對(duì)象的運(yùn)行時(shí)間的測(cè)試為例進(jìn)行說(shuō)明。
也就是說(shuō),上述程序在捕獲被測(cè)試對(duì)象運(yùn)行過程中觸發(fā)的斷點(diǎn)異常后,具體可以用于:
驗(yàn)證捕獲到的斷點(diǎn)異常的位置是否與記錄的所述入口斷點(diǎn)的位置或所述出口斷點(diǎn)的位置匹配;
當(dāng)捕獲到的斷點(diǎn)異常的位置與記錄的所述入口斷點(diǎn)的位置匹配,在捕獲到的斷點(diǎn)異常的位置中添加入口標(biāo)識(shí),并將捕獲到斷點(diǎn)異常的當(dāng)前時(shí)間作為第一時(shí)間記錄,繼續(xù)捕獲所述被測(cè)試對(duì)象運(yùn)行過程中觸發(fā)的斷點(diǎn)異常;
當(dāng)捕獲到的斷點(diǎn)異常的位置與記錄的所述出口斷點(diǎn)的位置匹配,檢測(cè)捕獲到斷點(diǎn)異常之前的位置中是否存在入口標(biāo)識(shí);
如果不存在,繼續(xù)捕獲所述被測(cè)試對(duì)象運(yùn)行過程中觸發(fā)的斷點(diǎn)異常;
如果存在,將捕獲到斷點(diǎn)異常的當(dāng)前時(shí)間作為第二時(shí)間記錄;
計(jì)算所述第一時(shí)間與所述第二時(shí)間的時(shí)間差,并清除所述被測(cè)試對(duì)象中存在的入口標(biāo)識(shí);
當(dāng)判斷對(duì)所述被測(cè)試對(duì)象的測(cè)試次數(shù)達(dá)到預(yù)設(shè)測(cè)試閾值,利用各次測(cè)試計(jì)算得到的所述時(shí)間差的總時(shí)間以及測(cè)試總次數(shù),計(jì)算每次測(cè)試的平均時(shí)間,并將該平均時(shí)間作為被測(cè)試對(duì)象的運(yùn)行時(shí)間。
綜上,本申請(qǐng)實(shí)施例能夠簡(jiǎn)便、靈活地實(shí)現(xiàn)對(duì)被測(cè)試對(duì)象的性能測(cè)試。
此外,需要說(shuō)明的是,關(guān)于上述各實(shí)施例中,諸如第一、第二等之類的關(guān)系術(shù)語(yǔ)僅僅用來(lái)將一個(gè)操作、單元或模塊與另一個(gè)操作、單元或模塊區(qū)分開來(lái),而不一定要求或者暗示這些單元、操作或模塊之間存在任何這種實(shí)際的關(guān)系或者順序。而且,術(shù)語(yǔ)“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法或者系統(tǒng)不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法或者系統(tǒng)所固有的要素。在沒有更多限制的情況下,由語(yǔ)句“包括一個(gè)……”限定的要素,并不排除在包括所述要素的過程、方法或者系統(tǒng)中還存在另外的相同要素。
本說(shuō)明書中各個(gè)實(shí)施例采用遞進(jìn)的方式描述,每個(gè)實(shí)施例重點(diǎn)說(shuō)明的都是與其他實(shí)施例的不同之處,各個(gè)實(shí)施例之間相同相似部分互相參見即可。對(duì)于實(shí)施例公開的系統(tǒng)而言,由于其與實(shí)施例公開的方法對(duì)應(yīng),所以描述的比較簡(jiǎn)單,相關(guān)之處參見方法部分說(shuō)明即可。
專業(yè)人員還可以進(jìn)一步意識(shí)到,結(jié)合本文中所公開的實(shí)施例描述的各示例的單元及算法步驟,能夠以電子硬件、計(jì)算機(jī)軟件或者二者的結(jié)合來(lái)實(shí)現(xiàn),為了清楚地說(shuō)明硬件和軟件的可互換性,在上述說(shuō)明中已經(jīng)按照功能一般性地描述了各示例的組成及步驟。這些功能究竟以硬件還是軟件方式來(lái)執(zhí)行,取決于技術(shù)方案的特定應(yīng)用和設(shè)計(jì)約束條件。專業(yè)技術(shù)人員可以對(duì)每個(gè)特定的應(yīng)用來(lái)使用不同方法來(lái)實(shí)現(xiàn)所描述的功能,但是這種實(shí)現(xiàn)不應(yīng)認(rèn)為超出本發(fā)明的范圍。
結(jié)合本文中所公開的實(shí)施例描述的方法或算法的步驟可以直接用硬件、處理器執(zhí)行的軟件模塊,或者二者的結(jié)合來(lái)實(shí)施。軟件模塊可以置于隨機(jī)存儲(chǔ)器(RAM)、內(nèi)存、只讀存儲(chǔ)器(ROM)、電可編程ROM、電可擦除可編程ROM、寄存器、硬盤、可移動(dòng)磁盤、CD-ROM、或技術(shù)領(lǐng)域內(nèi)所公知的任意其它形式的存儲(chǔ)介質(zhì)中。
對(duì)所公開的實(shí)施例的上述說(shuō)明,使本領(lǐng)域?qū)I(yè)技術(shù)人員能夠?qū)崿F(xiàn)或使用本發(fā)明。對(duì)這些實(shí)施例的多種修改對(duì)本領(lǐng)域的專業(yè)技術(shù)人員來(lái)說(shuō)將是顯而易見的,本文中所定義的一般原理可以在不脫離本發(fā)明的精神或范圍的情況下,在其它實(shí)施例中實(shí)現(xiàn)。因此,本發(fā)明將不會(huì)被限制于本文所示的這些實(shí)施例,而是要符合與本文所公開的原理和新穎特點(diǎn)相一致的最寬的范圍。