两个人的电影免费视频_国产精品久久久久久久久成人_97视频在线观看播放_久久这里只有精品777_亚洲熟女少妇二三区_4438x8成人网亚洲av_内谢国产内射夫妻免费视频_人妻精品久久久久中国字幕

一種程序調測系統(tǒng)及用于程序調測系統(tǒng)的映射方法

文檔序號:6562812閱讀:223來源:國知局
專利名稱:一種程序調測系統(tǒng)及用于程序調測系統(tǒng)的映射方法
技術領域
本發(fā)明涉及軟件調試與測試領域,特別涉及針對C語言開發(fā)環(huán)境的軟件調試與測試的C語言映射系統(tǒng)及方法。
背景技術
在軟件開發(fā)領域,支持VxWorks實時操作系統(tǒng)開發(fā)的Tornado編程環(huán)境是眾多嵌入式編程語言中調測性能表現(xiàn)最佳的編程環(huán)境之一。Tornado測試命令解釋模塊工具支持腳本化的被測變量讀寫與被測函數(shù)調用,功能比較強大。圖1顯示了Tornado調測體系的結構。該調測的體系結構包括測試主機系統(tǒng)的測試主機和目標機系統(tǒng)。目標機系統(tǒng)是被測的目標系統(tǒng)(如PPC單板及運行在其上的軟件)。測試主機與測試命令解釋模塊等調測模塊經(jīng)目標服務器模塊向目標機系統(tǒng)傳送調測命令。測試代理(Test Agent)接收到命令后實現(xiàn)調測操作如修改變量、調用函數(shù)、設置斷點、暫停任務、復位單板等。在該體系中,目標服務器中駐留有符號表。當Tornado測試命令解釋模塊發(fā)出一個指令要修改在單板運行的某個變量時,先到設置在測試主機端的目標機服務器查詢該變量在目標機中的地址,然后經(jīng)通信連接向目標機中的測試代理發(fā)送請求,由測試代理最終實現(xiàn)該變量修改。
盡管Tornado測試命令解釋模塊功能強大,但由于使用兩種解釋器即C解釋器和TCL解釋器,并且由于駐留在目標機服務器中的只有符號表,沒有類型表,因而使它的調測能力受到不少限制。這些限制主要包括1)由于變量與函數(shù)的類型表未駐留,導致針對復合類型的操作難以支持;2)用于調測控制的C解釋器與TCL解釋器駐留于測試主機端,導致調測控制與被測代碼有緊耦合交互的情況下無法支持調測;3)變量讀寫與函數(shù)調用與if、else等控制分別在兩個腳本語言內實現(xiàn),因此,在測試命令解釋模塊運行調測指令時,經(jīng)常要在C解釋器與TCL解釋器之間切換,很煩瑣。兩個解釋器之間數(shù)據(jù)交換主要通過全局變量。盡管C解釋器可內嵌一個API來調用TCL腳本,TCL腳本也可內嵌C解釋器,但在使用上仍然不便,而且運行效率低。4)而且,由于上述3)的原因,C解釋器與TCL解釋器屬兩套系統(tǒng),難以在語法語義級別進行融合,增加了使用者的學習負擔,也不利于調測功能的擴展。
另一方面,第4代白盒測試方法綜合了軟件白盒測試的最佳實踐,反映了現(xiàn)今白盒測試的發(fā)展方向,屬于公共領域的通用方法論。為了符合第4代白盒測試方法的要求,需要對基于Tornado技術的調測體系做如下改進1、引入一種支持即時調測的體系,測試控制與被測代碼應處于同一個執(zhí)行體內。
2、使用一種腳本語言,既描述針對被測C變量與函數(shù)的控制(類似于Tornado Shell中的C解釋器),也描述測試控制(類似于Tornado Shell中的TCL解釋器),這兩類描述須維持相同的語言風格。

