
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、覆蓋測(cè)試中高效代碼插樁技術(shù)的研究代碼插樁是實(shí)現(xiàn)籠罩測(cè)試的關(guān)鍵技術(shù)之一,而高效的插樁技術(shù)對(duì)于軟件的測(cè)試來說又是至關(guān)重要的。文章在對(duì)codetest 中插樁技術(shù)討論的基礎(chǔ)上,以gcc 作為開發(fā)平臺(tái),應(yīng)用并實(shí)現(xiàn)了新的插裝器,采納增強(qiáng)一個(gè)詞法語法分析器的辦法,提高了插樁的效率。經(jīng)過試驗(yàn)證實(shí)新的插裝器具有代碼膨脹率小,插樁速度塊的優(yōu)點(diǎn),在一定程度上做到了高效插樁。引言在實(shí)現(xiàn)籠罩測(cè)試的過程中,往往需要知道某些信息,如:程序中可執(zhí)行語句被執(zhí)行(即被籠罩)的狀況,程序執(zhí)行的路徑,變量的引用、定義等。要想獵取這類信息,需要跟蹤被測(cè)程序的執(zhí)行過程,或者是由計(jì)算機(jī)在被測(cè)程序執(zhí)行的過程中自動(dòng)記錄。前者需要人工舉行,效
2、率低下且枯燥乏味;后者則需要在被測(cè)程序中插入完成相應(yīng)工作的代碼,即代碼插樁技術(shù)。如今大多數(shù)的籠罩測(cè)試工具均采納代碼插樁技術(shù)。在對(duì)一般應(yīng)用的軟件舉行測(cè)試時(shí),因?yàn)楝F(xiàn)在電腦的配置越來越高,電腦的運(yùn)行速度越來越快,代碼插樁所引起的問題還不是很顯然或者說是在可以接受的范圍之內(nèi)。但是對(duì)于嵌入式軟件來說這卻是致命的問題。由于嵌入式軟件的系統(tǒng)資源有限(內(nèi)存較小、i/o 通道較少等),過大的代碼膨脹率將使得程序不能在嵌入式系統(tǒng)中運(yùn)行;同時(shí)嵌入式軟件通常具有很強(qiáng)的實(shí)時(shí)性,程序的輸出只在有限的時(shí)光內(nèi)有效,遲到的“正確的”結(jié)果是無用的甚至?xí)兂慑e(cuò)誤的、有害的。代碼插樁技術(shù)會(huì)破壞程序的時(shí)光特性等,導(dǎo)致軟件執(zhí)行的錯(cuò)誤。因
3、此我們需要更高效的代碼插樁技術(shù)來完成籠罩測(cè)試,尤其是嵌入式軟件的籠罩測(cè)試。1 插樁技術(shù)概述程序插樁技術(shù)最早是由j.c. huang 教授提出的, 它是在保證被測(cè)程序原有規(guī)律完整性的基礎(chǔ)上在程序中插入一些探針(又稱為“探測(cè)儀”),通過探針的執(zhí)行并拋出程序運(yùn)行的特征數(shù)據(jù),通過對(duì)這些數(shù)據(jù)的分析,可以獲得程序的控制流和數(shù)據(jù)流信息,進(jìn)而得到規(guī)律籠罩等動(dòng)態(tài)信息,從而實(shí)現(xiàn)測(cè)試目的的辦法。1.1 插樁方式比較因?yàn)槌绦虿鍢都夹g(shù)是在被測(cè)程序中插入探針,然后通過探針的執(zhí)行來獲得程序的控制流和數(shù)據(jù)流信息,以此來實(shí)現(xiàn)測(cè)試的目的。因此,按照探針插入的時(shí)光可以分為目標(biāo)代碼插樁和源代碼插樁。(1)目標(biāo)代碼插樁的前提是對(duì)目標(biāo)代
4、碼進(jìn):行須要的分析以確定需要插樁的地點(diǎn)和內(nèi)容。因?yàn)槟繕?biāo)代碼的格式主要和操作系統(tǒng)相關(guān),和詳細(xì)的編程語言及版本無關(guān),所以得到了廣泛的應(yīng)用,尤其是在需要對(duì)內(nèi)存舉行監(jiān)控的軟件中。但是因?yàn)槟繕?biāo)代碼中語法、語義信息不完整,而插樁技術(shù)需要對(duì)代碼詞法語法的分析有較高的要求,故在籠罩測(cè)試工具中多采納源代碼插樁。(2)源代碼插樁是在對(duì)源文件舉行完整的:詞法分析和語法分析的基礎(chǔ)上舉行的,這就保證對(duì)源文件的插樁能夠達(dá)到很高的精確度和針對(duì)性。但是源代碼插樁需要接觸到源代碼,使得工作量較大,而且隨著編碼語言和版本的不同需要做一定的修改。在后面我們所提到的程序插樁均指源代碼插樁。2 程序插樁技術(shù)的討論眾多的籠罩測(cè)試工具中都
5、采納了程序插樁技術(shù),但是各有各的優(yōu)缺點(diǎn),而市場(chǎng)上認(rèn)為比較好的嵌入式測(cè)試工具有codetest,用法codetest工具插裝舉行測(cè)試對(duì)目標(biāo)程序的影響在1%到15%之間。下面向codetest 的插樁技術(shù)舉行的分析。2.1 codetest 工具的插樁技術(shù)分析codetest 的插樁過程容易來說分為兩步:(1)對(duì)源代碼舉行預(yù)編譯;被測(cè)程序首先會(huì)通過codetest 的編譯驅(qū)動(dòng)器調(diào)用程序的原編譯器舉行預(yù)編譯,通常是舉行宏替換。(2)對(duì)預(yù)編譯后的文件舉行插樁,生成插樁后的.c 文件和.idb 的插樁符號(hào)數(shù)據(jù)庫文件;預(yù)編譯完成后,codetest的插裝器(即源代碼分析程序)據(jù)不同的參數(shù)對(duì)預(yù)編譯后的源代碼
6、舉行相應(yīng)方式的自動(dòng)插樁,即在需要插樁的位置寫入一條賦值語句(如:amc_ctrl=0x74100010),并把插入的標(biāo)志送入數(shù)據(jù)庫文件中生成一個(gè)符號(hào)數(shù)據(jù)庫暫存起來,為以后的分析時(shí)調(diào)用。然后,codetest的編譯驅(qū)動(dòng)器會(huì)調(diào)用原編譯器對(duì)插樁后的代碼舉行編譯生成可執(zhí)行目標(biāo)代碼送到目標(biāo)板上運(yùn)行。當(dāng)程序在目標(biāo)系統(tǒng)運(yùn)行到插樁點(diǎn)的位置時(shí),目標(biāo)板的控制和地址總線上會(huì)浮現(xiàn)相應(yīng)的控制信號(hào)和地址信號(hào)。當(dāng) codetest的輔助硬件(信號(hào)捕捉探頭)從控制總線和地址總線上監(jiān)視到符合以上條件的信號(hào)時(shí),codetest會(huì)主動(dòng)地從數(shù)據(jù)總線上把數(shù)據(jù)捕捉回歸送到codetest的內(nèi)存中暫存并對(duì)這些數(shù)據(jù)舉行預(yù)處理,然后將預(yù)處理后
7、的數(shù)據(jù)通過局域網(wǎng)送到工作平臺(tái)上。通過與前面生成的符號(hào)數(shù)據(jù)庫中的數(shù)據(jù)舉行比較,我們就此得知當(dāng)前程序的運(yùn)行狀態(tài),借此完成對(duì)嵌入式軟件的性能分析,高級(jí)籠罩率分析,內(nèi)存分析和大容量的代碼跟蹤。codetest是一個(gè)硬件輔助軟件的測(cè)試與分析工具,它吸取軟件打點(diǎn)技術(shù),并對(duì)這種技術(shù)舉行了充實(shí),純軟件工具插入的是一個(gè)函數(shù),而codetest插入的是一條賦值語句,它在匯編級(jí)也是一條語句,所以它執(zhí)行的時(shí)光十分短,占用的空間也十分少,同時(shí)避開了被其它的中斷所中斷,所以它對(duì)目標(biāo)系統(tǒng)的影響十分?。?%-15%)。2.2 程序插樁的切入點(diǎn)codetest 作為一種商品,無數(shù)技術(shù)不對(duì)外藏匿 ,但是我們?nèi)钥梢悦髁似洳鍢兜脑?/p>
8、,進(jìn)而以此為參考對(duì)插樁技術(shù)做進(jìn)一步的討論;在國(guó)內(nèi),雖有無數(shù)工具用法了插樁技術(shù),但是都不夠高效, 為了便利討論我們挑選gcc 作為插樁技術(shù)討論的平臺(tái)。gcc 是一個(gè)高度優(yōu)化,高度可移植,且廣泛用法的編譯系統(tǒng)。它能處理多種語言,包括c/c+、fortran、java、ada 等多種語言前端,而且后端幾乎支持全部的處理器結(jié)構(gòu)。同時(shí)gcc作為源碼開放的軟件,可以自由修改和用法。圖1 是gcc 增強(qiáng)插樁階段后的編譯流程。gcc 編譯器的工作流程大致可以分為前端、中端和后端。中端gimple 層是高版本gcc 中新增強(qiáng)的,是用來對(duì)經(jīng)過詞法、語法分析后的程序舉行優(yōu)化和收拾的階段,我們這里可以臨時(shí)忽視這個(gè)階段
9、。前端包括預(yù)處理和詞法、語法分析。預(yù)處理通常是做宏替換處理。詞法、語法分析的輸入是預(yù)處理后的文件,輸出是ast ,ast 經(jīng)過優(yōu)化后產(chǎn)生gimple tree,然后交給rtl 模塊去處理。rtl(register transfer language)是一種中間語言,作為編譯器工作的后端,是gcc內(nèi)部用法的一種能對(duì)實(shí)際體系結(jié)構(gòu)作抽象的,與硬件無關(guān)的語言。在gcc 中將生成的中間代碼表達(dá)式以一種雙向鏈表的形式組織起來的,在鏈表中有一些特別的節(jié)點(diǎn),這些節(jié)點(diǎn)記錄了程序的結(jié)構(gòu)信息。gcc 編譯器前端的工作完成后,詞法語法分析器已經(jīng)識(shí)別完程序的全部特征,因此將詞法、語法分析至gimple 這個(gè)階段作為代碼
10、插樁的切入點(diǎn)是徹低可行的。然后,gcc 利用中間代碼生成會(huì)匯編代碼時(shí),假如掃描到rtl 中的特別節(jié)點(diǎn)就會(huì)按照用戶的需要適當(dāng)?shù)牟迦胍恍┩瓿尚畔⒉杉δ艿膮R編代碼行,從而就可以實(shí)現(xiàn)代碼插樁。但是這種做法有兩個(gè)缺點(diǎn):一是代碼的插樁和編譯器的結(jié)合很緊密,并且在匯編代碼的生成過程中需要針對(duì)不同的cpu 生成不同的匯編代碼,與cpu 的關(guān)聯(lián)性很強(qiáng),不便于移植;而是,當(dāng)程序很大時(shí),探針的植入會(huì)造成代碼的膨脹,及舉行信息采集的代碼的插入就需要無數(shù)時(shí)光。因?yàn)榇a插樁技術(shù)中插樁點(diǎn)識(shí)別過程中的詞法、語法分析只需要識(shí)別有限的程序結(jié)構(gòu)特征即可,而對(duì)程序中全部的詞法語法舉行分析是由于由中間代碼生成匯編代碼時(shí),需要以詞法語
11、法分析作為基礎(chǔ),識(shí)別出全部的程序結(jié)構(gòu)特征。由此可以知道滿足插樁技術(shù)要求的詞法語法分析器可以比中間代碼生成的詞法語法分析器容易。生成滿足插樁點(diǎn)識(shí)別的詞法語法分析器的詞法語法分析程序的輸入為預(yù)處理后的源代碼文件,輸出是插樁后的源代碼文件(1 所示的灰色部分)。因?yàn)樾略鰪?qiáng)的詞法語法分析程序僅僅是針對(duì)插樁所需識(shí)別的詞法、語法舉行分析,故而需要植入的探針比較少,代碼膨脹率自然減小,插樁速度加快,進(jìn)而囫圇編譯過程就會(huì)加快。2.3 插樁程序的設(shè)計(jì)探針的設(shè)計(jì)解決了插樁內(nèi)容的問題,而插樁程序的設(shè)計(jì)是用來確定插樁位置和插樁策略的,即回答“在哪插”和“如何插”的問題。(1)插樁位置:探針的植入要做到緊湊精干,才干保
12、證在做到收集的信息全面而無冗余,削減代碼的膨脹率。因此,在確定插樁位置時(shí),要將程序劃分,基本的劃分辦法是基于“塊”結(jié)構(gòu)。根據(jù)塊結(jié)構(gòu)的劃分,探針的植入位置有以下幾種狀況:a. 程序的第一條語句;b. 分支語句的開頭;c. 循環(huán)語句的開頭;d. 下一個(gè)入口語句之前的語句;e. 程序的結(jié)束語句;f. 分支語句的結(jié)束;g. 循環(huán)語句的結(jié)束;除此之外,按照籠罩測(cè)試要求的不同,插樁的位置除了上面所說的幾種狀況外,也會(huì)隨著籠罩測(cè)試要求的不同有所變幻。(2)插樁策略:插樁策略是解決“如何插”的問題。傳統(tǒng)的插樁策略是在全部需要插樁的位置插入探針,在程序運(yùn)行過程收集全部可能用到得程序信息,將其寫入數(shù)據(jù)庫舉行分析和
13、處理。這種辦法對(duì)于大型的程序來說,將會(huì)造成相當(dāng)大的工作量,效率很低,且會(huì)造成很大的代碼膨脹率。而我們會(huì)按照不同的測(cè)試要求,每次插入不同的探針,采納相應(yīng)的插樁策略,這樣就削減了代碼的膨脹率,保證了程序執(zhí)行的效率。下面容易介紹幾種探針的插樁策略。語句籠罩探針(基本塊探針):在基本塊的入口和出口處,分離植入相應(yīng)的探針,以確定程序執(zhí)行時(shí)該基本塊是否被籠罩。分支籠罩探針:c/c+語言中,分支由分支點(diǎn)確定。對(duì)于每個(gè)分支,在其開頭處植入一個(gè)相應(yīng)的探針,以確定程序執(zhí)行時(shí)該分支是否被籠罩。條件籠罩探針:c/c+語言中,if, swich,while, do-while, for 幾種語法結(jié)構(gòu)都支持條件判定,在每個(gè)條件表達(dá)式的布爾表達(dá)式處植入探針,舉行變量跟蹤取值,以確定其被籠罩狀況。按照不同測(cè)試要求采納不用的插樁策略,每次在不同的位置植入相應(yīng)的探針,使得每次只是植入有限的探針,這就更大大削減了代碼的膨脹率和插樁的速度。3 試驗(yàn)本文采納了一個(gè) 1000 行的程序作為被測(cè)程序,分離采納用法整體插樁的工具和我們自己開發(fā)的工具舉行測(cè)試,結(jié)果發(fā)覺前者插樁的時(shí)光和代碼膨脹率分離為3s 和35%,后者插樁的平均時(shí)光和平均的代碼膨脹率為1s 和8%,插樁時(shí)光得到顯然提升,代碼膨脹率顯然削減。采納以上的程序插樁技術(shù),除了常用的籠罩測(cè)試策略
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 區(qū)域 加盟 合同范本
- 醫(yī)院 設(shè)備 采購合同范本
- 刑事事件代理合同范本
- 協(xié)議付款合同范本
- 《三位數(shù)除以兩位數(shù)》的教學(xué)反思
- 代售票券合同范本
- 可變動(dòng)價(jià)格合同范本
- 原料藥項(xiàng)目建議書(范文)
- 低價(jià)收購二手房合同范本
- 臺(tái)灣企業(yè)雇傭合同范本
- 加油站加油合同范本
- 河南省南陽市2024-2025學(xué)年七年級(jí)上學(xué)期期末模擬英語試題(含答案)
- 2024年高中數(shù)學(xué)新課程標(biāo)準(zhǔn)考試模擬測(cè)試題及答案
- 煤礦員工安全培訓(xùn)教材一通三防篇
- 表演課程教案完整版
- 2024年新疆區(qū)公務(wù)員錄用考試《行測(cè)》試題及答案解析
- DB14-T 2736-2023 池塘養(yǎng)殖尾水處理規(guī)范
- 體重管理健康科普教育
- 大學(xué)數(shù)學(xué)《概率論與數(shù)理統(tǒng)計(jì)》說課稿
- 深大基坑設(shè)計(jì)施工關(guān)鍵技術(shù)孫加齊
- 《神經(jīng)外科常見疾病》課件
評(píng)論
0/150
提交評(píng)論