專利名稱:一種程序調(diào)測(cè)系統(tǒng)及用于程序調(diào)測(cè)系統(tǒng)的映射方法
技術(shù)領(lǐng)域:
本發(fā)明涉及軟件調(diào)試與測(cè)試領(lǐng)域,特別涉及針對(duì)C語(yǔ)言開(kāi)發(fā)環(huán)境的軟件調(diào)試與測(cè)試的C語(yǔ)言映射系統(tǒng)及方法。
背景技術(shù):
在軟件開(kāi)發(fā)領(lǐng)域,支持VxWorks實(shí)時(shí)操作系統(tǒng)開(kāi)發(fā)的Tornado編程環(huán)境是眾多嵌入式編程語(yǔ)言中調(diào)測(cè)性能表現(xiàn)最佳的編程環(huán)境之一。Tornado測(cè)試命令解釋模塊工具支持腳本化的被測(cè)變量讀寫(xiě)與被測(cè)函數(shù)調(diào)用,功能比較強(qiáng)大。圖1顯示了Tornado調(diào)測(cè)體系的結(jié)構(gòu)。該調(diào)測(cè)的體系結(jié)構(gòu)包括測(cè)試主機(jī)系統(tǒng)的測(cè)試主機(jī)和目標(biāo)機(jī)系統(tǒng)。目標(biāo)機(jī)系統(tǒng)是被測(cè)的目標(biāo)系統(tǒng)(如PPC單板及運(yùn)行在其上的軟件)。測(cè)試主機(jī)與測(cè)試命令解釋模塊等調(diào)測(cè)模塊經(jīng)目標(biāo)服務(wù)器模塊向目標(biāo)機(jī)系統(tǒng)傳送調(diào)測(cè)命令。測(cè)試代理(Test Agent)接收到命令后實(shí)現(xiàn)調(diào)測(cè)操作如修改變量、調(diào)用函數(shù)、設(shè)置斷點(diǎn)、暫停任務(wù)、復(fù)位單板等。在該體系中,目標(biāo)服務(wù)器中駐留有符號(hào)表。當(dāng)Tornado測(cè)試命令解釋模塊發(fā)出一個(gè)指令要修改在單板運(yùn)行的某個(gè)變量時(shí),先到設(shè)置在測(cè)試主機(jī)端的目標(biāo)機(jī)服務(wù)器查詢?cè)撟兞吭谀繕?biāo)機(jī)中的地址,然后經(jīng)通信連接向目標(biāo)機(jī)中的測(cè)試代理發(fā)送請(qǐng)求,由測(cè)試代理最終實(shí)現(xiàn)該變量修改。
盡管Tornado測(cè)試命令解釋模塊功能強(qiáng)大,但由于使用兩種解釋器即C解釋器和TCL解釋器,并且由于駐留在目標(biāo)機(jī)服務(wù)器中的只有符號(hào)表,沒(méi)有類型表,因而使它的調(diào)測(cè)能力受到不少限制。這些限制主要包括1)由于變量與函數(shù)的類型表未駐留,導(dǎo)致針對(duì)復(fù)合類型的操作難以支持;2)用于調(diào)測(cè)控制的C解釋器與TCL解釋器駐留于測(cè)試主機(jī)端,導(dǎo)致調(diào)測(cè)控制與被測(cè)代碼有緊耦合交互的情況下無(wú)法支持調(diào)測(cè);3)變量讀寫(xiě)與函數(shù)調(diào)用與if、else等控制分別在兩個(gè)腳本語(yǔ)言內(nèi)實(shí)現(xiàn),因此,在測(cè)試命令解釋模塊運(yùn)行調(diào)測(cè)指令時(shí),經(jīng)常要在C解釋器與TCL解釋器之間切換,很煩瑣。兩個(gè)解釋器之間數(shù)據(jù)交換主要通過(guò)全局變量。盡管C解釋器可內(nèi)嵌一個(gè)API來(lái)調(diào)用TCL腳本,TCL腳本也可內(nèi)嵌C解釋器,但在使用上仍然不便,而且運(yùn)行效率低。4)而且,由于上述3)的原因,C解釋器與TCL解釋器屬兩套系統(tǒng),難以在語(yǔ)法語(yǔ)義級(jí)別進(jìn)行融合,增加了使用者的學(xué)習(xí)負(fù)擔(dān),也不利于調(diào)測(cè)功能的擴(kuò)展。
另一方面,第4代白盒測(cè)試方法綜合了軟件白盒測(cè)試的最佳實(shí)踐,反映了現(xiàn)今白盒測(cè)試的發(fā)展方向,屬于公共領(lǐng)域的通用方法論。為了符合第4代白盒測(cè)試方法的要求,需要對(duì)基于Tornado技術(shù)的調(diào)測(cè)體系做如下改進(jìn)1、引入一種支持即時(shí)調(diào)測(cè)的體系,測(cè)試控制與被測(cè)代碼應(yīng)處于同一個(gè)執(zhí)行體內(nèi)。
2、使用一種腳本語(yǔ)言,既描述針對(duì)被測(cè)C變量與函數(shù)的控制(類似于Tornado Shell中的C解釋器),也描述測(cè)試控制(類似于Tornado Shell中的TCL解釋器),這兩類描述須維持相同的語(yǔ)言風(fēng)格。
發(fā)明內(nèi)容
本發(fā)明為了改善當(dāng)前嵌入式軟件普遍存在的調(diào)測(cè)能力不足及測(cè)試效率欠佳的問(wèn)題,并滿足第4代白盒測(cè)試方法的要求,將相關(guān)的測(cè)試方法論應(yīng)用到嵌入式產(chǎn)品的C語(yǔ)言開(kāi)發(fā)領(lǐng)域,而提出一套編程語(yǔ)言映射技術(shù),即將C語(yǔ)言的變量操作、函數(shù)操作映射到一個(gè)腳本語(yǔ)言系統(tǒng),將該腳本語(yǔ)言系統(tǒng)駐留于被測(cè)系統(tǒng)中,使這些腳本語(yǔ)言既實(shí)現(xiàn)腳本化的測(cè)試描述,又能直接操控被測(cè)系統(tǒng)中的變量、函數(shù)等。并且,引入一種支持即時(shí)調(diào)測(cè)的體系,使測(cè)試控制與被測(cè)代碼同處于一個(gè)執(zhí)行體內(nèi)。本發(fā)明使用一種腳本語(yǔ)言既描述針對(duì)被測(cè)C語(yǔ)言的變量與函數(shù)的控制,也描述測(cè)試控制,并保持這兩類描述具有相同風(fēng)格。
根據(jù)本發(fā)明,提供了一種程序調(diào)測(cè)系統(tǒng),包括測(cè)試主機(jī)和目標(biāo)機(jī),所述測(cè)試主機(jī)對(duì)所述目標(biāo)機(jī)中的程序進(jìn)行調(diào)測(cè),其中,所述目標(biāo)機(jī)中包含測(cè)試代理,所述測(cè)試代理包括表生成單元,根據(jù)在被測(cè)試程序的編譯過(guò)程中生成的調(diào)試數(shù)據(jù)庫(kù),生成被測(cè)試程序的符號(hào)表和類型表,和映射支持模塊,根據(jù)所生成的符號(hào)表和類型表,將所述被測(cè)試程序的變量和函數(shù)映射至腳本語(yǔ)言的映射變量和映射函數(shù);所述測(cè)試主機(jī)包括變量容器單元,用于存放所述映射變更和映射函數(shù),將對(duì)所述映射變量的賦值和取值處理轉(zhuǎn)向到所述映射變量針對(duì)其C實(shí)例空間的賦值和取值操作,以及將所述映射函數(shù)的調(diào)用轉(zhuǎn)向到C程序代碼中相應(yīng)函數(shù)的調(diào)用;測(cè)試命令解釋模塊,接收腳本文件格式的測(cè)試命令,利用所述變量容器單元對(duì)所述映射變量和所述映射函數(shù)的轉(zhuǎn)向操作,把所述測(cè)試命令轉(zhuǎn)化為所述目標(biāo)機(jī)能夠處理的命令,傳送給所述目標(biāo)機(jī)的測(cè)試代理。
根據(jù)本發(fā)明的另一方面,提供一種應(yīng)用于程序調(diào)測(cè)系統(tǒng)中的映射方法,所述程序調(diào)測(cè)系統(tǒng)包括測(cè)試主機(jī)和目標(biāo)機(jī),所述測(cè)試主機(jī)對(duì)所述目標(biāo)機(jī)中的程序進(jìn)行調(diào)測(cè),所述目標(biāo)機(jī)中包含測(cè)試代理,所述測(cè)試代理中包含映射支持模塊,所述方法包括1)在所述目標(biāo)機(jī)提供測(cè)試代理;2)所述測(cè)試代理根據(jù)被調(diào)測(cè)程序被編譯后的調(diào)試數(shù)據(jù)庫(kù)產(chǎn)生所述被測(cè)試程序的符號(hào)表和類型表;3)所述測(cè)試代理按照預(yù)定的腳本把所述類型表、符號(hào)表中的變量和函數(shù)都映射至變量容器中,生成腳本語(yǔ)言的映射變量和映射函數(shù)。
通過(guò)本發(fā)明的系統(tǒng)和方法,可以將對(duì)軟件調(diào)測(cè)的運(yùn)算處理分配到測(cè)試主機(jī)和目標(biāo)機(jī)。由測(cè)試主機(jī)處理被測(cè)程序的測(cè)試?yán)哪_本編寫(xiě)和解釋。駐留在目標(biāo)機(jī)的腳本系統(tǒng)完成對(duì)被測(cè)端C語(yǔ)言變量以及函數(shù)的映射和控制。
腳本的映射基于三個(gè)方面一、根據(jù)目標(biāo)機(jī)通過(guò)C語(yǔ)言編譯器生成的PDB(Program Data Base程序數(shù)據(jù)庫(kù))或GDB(GNU調(diào)試程序,它是GCC編譯器附帶的配套調(diào)試程序)而產(chǎn)生的符號(hào)表和類型表;二、在測(cè)試代理端的腳本對(duì)映射對(duì)象的定義;三、生成全局的變量容器,使其包容相應(yīng)的變量和函數(shù)。當(dāng)用戶測(cè)試的命令從測(cè)試主機(jī)傳送到目標(biāo)機(jī)時(shí),由于本發(fā)明使測(cè)試控制與測(cè)試編碼在一處并互相兼容的特點(diǎn),從而能夠靈活有效地進(jìn)行即時(shí)調(diào)控。
本發(fā)明的映射技術(shù)有效地提升了軟件產(chǎn)品的調(diào)試能力與白盒測(cè)試能力。與Tornado測(cè)試命令解釋模塊相比,本發(fā)明通過(guò)在測(cè)試代理的腳本系統(tǒng)中包含了調(diào)測(cè)模塊和映射模塊,使得測(cè)試控制與被測(cè)代碼都在一個(gè)系統(tǒng)中。調(diào)測(cè)控制與被測(cè)代碼耦合更緊密。緊耦合交互不會(huì)有兩個(gè)系統(tǒng)因通信連接帶來(lái)的時(shí)延,并且測(cè)試控制過(guò)程的復(fù)雜性也被降低了。因此,被測(cè)系統(tǒng)中的變量與函數(shù)可直接被腳本操作。在腳本中實(shí)現(xiàn)變量讀寫(xiě)與函數(shù)調(diào)用的能力幾乎接近于在被測(cè)系統(tǒng)中編寫(xiě)C代碼,較好地仿真了C語(yǔ)法規(guī)則,不留死角。另外測(cè)試所需的實(shí)時(shí)控制能力也得到保障,特別適用于實(shí)時(shí)操作系統(tǒng)下的調(diào)測(cè)。
綜上所述,本發(fā)明的優(yōu)點(diǎn)在于通過(guò)采用一種映射技術(shù),使調(diào)測(cè)腳本可以直接控制被測(cè)系統(tǒng)的行為。由于腳本的在線定義、在線執(zhí)行的特性,大大提高了調(diào)測(cè)腳本的開(kāi)發(fā)效率,有力保證了第4代白盒測(cè)試方法要求的在線測(cè)試與灰盒調(diào)測(cè)的工具化實(shí)現(xiàn)。相對(duì)于Tornado測(cè)試命令解釋模塊,調(diào)測(cè)效率得到提高。另外,在測(cè)試中不必經(jīng)常在兩種腳本語(yǔ)言之間切換,數(shù)據(jù)傳遞與控制傳遞更加自由。
因此,本發(fā)明可提升嵌入式軟件的調(diào)測(cè)能力,降低測(cè)試表述的學(xué)習(xí)門檻,并大幅提升調(diào)測(cè)腳本的開(kāi)發(fā)效率。
圖1顯示了現(xiàn)有的Tornado調(diào)測(cè)體系結(jié)構(gòu);圖2顯示了Tornado Shell的調(diào)試框架;圖3顯示了本發(fā)明的框架結(jié)構(gòu);圖4是本發(fā)明中測(cè)試代理的層次結(jié)構(gòu);圖5是映射支持模塊的初始化過(guò)程;圖6是映射實(shí)例生成過(guò)程;圖7示例性地顯示了一個(gè)映射實(shí)例的TData與TType對(duì)應(yīng)關(guān)系;圖8示例性地顯示了根據(jù)本發(fā)明的映射實(shí)例的屬性。
具體實(shí)施例方式
下面將結(jié)合附圖對(duì)用于嵌入式軟件調(diào)測(cè)的程序語(yǔ)言映射方法及應(yīng)用該方法的程序調(diào)測(cè)系統(tǒng)給予詳細(xì)的說(shuō)明。為便于說(shuō)明,以下將以C語(yǔ)言為例進(jìn)行說(shuō)明。但本發(fā)明的構(gòu)思與方案也可以用于其它語(yǔ)言的程序,例如C++語(yǔ)言。
現(xiàn)有的測(cè)試技術(shù)是將主要的計(jì)算部分通過(guò)測(cè)試主機(jī)完成,通過(guò)命令解釋模塊來(lái)解釋用戶所輸入的指令,并將解釋后的指令傳達(dá)到目標(biāo)服務(wù)器。目標(biāo)服務(wù)器進(jìn)行操作,由目標(biāo)機(jī)的測(cè)試代理來(lái)完成指令。而在本發(fā)明中,則是把原來(lái)在測(cè)試主機(jī)的一些計(jì)算和運(yùn)行操作移到了目標(biāo)機(jī)。
為了實(shí)現(xiàn)本發(fā)明的目的,對(duì)本發(fā)明中使用的腳本語(yǔ)言需要在表達(dá)方式上滿足以下描述方式1、指針操作與C語(yǔ)言風(fēng)格保持一致,包括“->”操作符使用方法,例如用“pStruct->Member1”描述某結(jié)構(gòu)指針指向某成員,也包括指針移動(dòng)的規(guī)則,例如“pInt+2”,將int指針向后移動(dòng)2,實(shí)際指向?qū)⑵?*sizeof(int)個(gè)字節(jié)。
2、存取數(shù)組成員的方式與C語(yǔ)言的風(fēng)格保持一致。使用中括號(hào)按下標(biāo)取子成員,例如用“ArrayVar[2]”表示存取數(shù)組變量ArrayVar的第3個(gè)子成員。
3、存取struct與union成員的方式與C語(yǔ)言風(fēng)格保持一致。使用點(diǎn)號(hào)區(qū)隔struct/union變量與其成員,比如某Struct類型定義了兩個(gè)子成員Member1與Member2,存取該類型變量StruVar第一個(gè)子成員的描述形式為“StruVar.Member1”。
4、支持下列與C語(yǔ)言含義一致的二元操作,操作符表達(dá)方式與優(yōu)先級(jí)都一致。
以上涉及取值描述的應(yīng)同樣適應(yīng)賦值描述,如“pStruct->Member1=3”、“ArrayVar[2]=3”、“StruVar.Member1=3”。
同時(shí),為達(dá)到高效率測(cè)試及支持必要的擴(kuò)展能力,駐留在測(cè)試代理中腳本語(yǔ)言優(yōu)選應(yīng)能滿足如下要求1、腳本中的所有變量與函數(shù),能實(shí)現(xiàn)生存周期自動(dòng)管理,多數(shù)腳本語(yǔ)言都具備本項(xiàng)特性,通常使用引用計(jì)次技術(shù)實(shí)現(xiàn)生存周期自動(dòng)管理。
2、支持常見(jiàn)的數(shù)據(jù)類型,如4字節(jié)整數(shù)、單精度或雙精度浮點(diǎn)數(shù)、字串、數(shù)組序列、字典等。
3、支持if、else、while等基本的分支與循環(huán)控制。
4、支持函數(shù)定義擴(kuò)展與模塊定義擴(kuò)展。
5、支持類定義與類繼承。這是由于本發(fā)明使用的映射規(guī)則依賴于特定的類定義格式。因此需要類定義的功能。
6、在不重起腳本系統(tǒng)前提下,可在線增刪變量、函數(shù),以及類的定義,現(xiàn)在技術(shù)中已有許多腳本語(yǔ)言都能支持這一點(diǎn)。
滿足上述要求的腳本系統(tǒng)都是可以從現(xiàn)有技術(shù)中得到的,如Python、Ruby等,它們都支持在線增加或刪除變量定義或函數(shù)定義。
圖3是根據(jù)本發(fā)明的腳本解釋器驅(qū)動(dòng)測(cè)試系統(tǒng)的示意方框圖。如圖所示,測(cè)試主機(jī)1包含測(cè)試外殼(Test Shell)11,用于發(fā)起調(diào)測(cè)命令,以及提供開(kāi)發(fā)、測(cè)試的平臺(tái)。測(cè)試主機(jī)端可以采用個(gè)人桌面系統(tǒng)(如Windows、Linux等)。測(cè)試外殼11可以是其中的一個(gè)可執(zhí)行程序。
目標(biāo)機(jī)2通常是被測(cè)單板,或者是一個(gè)仿真程序。目標(biāo)機(jī)2中駐留有測(cè)試代理(Test Agent)21。該測(cè)試代理21可以是一個(gè)腳本語(yǔ)言系統(tǒng)。在本發(fā)明中,對(duì)腳本語(yǔ)言的種類并沒(méi)有限定,只要能滿足本發(fā)明規(guī)定的映射規(guī)則即可。在目標(biāo)機(jī)2的測(cè)試代理21內(nèi)包含有被測(cè)試程序的符號(hào)表和類型表。關(guān)于符號(hào)表和類型表將在后文中說(shuō)明。
目標(biāo)機(jī)2可以與測(cè)試主機(jī)1共用同一臺(tái)設(shè)備,例如計(jì)算機(jī)。在此情況下,被測(cè)程序是exe程序,測(cè)試主機(jī)也是exe程序,兩者可以同時(shí)運(yùn)行在一臺(tái)機(jī)器的操作系統(tǒng)(如windows這樣的支持多進(jìn)程的平臺(tái))上。
測(cè)試主機(jī)1的測(cè)試外殼11與測(cè)試代理21具有通信連接。此連接的通信方式可以是共享內(nèi)存通信(對(duì)于目標(biāo)機(jī)與測(cè)試主機(jī)共用同一臺(tái)計(jì)算機(jī)的情況、TCP/IP通信,或是其它如串口通信等形式。
如圖4所示,測(cè)試代理21包括腳本系統(tǒng)211和通訊單元212。通訊單元212負(fù)責(zé)處理測(cè)試代理21與測(cè)試主機(jī)1的測(cè)試外殼11的上述通信連接。
腳本系統(tǒng)211包括內(nèi)嵌調(diào)測(cè)支持模塊2111和映射支持模塊2112。內(nèi)嵌調(diào)測(cè)支持模塊2111是常規(guī)的調(diào)測(cè)應(yīng)用編程接口(API)的集合,提供諸如復(fù)位目標(biāo)機(jī)、啟動(dòng)或停止某任務(wù)、設(shè)置斷點(diǎn)、刪除斷點(diǎn)等功能。映射支持模塊2112用于實(shí)現(xiàn)被測(cè)系統(tǒng)中的C語(yǔ)言變量與函數(shù)向腳本系統(tǒng)映射的功能。在完成映射后,腳本系統(tǒng)211中生成與C語(yǔ)言的變量和函數(shù)同名的映射變量與映射函數(shù)。
為了實(shí)現(xiàn)本發(fā)明的目的,要求測(cè)試主機(jī)1和目標(biāo)機(jī)2都應(yīng)該有對(duì)腳本文件的處理能力。為此,測(cè)試主機(jī)1的測(cè)試外殼11中包含了一個(gè)命令行編輯輸入單元以及命令解釋模塊(未示出),命令行編輯輸入單元用于支持用戶輸入腳本文件格式的調(diào)測(cè)命令,命令解釋模塊把輸入的調(diào)測(cè)命令轉(zhuǎn)化為能夠由測(cè)試代理21中的腳本解釋器解釋執(zhí)行的測(cè)試命令,并傳送給目標(biāo)機(jī)2的測(cè)試代理21。測(cè)試代理21中相應(yīng)地包含一個(gè)腳本解釋器(未圖示),用于實(shí)現(xiàn)測(cè)試控制。腳本解釋器接收命令解釋模塊傳送來(lái)的測(cè)試命令,對(duì)該命令進(jìn)行解釋并實(shí)施相應(yīng)動(dòng)作。實(shí)際傳遞的格式是中間碼格式,類似Java虛擬機(jī)解釋字節(jié)碼命令一樣,這個(gè)中間碼格式也稱偽編譯碼。
當(dāng)目標(biāo)機(jī)2執(zhí)行測(cè)試并反饋結(jié)果、或在測(cè)試過(guò)程中發(fā)出了打印信息,測(cè)試主機(jī)1的測(cè)試外殼11將會(huì)接收該結(jié)果或信息并進(jìn)行處理。
參見(jiàn)圖5,首先,目標(biāo)機(jī)2要進(jìn)行初始化處理。當(dāng)測(cè)試主機(jī)1啟動(dòng)命令解釋模塊的程序時(shí),目標(biāo)機(jī)2啟動(dòng)被測(cè)程序(S501)。然后,目標(biāo)機(jī)2初始化其中包含的腳本系統(tǒng)211,包括設(shè)置測(cè)試代理21的相關(guān)配置(S502)。在此過(guò)程中,測(cè)試代理21的表生成單元(未示出)從目標(biāo)機(jī)2被測(cè)試的軟件在其最后一次編譯后生成的GDB或PDB調(diào)試數(shù)據(jù)庫(kù)中提取與被映射的變量/函數(shù)相關(guān)的信息,生成符號(hào)表和類型表(后文將要說(shuō)明),并記錄在測(cè)試代理21中(S503)。然后,測(cè)試代理21的腳本系統(tǒng)211把符號(hào)表及類型表映射到一個(gè)全局的變量容器(S504)。按照預(yù)定的腳本把類型表、符號(hào)表的符號(hào)都映射至變量容器中(S505)。該操作將被測(cè)程序中的變量與函數(shù)在腳本系統(tǒng)中描述為映射對(duì)象(即腳本的TData類對(duì)象)。由于轉(zhuǎn)換全部符號(hào)會(huì)導(dǎo)致CPU與內(nèi)存資源浪費(fèi),因此根據(jù)本發(fā)明的一個(gè)實(shí)施方式,不對(duì)符號(hào)作一次性全部轉(zhuǎn)換,而僅根據(jù)測(cè)試需要來(lái)映射。例如,運(yùn)行測(cè)試腳本時(shí),腳本包含哪些映射的變量與函數(shù),就動(dòng)態(tài)轉(zhuǎn)換那些變量或函數(shù),或者由用戶自行確定規(guī)則來(lái)按需轉(zhuǎn)換,比如所有外部定義的符號(hào)都不作映射。
此后,進(jìn)行被測(cè)系統(tǒng)的正常測(cè)試(S506)。在測(cè)試主機(jī)1,用戶使用類似C語(yǔ)言的腳本文件對(duì)傳送來(lái)的編碼進(jìn)行操作。測(cè)試外殼11中的命令解釋模塊解釋用戶的輸入,并發(fā)出相應(yīng)的測(cè)試指令。該命令被傳送到測(cè)試目標(biāo)機(jī)2,并在其腳本系統(tǒng)211中運(yùn)行,從而得到按編碼邏輯所得到的測(cè)試運(yùn)行結(jié)果。這個(gè)測(cè)試運(yùn)行結(jié)果可被反饋到測(cè)試主機(jī)1,并顯示給用戶。在上述方法中,由于可以在線地編寫(xiě)測(cè)試腳本,直觀地查看或修改被測(cè)變量、調(diào)用被測(cè)函數(shù),所見(jiàn)即所得,可以馬上看到測(cè)試結(jié)果,也可馬上改進(jìn)測(cè)試,從而提高了測(cè)試的效率。
因?yàn)镃語(yǔ)言編碼對(duì)其數(shù)據(jù)的結(jié)構(gòu)/類型要求很嚴(yán)格,作為它的映射后的腳本,必須能夠支持基本的C編程的功能和要求。
為了實(shí)現(xiàn)上述對(duì)C語(yǔ)言編碼的映射,根據(jù)本發(fā)明,在目標(biāo)機(jī)2的測(cè)試代理21中駐留了被測(cè)試程序的符號(hào)表和數(shù)據(jù)類型表。這兩個(gè)表將直接支持本發(fā)明規(guī)定的映射規(guī)則的實(shí)現(xiàn)。本發(fā)明的映射方法依賴于對(duì)目標(biāo)機(jī)系統(tǒng)的各種符號(hào)及其類型信息的收集與分析。調(diào)試數(shù)據(jù)庫(kù)在編譯過(guò)程中由編譯器產(chǎn)生,例如Visual C/C++編譯過(guò)程中會(huì)產(chǎn)生PDB文件,GCC在編譯時(shí)也將GDB調(diào)試信息編譯到目標(biāo)程序中。如上所述,這些信息可在編譯過(guò)程中由編譯器產(chǎn)生的調(diào)試數(shù)據(jù)庫(kù)中提取,根據(jù)所提取的信息相應(yīng)生成符號(hào)表和類型表。
不同的C編譯器生成的調(diào)試數(shù)據(jù)庫(kù)格式并不一樣。本發(fā)明通過(guò)對(duì)類型表和符號(hào)表的生成達(dá)到了對(duì)不同格式的統(tǒng)一。類型表記錄被測(cè)系統(tǒng)定義過(guò)的各種類型。這些類型必須包括主類型信息、子類型信息、以及占用字節(jié)數(shù)。表1是類型定義格式的示例表1
同時(shí)要確保類型表下各欄目具有唯一性,即,由相同的主類型與子類型以及占相同字節(jié)數(shù)而構(gòu)成的類型項(xiàng)只能存在一個(gè)。
符號(hào)表記錄變量或函數(shù)的地址值及其類型ID。其中符號(hào)地址有兩種形式,既可以記錄絕對(duì)地址,也可以記錄相對(duì)地址。例如,存取函數(shù)內(nèi)局部變量或傳入?yún)?shù)時(shí),則使用相對(duì)于當(dāng)前棧頂位置的偏移值。再如,某變量在另一變量空間下存在,其地址也按該另一變量的地址加上一個(gè)偏移來(lái)表達(dá)。
符號(hào)來(lái)源有兩種方式,一是來(lái)源于另一映射對(duì)象,二是來(lái)源于某絕對(duì)地址。后者是描述變量或函數(shù)的常規(guī)方式,前者常在將同一內(nèi)存空間看作多種類型的變量進(jìn)行操作時(shí)使用,例如強(qiáng)制類型轉(zhuǎn)換,是將某字串?dāng)?shù)組的某一偏移看成整數(shù)類型變量。
在生成了符號(hào)表和類型表之后,為了腳本的操作方便,系統(tǒng)要定義與表中數(shù)據(jù)相應(yīng)的轉(zhuǎn)化腳本類對(duì)象,即TType類對(duì)象對(duì)應(yīng)于類型表,TData類對(duì)象對(duì)應(yīng)于符號(hào)表。在TType類對(duì)象定義的實(shí)例化數(shù)據(jù)要包含如下信息該類型唯一的標(biāo)識(shí),類型主類別信息,類型子類別信息,類型大小。各個(gè)符號(hào)映射為TData類定義的實(shí)例化數(shù)據(jù),要包含以下信息該符號(hào)對(duì)應(yīng)的類型ID,符號(hào)的來(lái)源,相對(duì)于來(lái)源的偏址,是否是自動(dòng)釋放內(nèi)存。
表格內(nèi)容的映射過(guò)程按圖6進(jìn)行。首先,腳本系統(tǒng)211從符號(hào)表里找出需要的符號(hào)(包括變量和函數(shù))信息,如符號(hào)名稱,符號(hào)的類型ID及符號(hào)地址(S601)。然后腳本系統(tǒng)211通過(guò)該類型ID查找相應(yīng)的類型是否有生成的TType類對(duì)象,若沒(méi)有則先創(chuàng)建該TType類對(duì)象,即通過(guò)定義TData或TType類對(duì)象,調(diào)用類定義的建構(gòu)函數(shù)來(lái)創(chuàng)建這個(gè)類對(duì)象的實(shí)例(S602)。最后,根據(jù)該符號(hào)的來(lái)源、所屬的TType對(duì)象、地址偏移及是否自動(dòng)釋放內(nèi)存等信息來(lái)創(chuàng)建被映射符號(hào)的TData類對(duì)象(S603)。
在創(chuàng)建的映射實(shí)例包括映射變量與映射函數(shù)時(shí),首先要有相應(yīng)的TType對(duì)象指明類型信息。當(dāng)類型表中的各項(xiàng)都轉(zhuǎn)化成TType類實(shí)例后,原有類型信息表不再有用,其占用的資源可釋放,而用新生成的各個(gè)TType類實(shí)例組成一個(gè)新表,即TType類型表。映射變量與映射函數(shù)都是TData類實(shí)例。如圖7所示,每個(gè)TData類實(shí)例使用該符號(hào)對(duì)應(yīng)的類型ID(Data type)指示它使用TType類型表中的哪個(gè)類型。
需要注意,TType類的對(duì)象可能是嵌套引用的。某些復(fù)合類型如struct/union/指針等包含了子類型,而且同一子類型可能被多個(gè)復(fù)合類型引用。所以,在創(chuàng)建每個(gè)TType對(duì)象時(shí),該類型涉及的其它類型也同時(shí)被創(chuàng)建。
由于測(cè)試主機(jī)和目標(biāo)機(jī)的系統(tǒng)資源是有限的,為了更有效地進(jìn)行測(cè)試,在相應(yīng)時(shí)期對(duì)使用資源的處理是十分重要的。根據(jù)本發(fā)明,為了有效利用系統(tǒng)資源,變量、函數(shù)、類對(duì)象等在腳本語(yǔ)言中作為一個(gè)實(shí)體存在,實(shí)現(xiàn)了生存周期自動(dòng)管理。這些實(shí)體所占用的資源會(huì)自動(dòng)申請(qǐng)、自動(dòng)釋放。映射數(shù)據(jù)作為腳本類對(duì)象,也支持它所涉及資源的自動(dòng)申請(qǐng)與釋放。
例如,腳本系統(tǒng)21要?jiǎng)?chuàng)建一個(gè)映射變量buff,它是一個(gè)長(zhǎng)度為24字節(jié)的字串?dāng)?shù)組,這時(shí)腳本系統(tǒng)21會(huì)向目標(biāo)機(jī)2自動(dòng)申請(qǐng)它占用的內(nèi)存,包括buff變量作為腳本TData類實(shí)例要占用的內(nèi)存空間,以及字串?dāng)?shù)組的24字節(jié)空間。為描述方便,在本發(fā)明中,將前一類空間稱為腳本實(shí)例空間,將后一類空間稱為C實(shí)例空間。當(dāng)新創(chuàng)建的映射變量的生存周期結(jié)束時(shí),這兩種空間都將被自動(dòng)釋放。
但是,由于編程的復(fù)雜性,腳本實(shí)例空間與C實(shí)例空間并不總是同時(shí)申請(qǐng)或同時(shí)釋放的。例如對(duì)于被測(cè)系統(tǒng)的全局變量,其占用空間是靜態(tài)分配的,全局變量的映射實(shí)例在生存周期結(jié)束時(shí),應(yīng)只釋放腳本實(shí)例空間,而不應(yīng)釋放C實(shí)例空間。再如,使用腳本文件中創(chuàng)建一個(gè)映射變量a后,這個(gè)變量的腳本實(shí)例空間與C實(shí)例空間應(yīng)同時(shí)申請(qǐng)或釋放。但是,如果把這個(gè)映射變量a看成另一類型的映射變量b,例如C語(yǔ)言中的強(qiáng)制類型轉(zhuǎn)換時(shí),將同一地址空間下某變量,看成另一類型的變量,則創(chuàng)建變量b時(shí)應(yīng)新申請(qǐng)腳本實(shí)例空間,但不應(yīng)重復(fù)申請(qǐng)C實(shí)例空間。另外,當(dāng)變量a或變量b被刪除時(shí),不管先刪除哪一個(gè),都應(yīng)保證尚在使用的另一個(gè)變量所操作的C實(shí)例空間還有效。也即C實(shí)例空間可被多個(gè)映射變量共享,只有該C實(shí)例空間所全部涉及的映射變量都釋放了,這個(gè)C實(shí)例空間才自動(dòng)被釋放。此外,映射變量使用的C實(shí)例空間還需配合測(cè)試,必要情況下可修改其中的標(biāo)志。例如為映射變量設(shè)置Autofree屬性,該屬性為TRUE表示該映射變量的C實(shí)例空間是隨它的腳本實(shí)例空間釋放而釋放的,否則屬性取值為FALSE,表示C實(shí)例空間不隨腳本實(shí)例空間釋放而釋放。
為實(shí)現(xiàn)上述目的,根據(jù)本發(fā)明的一個(gè)實(shí)施方式,對(duì)映射實(shí)例設(shè)置了3個(gè)屬性。圖8顯示了映射實(shí)例的一個(gè)示例。如圖8所示,該屬性包括是否自動(dòng)釋放內(nèi)存(Autofree)、符號(hào)來(lái)源(Owner)、相對(duì)于來(lái)源的偏移地址(Offset)。其中“是否自動(dòng)釋放內(nèi)存”的屬性用于指示該映射變量的C實(shí)例空間是否跟隨腳本實(shí)例空間一起釋放。“符號(hào)來(lái)源”用于指示該映射實(shí)例的歸屬對(duì)象,其取值既可以是某絕對(duì)地址值,也可以是另一個(gè)映射實(shí)例。相對(duì)于來(lái)源的偏移地址用于指示本映射實(shí)例所用C實(shí)例空間的起始地址相對(duì)于其符號(hào)來(lái)源指示的空間地址的偏移量是多少。由于腳本語(yǔ)言具備生存周期自動(dòng)管理特性,所以如果使符號(hào)來(lái)源屬性指示另一映射實(shí)例,就實(shí)現(xiàn)了同一C實(shí)例空間被多個(gè)映射實(shí)例共用時(shí)也能夠?qū)崿F(xiàn)資源的自動(dòng)管理。
在這些初始階段的步驟完成后,系統(tǒng)還要生成一個(gè)全局的變量容器。該全局變量容器用于包含所有的變量和函數(shù),并將它們置于統(tǒng)一的平臺(tái)下。變量容器能捕獲針對(duì)該實(shí)例的屬性取值與賦值的操作,并根據(jù)特定情況進(jìn)行操作轉(zhuǎn)義。容器本質(zhì)上也是腳本的類對(duì)象,只不過(guò)存取它的屬性時(shí),系統(tǒng)會(huì)做特定的截獲處理。
例如,參考下式定義的變量容器vc=newVarContainer();vc.Var3=MapString(“Another string”);vc.Var3=“Change value”;vc.Var4=MapString(“It is example!”);vc.Var4=vc.Var3;
在這個(gè)例子中,第3行和最后一行分別是針對(duì)Var3的賦值和取值,最后一行是按照C語(yǔ)言風(fēng)格描述的。為實(shí)現(xiàn)這一點(diǎn),變量容器下的映射變量的取值和賦值將進(jìn)行轉(zhuǎn)義,如下兩條語(yǔ)句vc.Var3=“Change value”;vc.Var4=vc.Var3;等同于vc.Var3.setValue(“Change value”);vc.Var4.setValue(vc.Var3.getValue());可以看到,vc.Var3=“Change value”是合乎C風(fēng)格的賦值,而vc.Var3.setValue(“Change value”)是調(diào)用,不是賦值,遠(yuǎn)離C風(fēng)格了。
為支持轉(zhuǎn)義,腳本語(yǔ)言本身的類方法操作要支持定向功能,定向后使用賦值語(yǔ)句最終執(zhí)行這個(gè)調(diào)用語(yǔ)句(vc.Var3.setValue(“Change value”))。
變量容器除支持以上取值與賦值轉(zhuǎn)義外,還要支持按腳本方式的變量賦值,即用指定的值代替變量原有值,而不管原有值是不是映射變量。例如vc.Var4=MapString(“It is example!”);setVcValue(vc,“Var4”,“Another string”);在這個(gè)例子中,第一條語(yǔ)句在變量容器下創(chuàng)建字串映射變量Var4,第二條語(yǔ)句將這個(gè)Var4替換成腳本的字串值。該句執(zhí)行后,Var4不再是映射變量了,而是像常規(guī)腳本變量那樣賦值,其類型是動(dòng)態(tài)變化的。為此,本發(fā)明要求提供用于動(dòng)態(tài)賦值的API函數(shù)(類似于本例的setVcValue)。
變量容器的使用對(duì)于函數(shù)的調(diào)用也是重要的。例如,要實(shí)現(xiàn)cdecl與stdcall調(diào)用,在TData類中定義添加callCdecl與callStdcall兩個(gè)方法,在腳本中按如下方式調(diào)用C函數(shù)vc.result1=vc.func1.callCdecl(IntType,3,“example”);vc.result2=vc.func2.callStdcall(CharType,‘A’,‘B’);這兩個(gè)方法都要求用第一個(gè)參數(shù)指明該調(diào)用的返回值類型,其它參數(shù)依次是完成本次C調(diào)用的各參數(shù)值。由這兩個(gè)方法發(fā)起調(diào)用沒(méi)有基于一種函數(shù)原型,使用有點(diǎn)麻煩,因?yàn)檎{(diào)用時(shí)要指定返回值類型,而且各傳入?yún)?shù)的類型是否匹配、參數(shù)個(gè)數(shù)是否正確都無(wú)法檢查。為改進(jìn)這一點(diǎn),在本發(fā)明中對(duì)TData添加了對(duì)_call_調(diào)用的支持,其使用方法如下vc.result1=vc.func1._call_(3,“example”);vc.result2=vc.func2._call_(‘A’,‘B’);為了讓描述方法更簡(jiǎn)單,本發(fā)明定義腳本類的支持內(nèi)嵌call轉(zhuǎn)向功能,從而把上面的腳本改寫(xiě)成如下方式vc.result1=vc.func1(3,“example”);vc.result2=vc.func2(‘A’,‘B’);改寫(xiě)后執(zhí)行效果是等同的,即當(dāng)類對(duì)象自身作為函數(shù)去調(diào)用時(shí),系統(tǒng)自動(dòng)將它轉(zhuǎn)向到該對(duì)象的_call_方法。一些現(xiàn)有的腳本語(yǔ)言,如Python與CSE可支持這種轉(zhuǎn)向。本發(fā)明借助該機(jī)制實(shí)現(xiàn)新的應(yīng)用,即,讓映射函數(shù)(是腳本實(shí)例)調(diào)用與C語(yǔ)言在表達(dá)上保持一致,如vc.func._call_(3,“example”)未保持一致,而vc.func(3,“example”)是一致的。至此,使用腳本調(diào)用C函數(shù)的風(fēng)格就與C語(yǔ)言風(fēng)格一致了。
除了上述常規(guī)的cdecl與stdcall固定參數(shù)類型的調(diào)用,本發(fā)明還需要支持cdecl風(fēng)格的變長(zhǎng)參數(shù)調(diào)用,例如變長(zhǎng)參數(shù)函數(shù)MyPrint的原型為“void MyPrint(char*format,…)”,根據(jù)本發(fā)明,可以按如下方式調(diào)用它vc.result=vc.MyPrint.callCdecl(“name%s”,“george”);在此,變長(zhǎng)參數(shù)調(diào)用要在C函數(shù)調(diào)用發(fā)起前,按參數(shù)傳入值組裝成壓棧數(shù)據(jù)。然后模擬C語(yǔ)言調(diào)用,獲取模擬調(diào)用的返回值。
如果映射函數(shù)有返回值,則調(diào)用映射函數(shù)應(yīng)返回一個(gè)映射變量。即原C函數(shù)的返回類型不為void時(shí),取它的類型及返回的數(shù)值,生成映射變量。
權(quán)利要求
1.程序調(diào)測(cè)系統(tǒng),包括測(cè)試主機(jī)和目標(biāo)機(jī),所述測(cè)試主機(jī)對(duì)所述目標(biāo)機(jī)的程序進(jìn)行調(diào)測(cè),其中,所述目標(biāo)機(jī)中包含測(cè)試代理,所述測(cè)試代理包括表生成單元,根據(jù)在被測(cè)試程序的編譯過(guò)程中生成的調(diào)試數(shù)據(jù)庫(kù),生成被測(cè)試程序的符號(hào)表和類型表,和映射支持模塊,根據(jù)所生成的符號(hào)表和類型表,將所述被測(cè)試程序的變量和函數(shù)映射至腳本語(yǔ)言的映射變量和映射函數(shù);所述測(cè)試主機(jī)包括變量容器單元,用于存放所述映射變更和映射函數(shù),將對(duì)所述映射變量的賦值和取值處理轉(zhuǎn)向到所述映射變量針對(duì)其C實(shí)例空間的賦值和取值操作,以及將所述映射函數(shù)的調(diào)用轉(zhuǎn)向到C程序代碼中相應(yīng)函數(shù)的調(diào)用;測(cè)試命令解釋模塊,接收腳本文件格式的測(cè)試命令,利用所述變量容器單元對(duì)所述映射變量和所述映射函數(shù)的轉(zhuǎn)向操作,把所述測(cè)試命令轉(zhuǎn)化為所述目標(biāo)機(jī)能夠處理的命令,傳送給所述目標(biāo)機(jī)的測(cè)試代理。
2.根據(jù)權(quán)利要求1所述的程序調(diào)測(cè)系統(tǒng),其中所述類型表包括所述被測(cè)程序中各類型的主類型、子類型、以及占用字節(jié)數(shù);所述符號(hào)表記錄被測(cè)程序中各變量與函數(shù)的符號(hào)地址與類型ID。
3.根據(jù)權(quán)利要求2所述的程序調(diào)測(cè)系統(tǒng),其中所述符號(hào)地址是絕對(duì)地址或相對(duì)地址,所述相對(duì)地址包括相對(duì)于當(dāng)前棧頂?shù)钠浦怠⒒蛳鄬?duì)于另一變量的偏移值。
4.根據(jù)權(quán)利要求2所述的C語(yǔ)言映射系統(tǒng),其中所述類型表中具有相同的主類型與子類型和相同字節(jié)數(shù)的類型項(xiàng)是唯一的。
5.根據(jù)權(quán)利要求1-4任一項(xiàng)所述的程序調(diào)測(cè)系統(tǒng),其中所述變量函數(shù)的映射產(chǎn)生映射實(shí)例作為腳本語(yǔ)言的TData對(duì)象,所述TData對(duì)象包括如下屬性用于指示所述映射實(shí)例的數(shù)據(jù)類型的屬性;用于指示所述映射實(shí)例的C實(shí)例空間是否跟隨腳本實(shí)例空間一起釋放的屬性;用于指示所述映射實(shí)例的C實(shí)例空間的歸屬對(duì)象的屬性;和用于指示所述映射實(shí)例使用的C實(shí)例空間相對(duì)其歸屬對(duì)象的偏移的屬性。
6.一種應(yīng)用于程序調(diào)測(cè)系統(tǒng)中的映射方法,所述程序調(diào)測(cè)系統(tǒng)包括測(cè)試主機(jī)和目標(biāo)機(jī),所述測(cè)試主機(jī)對(duì)所述目標(biāo)機(jī)中的程序進(jìn)行調(diào)測(cè)所述方法包括1)在所述目標(biāo)機(jī)提供測(cè)試代理;2)所述測(cè)試代理根據(jù)被調(diào)測(cè)程序被編譯后的調(diào)試數(shù)據(jù)庫(kù)產(chǎn)生所述被測(cè)試程序的符號(hào)表和類型表;3)所述測(cè)試代理按照預(yù)定的腳本把所述類型表、符號(hào)表中的變量和函數(shù)都映射至變量容器中,生成腳本語(yǔ)言的映射變量和映射函數(shù)。
7.根據(jù)權(quán)利要求6所述的方法,其中所述映射步驟包括從符號(hào)表中確定待映射的變量符號(hào)的信息,包括變量符號(hào)的名稱、類型ID、和符號(hào)地址;根據(jù)所述信息中包含的符號(hào)類型所對(duì)應(yīng)的腳本對(duì)象類型,確定待映射的變量符號(hào)的屬性,所述屬性包括符號(hào)的來(lái)源、偏移地址、以及是否自動(dòng)釋放內(nèi)存;和根據(jù)所述變量符號(hào)的信息和屬性,創(chuàng)建所述符號(hào)的映射實(shí)例,其中,所述確定待映射的變量符號(hào)的信息的步驟包括確定所述變量符號(hào)的類型是否有相應(yīng)的腳本對(duì)象的類型;如果沒(méi)有所述相應(yīng)的腳本類對(duì)象的類型,則創(chuàng)建該類型。
8.根據(jù)權(quán)利要求7所述的方法,其中所述被測(cè)試程序?yàn)镃語(yǔ)言程序,所述映射實(shí)例自動(dòng)管理資源空間,所述資源空間包括C實(shí)例空間和腳本實(shí)例空間,所述自動(dòng)管理包括腳本實(shí)例空間與C實(shí)例空間同時(shí)申請(qǐng)與釋放;全局變量的資源空間自動(dòng)管理所述C實(shí)例空間不隨所述腳本實(shí)例空間一起申請(qǐng)和釋放;由一個(gè)映射變量生成另一個(gè)映射變量時(shí)的資源空間自動(dòng)管理所述C實(shí)例空間隨第一個(gè)映射變量的腳本實(shí)例空間申請(qǐng)而申請(qǐng),并隨最后一個(gè)共用所述C實(shí)例空間的映射變量的腳本實(shí)例空間的釋放而釋放;以及支持手工修改映射變量的標(biāo)志,對(duì)所述C實(shí)例空間是否隨變量的腳本實(shí)例空間的釋放而釋放進(jìn)行控制。
9.根據(jù)權(quán)利要求6-8任一項(xiàng)所述的方法,其中當(dāng)對(duì)所述變量容器中的映射變量賦值時(shí),所述賦值步驟包括在腳本對(duì)象的類中定義屬性取值與賦值的捕獲處理函數(shù);判斷賦值與被賦值對(duì)象是否是映射變量;根據(jù)判斷結(jié)果使相應(yīng)的賦值與取值操作轉(zhuǎn)向到所述映射變量針對(duì)其C實(shí)體空間的賦值與取值操作,其中,對(duì)所述變量容器中的映射變量賦值缺省按照該映射變量的C實(shí)例空間進(jìn)行賦值。
10.根據(jù)權(quán)利要求6-8任一項(xiàng)所述的方法,其中當(dāng)對(duì)所述變量容器中的映射函數(shù)進(jìn)行調(diào)用時(shí),將所述映射函數(shù)的調(diào)用轉(zhuǎn)向到相應(yīng)的C函數(shù)的調(diào)用,以及,當(dāng)對(duì)所述變量容器中的映射函數(shù)進(jìn)行cdecl風(fēng)格的變長(zhǎng)參數(shù)調(diào)用時(shí),在所述C函數(shù)調(diào)用發(fā)起前,按參數(shù)傳入值組裝成壓棧數(shù)據(jù),然后模擬C語(yǔ)言調(diào)用以獲取模擬調(diào)用的返回值;如果映射函數(shù)有返回值,則調(diào)用該映射函數(shù)后返回一個(gè)映射變量。
全文摘要
本發(fā)明提供了一種用于軟件調(diào)測(cè)的程序映射方法以及使用該方法的程序調(diào)測(cè)系統(tǒng)。所述方法包括1)在被測(cè)試的目標(biāo)機(jī)提供測(cè)試代理;2)所述測(cè)試代理根據(jù)被調(diào)測(cè)程序被編譯后的調(diào)試數(shù)據(jù)庫(kù)產(chǎn)生所述被測(cè)試程序的符號(hào)表和類型表;3)所述測(cè)試代理按照預(yù)定的腳本把所述類型表、符號(hào)表中的變量和函數(shù)都映射至變量容器中,生成腳本語(yǔ)言的映射變量和映射函數(shù)。本發(fā)明使被測(cè)系統(tǒng)的變量讀寫(xiě)與函數(shù)調(diào)用等操作映射為腳本語(yǔ)言的原生語(yǔ)法,可提高對(duì)軟件的調(diào)測(cè)能力和調(diào)測(cè)腳本的開(kāi)發(fā)效率。
文檔編號(hào)G06F11/36GK1949186SQ20061014519
公開(kāi)日2007年4月18日 申請(qǐng)日期2006年11月17日 優(yōu)先權(quán)日2006年11月17日
發(fā)明者曾學(xué)明 申請(qǐng)人:深圳市領(lǐng)測(cè)科技有限公司