發(fā)明內容
本發(fā)明為了改善當前嵌入式軟件普遍存在的調測能力不足及測試效率欠佳的問題,并滿足第4代白盒測試方法的要求,將相關的測試方法論應用到嵌入式產(chǎn)品的C語言開發(fā)領域,而提出一套編程語言映射技術,即將C語言的變量操作、函數(shù)操作映射到一個腳本語言系統(tǒng),將該腳本語言系統(tǒng)駐留于被測系統(tǒng)中,使這些腳本語言既實現(xiàn)腳本化的測試描述,又能直接操控被測系統(tǒng)中的變量、函數(shù)等。并且,引入一種支持即時調測的體系,使測試控制與被測代碼同處于一個執(zhí)行體內。本發(fā)明使用一種腳本語言既描述針對被測C語言的變量與函數(shù)的控制,也描述測試控制,并保持這兩類描述具有相同風格。
根據(jù)本發(fā)明,提供了一種程序調測系統(tǒng),包括測試主機和目標機,所述測試主機對所述目標機中的程序進行調測,其中,所述目標機中包含測試代理,所述測試代理包括表生成單元,根據(jù)在被測試程序的編譯過程中生成的調試數(shù)據(jù)庫,生成被測試程序的符號表和類型表,和映射支持模塊,根據(jù)所生成的符號表和類型表,將所述被測試程序的變量和函數(shù)映射至腳本語言的映射變量和映射函數(shù);所述測試主機包括變量容器單元,用于存放所述映射變更和映射函數(shù),將對所述映射變量的賦值和取值處理轉向到所述映射變量針對其C實例空間的賦值和取值操作,以及將所述映射函數(shù)的調用轉向到C程序代碼中相應函數(shù)的調用;測試命令解釋模塊,接收腳本文件格式的測試命令,利用所述變量容器單元對所述映射變量和所述映射函數(shù)的轉向操作,把所述測試命令轉化為所述目標機能夠處理的命令,傳送給所述目標機的測試代理。
根據(jù)本發(fā)明的另一方面,提供一種應用于程序調測系統(tǒng)中的映射方法,所述程序調測系統(tǒng)包括測試主機和目標機,所述測試主機對所述目標機中的程序進行調測,所述目標機中包含測試代理,所述測試代理中包含映射支持模塊,所述方法包括1)在所述目標機提供測試代理;2)所述測試代理根據(jù)被調測程序被編譯后的調試數(shù)據(jù)庫產(chǎn)生所述被測試程序的符號表和類型表;3)所述測試代理按照預定的腳本把所述類型表、符號表中的變量和函數(shù)都映射至變量容器中,生成腳本語言的映射變量和映射函數(shù)。
通過本發(fā)明的系統(tǒng)和方法,可以將對軟件調測的運算處理分配到測試主機和目標機。由測試主機處理被測程序的測試例的腳本編寫和解釋。駐留在目標機的腳本系統(tǒng)完成對被測端C語言變量以及函數(shù)的映射和控制。
腳本的映射基于三個方面一、根據(jù)目標機通過C語言編譯器生成的PDB(Program Data Base程序數(shù)據(jù)庫)或GDB(GNU調試程序,它是GCC編譯器附帶的配套調試程序)而產(chǎn)生的符號表和類型表;二、在測試代理端的腳本對映射對象的定義;三、生成全局的變量容器,使其包容相應的變量和函數(shù)。當用戶測試的命令從測試主機傳送到目標機時,由于本發(fā)明使測試控制與測試編碼在一處并互相兼容的特點,從而能夠靈活有效地進行即時調控。
本發(fā)明的映射技術有效地提升了軟件產(chǎn)品的調試能力與白盒測試能力。與Tornado測試命令解釋模塊相比,本發(fā)明通過在測試代理的腳本系統(tǒng)中包含了調測模塊和映射模塊,使得測試控制與被測代碼都在一個系統(tǒng)中。調測控制與被測代碼耦合更緊密。緊耦合交互不會有兩個系統(tǒng)因通信連接帶來的時延,并且測試控制過程的復雜性也被降低了。因此,被測系統(tǒng)中的變量與函數(shù)可直接被腳本操作。在腳本中實現(xiàn)變量讀寫與函數(shù)調用的能力幾乎接近于在被測系統(tǒng)中編寫C代碼,較好地仿真了C語法規(guī)則,不留死角。另外測試所需的實時控制能力也得到保障,特別適用于實時操作系統(tǒng)下的調測。
綜上所述,本發(fā)明的優(yōu)點在于通過采用一種映射技術,使調測腳本可以直接控制被測系統(tǒng)的行為。由于腳本的在線定義、在線執(zhí)行的特性,大大提高了調測腳本的開發(fā)效率,有力保證了第4代白盒測試方法要求的在線測試與灰盒調測的工具化實現(xiàn)。相對于Tornado測試命令解釋模塊,調測效率得到提高。另外,在測試中不必經(jīng)常在兩種腳本語言之間切換,數(shù)據(jù)傳遞與控制傳遞更加自由。
因此,本發(fā)明可提升嵌入式軟件的調測能力,降低測試表述的學習門檻,并大幅提升調測腳本的開發(fā)效率。


