<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
關(guān) 閉

新聞中心

EEPW首頁(yè) > 工控自動(dòng)化 > 設計應用 > 覆蓋測試中高效代碼插樁技術(shù)的研究

覆蓋測試中高效代碼插樁技術(shù)的研究

作者: 時(shí)間:2010-12-21 來(lái)源:網(wǎng)絡(luò ) 收藏


2.1 CodeTest 工具的插樁技術(shù)分析

Codetest 的插樁過(guò)程簡(jiǎn)單來(lái)說(shuō)分為兩步:

(1)對源進(jìn)行預編譯;被測程序首先會(huì )通過(guò)CodeTest 的編譯驅動(dòng)器調用程序的原編譯器進(jìn)行預編譯,通常是進(jìn)行宏替換。

(2)對預編譯后的文件進(jìn)行插樁,生成插樁后的.C 文件和.IDB 的插樁符號數據庫文件;預編譯完成后,CodeTest的插裝器(即源分析程序)據不同的參數對預編譯后的源進(jìn)行相應方式的自動(dòng)插樁,即在需要插樁的位置寫(xiě)入一條賦值語(yǔ)句(如:amc_ctrl=0x74100010),并把插入的標記送入數據庫文件中生成一個(gè)符號數據庫暫存起來(lái),為以后的分析時(shí)調用。然后,CodeTest的編譯驅動(dòng)器會(huì )調用原編譯器對插樁后的代碼進(jìn)行編譯生成可執行目標代碼送到目標板上運行。當程序在目標系統運行到插樁點(diǎn)的位置時(shí),目標板的控制總線(xiàn)和地址總線(xiàn)上會(huì )出現相應的控制信號和地址信號。當 CodeTest的輔助硬件(信號捕獲探頭)從控制總線(xiàn)和地址總線(xiàn)上監視到符合以上條件的信號時(shí),CodeTest會(huì )主動(dòng)地從數據總線(xiàn)上把數據捕獲回來(lái)送到CodeTest的內存中暫存并對這些數據進(jìn)行預處理,然后將預處理后的數據通過(guò)局域網(wǎng)送到工作平臺上。通過(guò)與前面生成的符號數據庫中的數據進(jìn)行比較,我們就此得知當前程序的運行狀態(tài),借此完成對嵌入式軟件的性能分析,高級覆蓋率分析,內存分析和大容量的代碼跟蹤。

CodeTest是一個(gè)硬件輔助軟件的與分析工具,它吸取軟件打點(diǎn)技術(shù),并對這種技術(shù)進(jìn)行了改善,純軟件工具插入的是一個(gè)函數,而 CodeTest插入的是一條賦值語(yǔ)句,它在匯編級也是一條語(yǔ)句,所以它執行的時(shí)間非常短,占用的空間也非常少,同時(shí)避免了被其它的中斷所中斷,所以它對目標系統的影響非常?。?%-15%)。

2.2 程序插樁的切入點(diǎn)

CodeTest 作為一種商品,很多技術(shù)不對外公開(kāi) ,但是我們仍可以明白其插樁的原理,進(jìn)而以此為參考對插樁技術(shù)做進(jìn)一步的研究;在國內,雖有很多工具使用了插樁技術(shù),但是都不夠高效, 為了方便研究我們選擇GCC 作為插樁技術(shù)研究的平臺。

GCC 是一個(gè)高度優(yōu)化,高度可移植,且廣泛使用的編譯系統。它能處理多種語(yǔ)言,包括C/C++、Fortran、Java、Ada 等多種語(yǔ)言前端,而且后端幾乎支持所有的處理器結構。同時(shí)GCC作為源碼開(kāi)放的軟件,可以自由修改和使用。




圖1 是GCC 增加插樁階段后的編譯流程。

GCC 編譯器的工作流程大致可以分為前端、中端和后端。中端Gimple 層是高版本GCC 中新增加的,是用來(lái)對經(jīng)過(guò)詞法、語(yǔ)法分析后的程序進(jìn)行優(yōu)化和整理的階段,我們這里可以暫時(shí)忽略這個(gè)階段。前端包括預處理和詞法、語(yǔ)法分析。

預處理通常是做宏替換處理。詞法、語(yǔ)法分析的輸入是預處理后的文件,輸出是AST ,AST 經(jīng)過(guò)優(yōu)化后產(chǎn)生Gimple Tree,然后交給RTL 模塊去處理。RTL(Register Transfer Language)是一種中間語(yǔ)言,作為編譯器工作的后端,是GCC內部使用的一種能對實(shí)際體系結構作抽象的,與硬件無(wú)關(guān)的語(yǔ)言。在GCC 中將生成的中間代碼表達式以一種雙向鏈表的形式組織起來(lái)的,在鏈表中有一些特殊的節點(diǎn),這些節點(diǎn)記錄了程序的結構信息。

GCC 編譯器前端的工作完成后,詞法語(yǔ)法分析器已經(jīng)識別完程序的所有特征,因此將詞法、語(yǔ)法分析至Gimple 這個(gè)階段作為代碼插樁的切入點(diǎn)是完全可行的。然后,GCC 利用中間代碼生成會(huì )匯編代碼時(shí),如果掃描到RTL 中的特殊節點(diǎn)就會(huì )根據用戶(hù)的需要適當的插入一些完成信息采集功能的匯編代碼行,從而就可以實(shí)現代碼插樁。但是這種做法有兩個(gè)缺點(diǎn):一是代碼的插樁和編譯器的結合很緊密,并且在匯編代碼的生成過(guò)程中需要針對不同的CPU 生成不同的匯編代碼,與CPU 的關(guān)聯(lián)性很強,不便于移植;而是,當程序很大時(shí),探針的植入會(huì )造成代碼的膨脹,及進(jìn)行信息采集的代碼的插入就需要很多時(shí)間。


關(guān)鍵詞: 測試 代碼

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>