圖1顯示了現(xiàn)有的Tornado調測體系結構;圖2顯示了Tornado Shell的調試框架;圖3顯示了本發(fā)明的框架結構;圖4是本發(fā)明中測試代理的層次結構;圖5是映射支持模塊的初始化過程;圖6是映射實例生成過程;圖7示例性地顯示了一個映射實例的TData與TType對應關系;圖8示例性地顯示了根據(jù)本發(fā)明的映射實例的屬性。
具體實施例方式
下面將結合附圖對用于嵌入式軟件調測的程序語言映射方法及應用該方法的程序調測系統(tǒng)給予詳細的說明。為便于說明,以下將以C語言為例進行說明。但本發(fā)明的構思與方案也可以用于其它語言的程序,例如C++語言。
現(xiàn)有的測試技術是將主要的計算部分通過測試主機完成,通過命令解釋模塊來解釋用戶所輸入的指令,并將解釋后的指令傳達到目標服務器。目標服務器進行操作,由目標機的測試代理來完成指令。而在本發(fā)明中,則是把原來在測試主機的一些計算和運行操作移到了目標機。
為了實現(xiàn)本發(fā)明的目的,對本發(fā)明中使用的腳本語言需要在表達方式上滿足以下描述方式1、指針操作與C語言風格保持一致,包括“->”操作符使用方法,例如用“pStruct->Member1”描述某結構指針指向某成員,也包括指針移動的規(guī)則,例如“pInt+2”,將int指針向后移動2,實際指向將偏移2*sizeof(int)個字節(jié)。
2、存取數(shù)組成員的方式與C語言的風格保持一致。使用中括號按下標取子成員,例如用“ArrayVar[2]”表示存取數(shù)組變量ArrayVar的第3個子成員。
3、存取struct與union成員的方式與C語言風格保持一致。使用點號區(qū)隔struct/union變量與其成員,比如某Struct類型定義了兩個子成員Member1與Member2,存取該類型變量StruVar第一個子成員的描述形式為“StruVar.Member1”。
4、支持下列與C語言含義一致的二元操作,操作符表達方式與優(yōu)先級都一致。

以上涉及取值描述的應同樣適應賦值描述,如“pStruct->Member1=3”、“ArrayVar[2]=3”、“StruVar.Member1=3”。
同時,為達到高效率測試及支持必要的擴展能力,駐留在測試代理中腳本語言優(yōu)選應能滿足如下要求1、腳本中的所有變量與函數(shù),能實現(xiàn)生存周期自動管理,多數(shù)腳本語言都具備本項特性,通常使用引用計次技術實現(xiàn)生存周期自動管理。
2、支持常見的數(shù)據(jù)類型,如4字節(jié)整數(shù)、單精度或雙精度浮點數(shù)、字串、數(shù)組序列、字典等。
3、支持if、else、while等基本的分支與循環(huán)控制。
4、支持函數(shù)定義擴展與模塊定義擴展。
5、支持類定義與類繼承。這是由于本發(fā)明使用的映射規(guī)則依賴于特定的類定義格式。因此需要類定義的功能。
6、在不重起腳本系統(tǒng)前提下,可在線增刪變量、函數(shù),以及類的定義,現(xiàn)在技術中已有許多腳本語言都能支持這一點。
滿足上述要求的腳本系統(tǒng)都是可以從現(xiàn)有技術中得到的,如Python、Ruby等,它們都支持在線增加或刪除變量定義或函數(shù)定義。
圖3是根據(jù)本發(fā)明的腳本解釋器驅動測試系統(tǒng)的示意方框圖。如圖所示,測試主機1包含測試外殼(Test Shell)11,用于發(fā)起調測命令,以及提供開發(fā)、測試的平臺。測試主機端可以采用個人桌面系統(tǒng)(如Windows、Linux等)。測試外殼11可以是其中的一個可執(zhí)行程序。
目標機2通常是被測單板,或者是一個仿真程序。目標機2中駐留有測試代理(Test Agent)21。該測試代理21可以是一個腳本語言系統(tǒng)。在本發(fā)明中,對腳本語言的種類并沒有限定,只要能滿足本發(fā)明規(guī)定的映射規(guī)則即可。在目標機2的測試代理21內包含有被測試程序的符號表和類型表。關于符號表和類型表將在后文中說明。
目標機2可以與測試主機1共用同一臺設備,例如計算機。在此情況下,被測程序是exe程序,測試主機也是exe程序,兩者可以同時運行在一臺機器的操作系統(tǒng)(如windows這樣的支持多進程的平臺)上。
測試主機1的測試外殼11與測試代理21具有通信連接。此連接的通信方式可以是共享內存通信(對于目標機與測試主機共用同一臺計算機的情況、TCP/IP通信,或是其它如串口通信等形式。
如圖4所示,測試代理21包括腳本系統(tǒng)211和通訊單元212。通訊單元212負責處理測試代理21與測試主機1的測試外殼11的上述通信連接。
腳本系統(tǒng)211包括內嵌調測支持模塊2111和映射支持模塊2112。內嵌調測支持模塊2111是常規(guī)的調測應用編程接口(API)的集合,提供諸如復位目標機、啟動或停止某任務、設置斷點、刪除斷點等功能。映射支持模塊2112用于實現(xiàn)被測系統(tǒng)中的C語言變量與函數(shù)向腳本系統(tǒng)映射的功能。在完成映射后,腳本系統(tǒng)211中生成與C語言的變量和函數(shù)同名的映射變量與映射函數(shù)。
為了實現(xiàn)本發(fā)明的目的,要求測試主機1和目標機2都應該有對腳本文件的處理能力。為此,測試主機1的測試外殼11中包含了一個命令行編輯輸入單元以及命令解釋模塊(未示出),命令行編輯輸入單元用于支持用戶輸入腳本文件格式的調測命令,命令解釋模塊把輸入的調測命令轉化為能夠由測試代理21中的腳本解釋器解釋執(zhí)行的測試命令,并傳送給目標機2的測試代理21。測試代理21中相應地包含一個腳本解釋器(未圖示),用于實現(xiàn)測試控制。腳本解釋器接收命令解釋模塊傳送來的測試命令,對該命令進行解釋并實施相應動作。實際傳遞的格式是中間碼格式,類似Java虛擬機解釋字節(jié)碼命令一樣,這個中間碼格式也稱偽編譯碼。
當目標機2執(zhí)行測試并反饋結果、或在測試過程中發(fā)出了打印信息,測試主機1的測試外殼11將會接收該結果或信息并進行處理。
參見圖5,首先,目標機2要進行初始化處理。當測試主機1啟動命令解釋模塊的程序時,目標機2啟動被測程序(S501)。然后,目標機2初始化其中包含的腳本系統(tǒng)211,包括設置測試代理21的相關配置(S502)。在此過程中,測試代理21的表生成單元(未示出)從目標機2被測試的軟件在其最后一次編譯后生成的GDB或PDB調試數(shù)據(jù)庫中提取與被映射的變量/函數(shù)相關的信息,生成符號表和類型表(后文將要說明),并記錄在測試代理21中(S503)。然后,測試代理21的腳本系統(tǒng)211把符號表及類型表映射到一個全局的變量容器(S504)。按照預定的腳本把類型表、符號表的符號都映射至變量容器中(S505)。該操作將被測程序中的變量與函數(shù)在腳本系統(tǒng)中描述為映射對象(即腳本的TData類對象)。由于轉換全部符號會導致CPU與內存資源浪費,因此根據(jù)本發(fā)明的一個實施方式,不對符號作一次性全部轉換,而僅根據(jù)測試需要來映射。例如,運行測試腳本時,腳本包含哪些映射的變量與函數(shù),就動態(tài)轉換那些變量或函數(shù),或者由用戶自行確定規(guī)則來按需轉換,比如所有外部定義的符號都不作映射。
此后,進行被測系統(tǒng)的正常測試(S506)。在測試主機1,用戶使用類似C語言的腳本文件對傳送來的編碼進行操作。測試外殼11中的命令解釋模塊解釋用戶的輸入,并發(fā)出相應的測試指令。該命令被傳送到測試目標機2,并在其腳本系統(tǒng)211中運行,從而得到按編碼邏輯所得到的測試運行結果。這個測試運行結果可被反饋到測試主機1,并顯示給用戶。在上述方法中,由于可以在線地編寫測試腳本,直觀地查看或修改被測變量、調用被測函數(shù),所見即所得,可以馬上看到測試結果,也可馬上改進測試,從而提高了測試的效率。
因為C語言編碼對其數(shù)據(jù)的結構/類型要求很嚴格,作為它的映射后的腳本,必須能夠支持基本的C編程的功能和要求。
為了實現(xiàn)上述對C語言編碼的映射,根據(jù)本發(fā)明,在目標機2的測試代理21中駐留了被測試程序的符號表和數(shù)據(jù)類型表。這兩個表將直接支持本發(fā)明規(guī)定的映射規(guī)則的實現(xiàn)。本發(fā)明的映射方法依賴于對目標機系統(tǒng)的各種符號及其類型信息的收集與分析。調試數(shù)據(jù)庫在編譯過程中由編譯器產(chǎn)生,例如Visual C/C++編譯過程中會產(chǎn)生PDB文件,GCC在編譯時也將GDB調試信息編譯到目標程序中。如上所述,這些信息可在編譯過程中由編譯器產(chǎn)生的調試數(shù)據(jù)庫中提取,根據(jù)所提取的信息相應生成符號表和類型表。
不同的C編譯器生成的調試數(shù)據(jù)庫格式并不一樣。本發(fā)明通過對類型表和符號表的生成達到了對不同格式的統(tǒng)一。類型表記錄被測系統(tǒng)定義過的各種類型。這些類型必須包括主類型信息、子類型信息、以及占用字節(jié)數(shù)。表1是類型定義格式的示例表1


同時要確保類型表下各欄目具有唯一性,即,由相同的主類型與子類型以及占相同字節(jié)數(shù)而構成的類型項只能存在一個。
符號表記錄變量或函數(shù)的地址值及其類型ID。其中符號地址有兩種形式,既可以記錄絕對地址,也可以記錄相對地址。例如,存取函數(shù)內局部變量或傳入?yún)?shù)時,則使用相對于當前棧頂位置的偏移值。再如,某變量在另一變量空間下存在,其地址也按該另一變量的地址加上一個偏移來表達。
符號來源有兩種方式,一是來源于另一映射對象,二是來源于某絕對地址。后者是描述變量或函數(shù)的常規(guī)方式,前者常在將同一內存空間看作多種類型的變量進行操作時使用,例如強制類型轉換,是將某字串數(shù)組的某一偏移看成整數(shù)類型變量。
在生成了符號表和類型表之后,為了腳本的操作方便,系統(tǒng)要定義與表中數(shù)據(jù)相應的轉化腳本類對象,即TType類對象對應于類型表,TData類對象對應于符號表。在TType類對象定義的實例化數(shù)據(jù)要包含如下信息該類型唯一的標識,類型主類別信息,類型子類別信息,類型大小。各個符號映射為TData類定義的實例化數(shù)據(jù),要包含以下信息該符號對應的類型ID,符號的來源,相對于來源的偏址,是否是自動釋放內存。
表格內容的映射過程按圖6進行。首先,腳本系統(tǒng)211從符號表里找出需要的符號(包括變量和函數(shù))信息,如符號名稱,符號的類型ID及符號地址(S601)。然后腳本系統(tǒng)211通過該類型ID查找相應的類型是否有生成的TType類對象,若沒有則先創(chuàng)建該TType類對象,即通過定義TData或TType類對象,調用類定義的建構函數(shù)來創(chuàng)建這個類對象的實例(S602)。最后,根據(jù)該符號的來源、所屬的TType對象、地址偏移及是否自動釋放內存等信息來創(chuàng)建被映射符號的TData類對象(S603)。
在創(chuàng)建的映射實例包括映射變量與映射函數(shù)時,首先要有相應的TType對象指明類型信息。當類型表中的各項都轉化成TType類實例后,原有類型信息表不再有用,其占用的資源可釋放,而用新生成的各個TType類實例組成一個新表,即TType類型表。映射變量與映射函數(shù)都是TData類實例。如圖7所示,每個TData類實例使用該符號對應的類型ID(Data type)指示它使用TType類型表中的哪個類型。
需要注意,TType類的對象可能是嵌套引用的。某些復合類型如struct/union/指針等包含了子類型,而且同一子類型可能被多個復合類型引用。所以,在創(chuàng)建每個TType對象時,該類型涉及的其它類型也同時被創(chuàng)建。
由于測試主機和目標機的系統(tǒng)資源是有限的,為了更有效地進行測試,在相應時期對使用資源的處理是十分重要的。根據(jù)本發(fā)明,為了有效利用系統(tǒng)資源,變量、函數(shù)、類對象等在腳本語言中作為一個實體存在,實現(xiàn)了生存周期自動管理。這些實體所占用的資源會自動申請、自動釋放。映射數(shù)據(jù)作為腳本類對象,也支持它所涉及資源的自動申請與釋放。
例如,腳本系統(tǒng)21要創(chuàng)建一個映射變量buff,它是一個長度為24字節(jié)的字串數(shù)組,這時腳本系統(tǒng)21會向目標機2自動申請它占用的內存,包括buff變量作為腳本TData類實例要占用的內存空間,以及字串數(shù)組的24字節(jié)空間。為描述方便,在本發(fā)明中,將前一類空間稱為腳本實例空間,將后一類空間稱為C實例空間。當新創(chuàng)建的映射變量的生存周期結束時,這兩種空間都將被自動釋放。
但是,由于編程的復雜性,腳本實例空間與C實例空間并不總是同時申請或同時釋放的。例如對于被測系統(tǒng)的全局變量,其占用空間是靜態(tài)分配的,全局變量的映射實例在生存周期結束時,應只釋放腳本實例空間,而不應釋放C實例空間。再如,使用腳本文件中創(chuàng)建一個映射變量a后,這個變量的腳本實例空間與C實例空間應同時申請或釋放。但是,如果把這個映射變量a看成另一類型的映射變量b,例如C語言中的強制類型轉換時,將同一地址空間下某變量,看成另一類型的變量,則創(chuàng)建變量b時應新申請腳本實例空間,但不應重復申請C實例空間。另外,當變量a或變量b被刪除時,不管先刪除哪一個,都應保證尚在使用的另一個變量所操作的C實例空間還有效。也即C實例空間可被多個映射變量共享,只有該C實例空間所全部涉及的映射變量都釋放了,這個C實例空間才自動被釋放。此外,映射變量使用的C實例空間還需配合測試,必要情況下可修改其中的標志。例如為映射變量設置Autofree屬性,該屬性為TRUE表示該映射變量的C實例空間是隨它的腳本實例空間釋放而釋放的,否則屬性取值為FALSE,表示C實例空間不隨腳本實例空間釋放而釋放。
為實現(xiàn)上述目的,根據(jù)本發(fā)明的一個實施方式,對映射實例設置了3個屬性。圖8顯示了映射實例的一個示例。如圖8所示,該屬性包括是否自動釋放內存(Autofree)、符號來源(Owner)、相對于來源的偏移地址(Offset)。其中“是否自動釋放內存”的屬性用于指示該映射變量的C實例空間是否跟隨腳本實例空間一起釋放?!胺杹碓础庇糜谥甘驹撚成鋵嵗臍w屬對象,其取值既可以是某絕對地址值,也可以是另一個映射實例。相對于來源的偏移地址用于指示本映射實例所用C實例空間的起始地址相對于其符號來源指示的空間地址的偏移量是多少。由于腳本語言具備生存周期自動管理特性,所以如果使符號來源屬性指示另一映射實例,就實現(xiàn)了同一C實例空間被多個映射實例共用時也能夠實現(xiàn)資源的自動管理。
在這些初始階段的步驟完成后,系統(tǒng)還要生成一個全局的變量容器。該全局變量容器用于包含所有的變量和函數(shù),并將它們置于統(tǒng)一的平臺下。變量容器能捕獲針對該實例的屬性取值與賦值的操作,并根據(jù)特定情況進行操作轉義。容器本質上也是腳本的類對象,只不過存取它的屬性時,系統(tǒng)會做特定的截獲處理。
例如,參考下式定義的變量容器vc=newVarContainer();vc.Var3=MapString(“Another string”);vc.Var3=“Change value”;vc.Var4=MapString(“It is example!”);vc.Var4=vc.Var3;
在這個例子中,第3行和最后一行分別是針對Var3的賦值和取值,最后一行是按照C語言風格描述的。為實現(xiàn)這一點,變量容器下的映射變量的取值和賦值將進行轉義,如下兩條語句vc.Var3=“Change value”;vc.Var4=vc.Var3;等同于vc.Var3.setValue(“Change value”);vc.Var4.setValue(vc.Var3.getValue());可以看到,vc.Var3=“Change value”是合乎C風格的賦值,而vc.Var3.setValue(“Change value”)是調用,不是賦值,遠離C風格了。
為支持轉義,腳本語言本身的類方法操作要支持定向功能,定向后使用賦值語句最終執(zhí)行這個調用語句(vc.Var3.setValue(“Change value”))。
變量容器除支持以上取值與賦值轉義外,還要支持按腳本方式的變量賦值,即用指定的值代替變量原有值,而不管原有值是不是映射變量。例如vc.Var4=MapString(“It is example!”);setVcValue(vc,“Var4”,“Another string”);在這個例子中,第一條語句在變量容器下創(chuàng)建字串映射變量Var4,第二條語句將這個Var4替換成腳本的字串值。該句執(zhí)行后,Var4不再是映射變量了,而是像常規(guī)腳本變量那樣賦值,其類型是動態(tài)變化的。為此,本發(fā)明要求提供用于動態(tài)賦值的API函數(shù)(類似于本例的setVcValue)。
變量容器的使用對于函數(shù)的調用也是重要的。例如,要實現(xiàn)cdecl與stdcall調用,在TData類中定義添加callCdecl與callStdcall兩個方法,在腳本中按如下方式調用C函數(shù)vc.result1=vc.func1.callCdecl(IntType,3,“example”);vc.result2=vc.func2.callStdcall(CharType,‘A’,‘B’);這兩個方法都要求用第一個參數(shù)指明該調用的返回值類型,其它參數(shù)依次是完成本次C調用的各參數(shù)值。由這兩個方法發(fā)起調用沒有基于一種函數(shù)原型,使用有點麻煩,因為調用時要指定返回值類型,而且各傳入?yún)?shù)的類型是否匹配、參數(shù)個數(shù)是否正確都無法檢查。為改進這一點,在本發(fā)明中對TData添加了對_call_調用的支持,其使用方法如下vc.result1=vc.func1._call_(3,“example”);vc.result2=vc.func2._call_(‘A’,‘B’);為了讓描述方法更簡單,本發(fā)明定義腳本類的支持內嵌call轉向功能,從而把上面的腳本改寫成如下方式vc.result1=vc.func1(3,“example”);vc.result2=vc.func2(‘A’,‘B’);改寫后執(zhí)行效果是等同的,即當類對象自身作為函數(shù)去調用時,系統(tǒng)自動將它轉向到該對象的_call_方法。一些現(xiàn)有的腳本語言,如Python與CSE可支持這種轉向。本發(fā)明借助該機制實現(xiàn)新的應用,即,讓映射函數(shù)(是腳本實例)調用與C語言在表達上保持一致,如vc.func._call_(3,“example”)未保持一致,而vc.func(3,“example”)是一致的。至此,使用腳本調用C函數(shù)的風格就與C語言風格一致了。
除了上述常規(guī)的cdecl與stdcall固定參數(shù)類型的調用,本發(fā)明還需要支持cdecl風格的變長參數(shù)調用,例如變長參數(shù)函數(shù)MyPrint的原型為“void MyPrint(char*format,…)”,根據(jù)本發(fā)明,可以按如下方式調用它vc.result=vc.MyPrint.callCdecl(“name%s”,“george”);在此,變長參數(shù)調用要在C函數(shù)調用發(fā)起前,按參數(shù)傳入值組裝成壓棧數(shù)據(jù)。然后模擬C語言調用,獲取模擬調用的返回值。
如果映射函數(shù)有返回值,則調用映射函數(shù)應返回一個映射變量。即原C函數(shù)的返回類型不為void時,取它的類型及返回的數(shù)值,生成映射變量。
權利要求
1.程序調測系統(tǒng),包括測試主機和目標機,所述測試主機對所述目標機的程序進行調測,其中,所述目標機中包含測試代理,所述測試代理包括表生成單元,根據(jù)在被測試程序的編譯過程中生成的調試數(shù)據(jù)庫,生成被測試程序的符號表和類型表,和映射支持模塊,根據(jù)所生成的符號表和類型表,將所述被測試程序的變量和函數(shù)映射至腳本語言的映射變量和映射函數(shù);所述測試主機包括變量容器單元,用于存放所述映射變更和映射函數(shù),將對所述映射變量的賦值和取值處理轉向到所述映射變量針對其C實例空間的賦值和取值操作,以及將所述映射函數(shù)的調用轉向到C程序代碼中相應函數(shù)的調用;測試命令解釋模塊,接收腳本文件格式的測試命令,利用所述變量容器單元對所述映射變量和所述映射函數(shù)的轉向操作,把所述測試命令轉化為所述目標機能夠處理的命令,傳送給所述目標機的測試代理。
2.根據(jù)權利要求1所述的程序調測系統(tǒng),其中所述類型表包括所述被測程序中各類型的主類型、子類型、以及占用字節(jié)數(shù);所述符號表記錄被測程序中各變量與函數(shù)的符號地址與類型ID。
3.根據(jù)權利要求2所述的程序調測系統(tǒng),其中所述符號地址是絕對地址或相對地址,所述相對地址包括相對于當前棧頂?shù)钠浦?、或相對于另一變量的偏移值?br> 4.根據(jù)權利要求2所述的C語言映射系統(tǒng),其中所述類型表中具有相同的主類型與子類型和相同字節(jié)數(shù)的類型項是唯一的。
5.根據(jù)權利要求1-4任一項所述的程序調測系統(tǒng),其中所述變量函數(shù)的映射產(chǎn)生映射實例作為腳本語言的TData對象,所述TData對象包括如下屬性用于指示所述映射實例的數(shù)據(jù)類型的屬性;用于指示所述映射實例的C實例空間是否跟隨腳本實例空間一起釋放的屬性;用于指示所述映射實例的C實例空間的歸屬對象的屬性;和用于指示所述映射實例使用的C實例空間相對其歸屬對象的偏移的屬性。
6.一種應用于程序調測系統(tǒng)中的映射方法,所述程序調測系統(tǒng)包括測試主機和目標機,所述測試主機對所述目標機中的程序進行調測所述方法包括1)在所述目標機提供測試代理;2)所述測試代理根據(jù)被調測程序被編譯后的調試數(shù)據(jù)庫產(chǎn)生所述被測試程序的符號表和類型表;3)所述測試代理按照預定的腳本把所述類型表、符號表中的變量和函數(shù)都映射至變量容器中,生成腳本語言的映射變量和映射函數(shù)。
7.根據(jù)權利要求6所述的方法,其中所述映射步驟包括從符號表中確定待映射的變量符號的信息,包括變量符號的名稱、類型ID、和符號地址;根據(jù)所述信息中包含的符號類型所對應的腳本對象類型,確定待映射的變量符號的屬性,所述屬性包括符號的來源、偏移地址、以及是否自動釋放內存;和根據(jù)所述變量符號的信息和屬性,創(chuàng)建所述符號的映射實例,其中,所述確定待映射的變量符號的信息的步驟包括確定所述變量符號的類型是否有相應的腳本對象的類型;如果沒有所述相應的腳本類對象的類型,則創(chuàng)建該類型。
8.根據(jù)權利要求7所述的方法,其中所述被測試程序為C語言程序,所述映射實例自動管理資源空間,所述資源空間包括C實例空間和腳本實例空間,所述自動管理包括腳本實例空間與C實例空間同時申請與釋放;全局變量的資源空間自動管理所述C實例空間不隨所述腳本實例空間一起申請和釋放;由一個映射變量生成另一個映射變量時的資源空間自動管理所述C實例空間隨第一個映射變量的腳本實例空間申請而申請,并隨最后一個共用所述C實例空間的映射變量的腳本實例空間的釋放而釋放;以及支持手工修改映射變量的標志,對所述C實例空間是否隨變量的腳本實例空間的釋放而釋放進行控制。
9.根據(jù)權利要求6-8任一項所述的方法,其中當對所述變量容器中的映射變量賦值時,所述賦值步驟包括在腳本對象的類中定義屬性取值與賦值的捕獲處理函數(shù);判斷賦值與被賦值對象是否是映射變量;根據(jù)判斷結果使相應的賦值與取值操作轉向到所述映射變量針對其C實體空間的賦值與取值操作,其中,對所述變量容器中的映射變量賦值缺省按照該映射變量的C實例空間進行賦值。
10.根據(jù)權利要求6-8任一項所述的方法,其中當對所述變量容器中的映射函數(shù)進行調用時,將所述映射函數(shù)的調用轉向到相應的C函數(shù)的調用,以及,當對所述變量容器中的映射函數(shù)進行cdecl風格的變長參數(shù)調用時,在所述C函數(shù)調用發(fā)起前,按參數(shù)傳入值組裝成壓棧數(shù)據(jù),然后模擬C語言調用以獲取模擬調用的返回值;如果映射函數(shù)有返回值,則調用該映射函數(shù)后返回一個映射變量。
全文摘要
本發(fā)明提供了一種用于軟件調測的程序映射方法以及使用該方法的程序調測系統(tǒng)。所述方法包括1)在被測試的目標機提供測試代理;2)所述測試代理根據(jù)被調測程序被編譯后的調試數(shù)據(jù)庫產(chǎn)生所述被測試程序的符號表和類型表;3)所述測試代理按照預定的腳本把所述類型表、符號表中的變量和函數(shù)都映射至變量容器中,生成腳本語言的映射變量和映射函數(shù)。本發(fā)明使被測系統(tǒng)的變量讀寫與函數(shù)調用等操作映射為腳本語言的原生語法,可提高對軟件的調測能力和調測腳本的開發(fā)效率。
文檔編號G06F11/36GK1949186SQ20061014519
公開日2007年4月18日 申請日期2006年11月17日 優(yōu)先權日2006年11月17日
發(fā)明者曾學明 申請人:深圳市領測科技有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
库车县| 富平县| 大连市| 曲靖市| 丹东市| 利辛县| 绥芬河市| 兴义市| 法库县| 新津县| 锡林郭勒盟| 噶尔县| 塘沽区| 桃源县| 张家川| 沾化县| 同仁县| 平凉市| 河曲县| 东平县| 岳池县| 宁津县| 台江县| 朝阳区| 佛冈县| 隆昌县| 浪卡子县| 长春市| 龙游县| 淮南市| 宜春市| 星子县| 阜阳市| 乐平市| 蛟河市| 长沙市| 邵阳市| 金寨县| 桐柏县| 阜宁县| 静海县|