專利名稱:無痕可管理的源代碼自動(dòng)插樁方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)程序動(dòng)態(tài)分析,主要涉及一種無痕可管理的源代碼插樁方法。 該方法包括插樁點(diǎn)可視化、插樁點(diǎn)管理、插樁點(diǎn)定位、自動(dòng)插樁框架、自動(dòng)插樁性能優(yōu)化五個(gè)部分。
背景技術(shù):
程序分析通常利用靜態(tài)程序分析和動(dòng)態(tài)程序分析對(duì)程序行為進(jìn)行自動(dòng)分析,進(jìn)而提高軟件質(zhì)量。動(dòng)態(tài)程序分析常借助于插樁方法來收集程序動(dòng)態(tài)運(yùn)行行為,某些與運(yùn)行環(huán)境相關(guān)的程序行為只能通過插樁來收集,而靜態(tài)程序分析無法進(jìn)行分析。軟件開發(fā)過程中, 代碼審查者在代碼編寫階段完成后使用源代碼插樁方法對(duì)代碼進(jìn)行審查,通常審查者擁有閱讀源代碼權(quán)限但不便對(duì)代碼進(jìn)行修改。通過對(duì)程序運(yùn)行行為的分析盡早發(fā)現(xiàn)代碼中的錯(cuò)誤,進(jìn)而提高軟件質(zhì)量。源代碼插樁能夠充分地利用程序語義、可視化地顯示插樁代碼、并且不會(huì)提高代碼邏輯復(fù)雜性。程序插樁技術(shù),是在保證被測程序原有邏輯完整性的基礎(chǔ)上在程序中插入一些探針,通過探針的執(zhí)行并拋出程序運(yùn)行的特征數(shù)據(jù),通過對(duì)這些數(shù)據(jù)的分析,可以獲得程序的控制流和數(shù)據(jù)流信息,進(jìn)而得到邏輯覆蓋等動(dòng)態(tài)信息,從而實(shí)現(xiàn)測試目的的方法。由于程序插樁技術(shù)是在被測程序中插入探針,然后通過探針的執(zhí)行來獲得程序的控制流和數(shù)據(jù)流信息,以此來實(shí)現(xiàn)測試的目的。因此,根據(jù)探針插入的時(shí)間可以分為目標(biāo)代碼插樁和源代碼插樁?,F(xiàn)有插樁方法主要包括斷言機(jī)制、字節(jié)碼插樁、面向方面插樁等三類方法。斷言機(jī)制直接在寫源文件中添加插樁代碼,將會(huì)降低代碼閱讀性。字節(jié)碼插樁則直接對(duì)字節(jié)碼文件進(jìn)行修改,被插字節(jié)碼的源代碼無法可視化,且無法保證代碼插入過程的正確性。面向方面插樁在程序縱向繼承關(guān)系的基礎(chǔ)上增加了橫向方面關(guān)系,增加了程序的邏輯復(fù)雜性。目前插樁技術(shù)主要存在插樁點(diǎn)及其代碼可視化、被插代碼管理、插樁點(diǎn)自動(dòng)定位、 自動(dòng)插樁性能較低的問題。
發(fā)明內(nèi)容
鑒于上述問題,本發(fā)明旨在提供一個(gè)源代碼插樁方法,該方法不僅支持手動(dòng)插樁, 并且支持批量自動(dòng)插樁。其主要特點(diǎn)有插樁代碼可視化、插入代碼集中管理、插樁過程無痕化、插樁點(diǎn)自動(dòng)化定位、自動(dòng)插樁可擴(kuò)展性和自動(dòng)插樁高效性。本發(fā)明是通過以下技術(shù)方案實(shí)現(xiàn)的一種無痕可管理的源代碼自動(dòng)插樁方法,步驟包括步驟40 開始,打開一個(gè)工程;步驟41 定義一個(gè)文件過濾器,對(duì)所需插樁的工程進(jìn)行匹配,保留匹配的工程;步驟42 接著使用所述文件過濾器對(duì)被插樁的源文件進(jìn)行過濾;步驟43 選擇自動(dòng)插樁的具體應(yīng)用類型,定義相應(yīng)類型所需插樁的代碼;
步驟44 用語法樹結(jié)構(gòu)匹配,根據(jù)自動(dòng)插樁的具體應(yīng)用類型進(jìn)行相應(yīng)插樁點(diǎn)的位置定位,并在相應(yīng)位置插入代碼,生成一個(gè)新源文件;步驟45 所述新源文件進(jìn)行編譯產(chǎn)生新的可執(zhí)行字節(jié)碼文件,并保存;步驟46 生成可執(zhí)行文件,結(jié)束。本自動(dòng)插樁方法提供了元插樁類型重用框架,包括元插樁操作組合器和元插樁類型池,其中,元插樁類型池包括多個(gè)元插樁類型,并且支持添加新的元插樁類型;元插樁操作組合器將多個(gè)元插樁類型組合到一起,通過遍歷一次語法樹完成在語法樹上多種類型的插樁操作;所述元插樁類型支持對(duì)不同類型插樁進(jìn)行插樁,且每一個(gè)元插樁類型只能針對(duì)某一類型元插樁進(jìn)行插樁。所述步驟41中,對(duì)所需插樁的工程進(jìn)行匹配,包括匹配工程中的包、文件、和方法。所述步驟42中,所述源文件過濾的步驟包括步驟60 開始源文件過濾是對(duì)某一工作空間所有源文件進(jìn)行過濾;步驟61 先判斷該工作空間是否包含其它工程,如沒有則跳轉(zhuǎn)到步驟64,若有則進(jìn)入步驟62 ;步驟62 匹配工程名,如果匹配則進(jìn)入步驟63,如果不匹配則返回步驟61繼續(xù)查看是否有下一個(gè)工程;步驟63 如果工程名匹配,說明該工程需要進(jìn)行插樁,將其添加到插樁工程集合中,然后跳回至步驟61 ;步驟64 進(jìn)行包的過濾,先判斷工程集合中的工程是否包含其它包(此處其它包的說明Java工程中包括多個(gè)package,逐個(gè)包進(jìn)行過濾,看看還有沒有其它包沒有進(jìn)行過濾。包是指java語言中package的概念),如沒有則跳轉(zhuǎn)到步驟67開始進(jìn)行文件的過濾, 若有則進(jìn)入步驟65 ;步驟65 匹配包名,若匹配則進(jìn)入步驟66,若不匹配則回到步驟64繼續(xù)查看是否有下一個(gè)包;步驟66 匹配包名,若相匹配,說明該包需要進(jìn)行插樁,將其添加到插樁包集合中,然后跳回至步驟64;步驟67 判斷包集合中的包是否包含其它源文件,如果沒有則跳轉(zhuǎn)到步驟6b,如果有則進(jìn)入步驟68 ;步驟68 匹配源文件名,若匹配則進(jìn)入步驟69對(duì)方法進(jìn)行匹配,否則跳回至步驟 67 ;步驟69 匹配方法,若匹配則進(jìn)入步驟6a,否則跳回至步驟67 ;步驟6a 將匹配的源文件添加到文件匹配集合;步驟6b 對(duì)工程中所有工程名、包名、文件名和方法名進(jìn)行匹配后并完成對(duì)文件的過濾操作。所述步驟62中,匹配工程名,是將工程名與工程名正則表達(dá)式進(jìn)行匹配;所述步驟65中,匹配包名,是將包名與包名正則表達(dá)式進(jìn)行匹配;
所述步驟66中,匹配包名,是將包名與包名正則表達(dá)式進(jìn)行匹配;所述步驟68中,匹配源文件名,是將源文件名與源文件名正則表達(dá)式進(jìn)行匹配;所述步驟69中,匹配方法,是將源文件中的方法的方法名與方法名正則表達(dá)式進(jìn)行匹配。所述步驟44中,通過語法樹匹配可實(shí)現(xiàn)插樁定位,該部分使用visitor模式進(jìn)行匹配,語法樹匹配并插入代碼的步驟包括步驟70 開始對(duì)源文件進(jìn)行插樁是逐個(gè)文件進(jìn)行操作的,然后根據(jù)不同插樁類型進(jìn)行插樁;插樁類型包括方法、IF分支、Switch分支、While分支、Do-while分支和For 分支類型;步驟71 查看是否還有下一個(gè)源文件,如果沒有則進(jìn)入步驟幾,結(jié)束;如果有則進(jìn)入步驟72 ;步驟72 先把源文件編譯成語法樹,再以Visitor模式訪問各個(gè)節(jié)點(diǎn),Visitor模型下幾種插樁類型的操作步驟如下步驟73 首先判斷語法樹是否有下一個(gè)節(jié)點(diǎn);步驟74 根據(jù)所選插樁類型判斷是否包含方法類型,若包含并且該結(jié)點(diǎn)是方法體結(jié)點(diǎn),則進(jìn)入步驟75,否則跳轉(zhuǎn)到步驟76 ;步驟75 將事先由分析人員所定義的方法類型插樁代碼插入到抽象語法樹中的相應(yīng)節(jié)點(diǎn);步驟76 根據(jù)所選插樁類型判斷是否包含IF分支類型,若包含并且該結(jié)點(diǎn)是IF 分支結(jié)點(diǎn),則進(jìn)入步驟77,否則跳轉(zhuǎn)到步驟78 ;步驟77 將事先由分析人員所定義的IF分支類型插樁代碼插入到抽象語法樹中的相應(yīng)節(jié)點(diǎn);步驟78 根據(jù)所選插樁類型判斷是否包含Switch分支類型,若包含并且該結(jié)點(diǎn)是 Switch分支結(jié)點(diǎn),則進(jìn)入步驟79,否則跳轉(zhuǎn)到步驟7a ;步驟79 將事先由分析人員所定義的Switch分支類型插樁代碼插入到抽象語法樹中的相應(yīng)節(jié)點(diǎn);步驟7a 根據(jù)所選插樁類型判斷是否包含While分支類型,若包含并且該結(jié)點(diǎn)是 While分支結(jié)點(diǎn),則進(jìn)入步驟7b,否則跳轉(zhuǎn)到步驟7a ;步驟7b 將事先由分析人員所定義的While分支類型插樁代碼插入到抽象語法樹中的相應(yīng)節(jié)點(diǎn);步驟7c 根據(jù)所選插樁類型判斷是否包含Do-While分支類型,若包含并且該結(jié)點(diǎn)是Do-Whi Ie分支結(jié)點(diǎn),則進(jìn)入步驟7d,否則跳轉(zhuǎn)到步驟7a ;步驟7d 將事先由分析人員所定義的Do-While分支類型插樁代碼插入到抽象語法樹中的相應(yīng)節(jié)點(diǎn);步驟7e:根據(jù)所選插樁類型判斷是否包含分支類型,若包含并且該結(jié)點(diǎn)是分支結(jié)點(diǎn),則進(jìn)入步驟7f,否則跳轉(zhuǎn)到步驟7a ;步驟7f 將事先由分析人員所定義的For分支類型插樁代碼插入到抽象語法樹中的相應(yīng)節(jié)點(diǎn);步驟7g 完成語法樹插樁后,將語法樹轉(zhuǎn)換成源代碼文件,然后進(jìn)入步驟73對(duì)下一個(gè)源文件進(jìn)行插樁;步驟幾完成了對(duì)所有文件的插樁插樁,整個(gè)過程結(jié)束。本發(fā)明的自動(dòng)插樁方案是針對(duì)某具體應(yīng)用類型進(jìn)行的,利用抽象語法樹的結(jié)構(gòu)匹配進(jìn)行插樁點(diǎn)自動(dòng)定位,插樁點(diǎn)自動(dòng)定位是自動(dòng)插樁部分的重點(diǎn)。定位后將代碼片段的語法樹添加到原文件的語法樹中的相應(yīng)位置,然后將產(chǎn)生的新語法樹并將其轉(zhuǎn)換成源代碼, 最后將新文件編譯成字節(jié)碼文件,所得字節(jié)碼文件可直接運(yùn)行。整個(gè)自動(dòng)插樁過程是逐個(gè)文件進(jìn)行的。首先將原文件和插樁代碼編譯成語法樹, 接著遍歷每個(gè)文件的語法樹查看是否具有與插樁類型相匹配的語法樹結(jié)構(gòu)。找到匹配的語法樹結(jié)點(diǎn)后,將對(duì)應(yīng)插樁類型代碼的語法樹合并到原文件的語法樹上。語法樹結(jié)構(gòu)匹配使用了 Visitor設(shè)計(jì)模式,利用該設(shè)計(jì)模式逐結(jié)點(diǎn)地遍歷整個(gè)語法樹,進(jìn)而實(shí)現(xiàn)了樹形結(jié)構(gòu)的匹配。為提高自動(dòng)插樁的效率,本發(fā)明為自動(dòng)插樁提供了文件過濾方法和元插樁類型重用框架。利用文件過濾方法可以對(duì)所需編譯的文件進(jìn)行過濾,降低所需編譯文件數(shù)量。程序分析時(shí)只需對(duì)整個(gè)工作空間(或工程)中的部分代碼進(jìn)行分析,分析員對(duì)工作空間(或工程)的結(jié)構(gòu)已有所了解,利用分析員已有知識(shí)對(duì)自動(dòng)插樁過程進(jìn)行優(yōu)化。分析者定義一些正則表達(dá)式進(jìn)而對(duì)文件進(jìn)行過濾,與之相匹配的文件(工程或包)將被保留下來。通過上述方案,所需編譯文件數(shù)目將大大減小。進(jìn)一步的,在自動(dòng)插樁中,若每種元插樁類型的插樁過程都需遍歷一遍語法樹,則使用多個(gè)元插樁類型進(jìn)行插樁時(shí)開銷將很大。整個(gè)過程開銷主要體現(xiàn)在對(duì)原文件的編譯, 將文件編譯成語法樹其時(shí)間代價(jià)大,本發(fā)明提供元插樁類型重用框架以便解決該問題。元插樁類型重用框架主要包含元插樁類型池、元插樁操作組合器,其中元插樁類型池包含多個(gè)元插樁類型。每種元插樁類型都是針對(duì)某一具體類型進(jìn)行的并對(duì)插樁點(diǎn)的結(jié)構(gòu)匹配進(jìn)行定義,但元插樁類型并不能直接對(duì)語法樹進(jìn)行操作,需結(jié)合元插樁操作組合器進(jìn)行使用。元插樁操作組合器將對(duì)文件的語法樹進(jìn)行遍歷,根據(jù)元插樁類型所定義結(jié)構(gòu)對(duì)語法樹進(jìn)行修改。元插樁類型池支持定義并添加新的插樁類型,進(jìn)而實(shí)現(xiàn)對(duì)不同應(yīng)用類型自動(dòng)插樁的擴(kuò)展。本發(fā)明利用標(biāo)志保存插樁代碼,并將插樁代碼與原有代碼區(qū)分開來,提高了插樁代碼可視化能力。標(biāo)志可以在插樁位置顯示相應(yīng)的插樁代碼,且不會(huì)干擾原文件編輯工作。 同時(shí)可以集中管理所有插樁標(biāo)志,進(jìn)而提高插樁代碼的管理能力。本發(fā)明還利用語法樹結(jié)構(gòu)匹配進(jìn)而實(shí)現(xiàn)插樁點(diǎn)的自動(dòng)定位,自動(dòng)定位能有效地實(shí)現(xiàn)自動(dòng)插樁功能。在抽象語法樹上,自動(dòng)插樁在所得定位位置添加插樁代碼,然后將新的語法樹轉(zhuǎn)換成源文件。為提高自動(dòng)插樁的效率,本發(fā)明還設(shè)計(jì)了文件過濾和元插樁類型重用框架。以上所有操作均在后臺(tái)完成且不修改用戶原文件,整個(gè)過程是一個(gè)無痕過程。附圖內(nèi)容
圖1為自動(dòng)插樁的完整的流程圖。圖2為自動(dòng)插樁的元插樁類型重用框架圖。圖3為自動(dòng)插樁中文件過濾的流程圖。圖4為自動(dòng)插樁中,語法樹匹配并插入代碼的流程圖。
具體實(shí)施例方式下面通過附圖對(duì)本發(fā)明的技術(shù)方案做進(jìn)一步的詳細(xì)描述。一種無痕可管理的源代碼自動(dòng)插樁方法,本方法是針對(duì)某具體應(yīng)用類型進(jìn)行的, 利用抽象語法樹的結(jié)構(gòu)匹配進(jìn)行插樁點(diǎn)的自動(dòng)定位,插樁點(diǎn)自動(dòng)定位自動(dòng)插樁部分的重點(diǎn)。定位后將代碼片段的語法樹結(jié)構(gòu)添加到原文件的語法樹結(jié)構(gòu)中的相應(yīng)位置,將產(chǎn)生的新語法樹轉(zhuǎn)換成源代碼并編譯成字節(jié)碼,所得字節(jié)碼可以直接進(jìn)行運(yùn)行。自動(dòng)插樁的完整的流程圖如圖1所示,包括如下步驟步驟40 整個(gè)自動(dòng)插樁過程的開始,此時(shí)打開一個(gè)工程并準(zhǔn)備通過插樁對(duì)其進(jìn)行分析;步驟41 定義一個(gè)文件過濾器,文件過濾器使用正則表達(dá)式對(duì)所需插樁的工程 (包、文件、方法)進(jìn)行匹配,與之匹配的則將保留下來;步驟42 接著使用上述定義的過濾器對(duì)被插樁的文件進(jìn)行過濾,利用分析者對(duì)工程文件已有知識(shí)提高了自動(dòng)插樁性能;步驟43 選擇所需插樁的類型,定義相關(guān)類型所需插樁的代碼;步驟44 接著利用語法樹結(jié)構(gòu)匹配根據(jù)不同的插樁類型進(jìn)行插樁點(diǎn)的位置定位, 并在相應(yīng)位置插入代碼最終產(chǎn)生一個(gè)新的文件;步驟45 對(duì)上述新的文件進(jìn)行編譯產(chǎn)生新的可執(zhí)行字節(jié)碼文件,并將這些文件保存起來;步驟46 最終產(chǎn)生可執(zhí)行文件,整個(gè)過程將不會(huì)修改原有文件信息,整個(gè)過程是一個(gè)無痕的過程。自動(dòng)插樁方案中為提高插樁效率提供了文件過濾方案和元插樁類型重用框架。自動(dòng)插樁的元插樁類型重用框架圖如圖2所示,該框架主要是由元插樁操作組合器和元插樁類型池兩部分組成。其中元插樁類型支持對(duì)不同類型插樁進(jìn)行插樁,且每一個(gè)元插樁只能針對(duì)某一類型進(jìn)行插樁。元插樁類型池包含多個(gè)元插樁類型,并且支持添加新的元插樁類型。元插樁操作組合器用于將多個(gè)元插樁類型組合到一起,通過遍歷一次語法樹進(jìn)而完成在語法樹上多種類型的插樁操作。文件過濾方案通過減小插樁文件集合,降低被編譯文件數(shù)目。插樁過程中并非每個(gè)文件都需要進(jìn)行插樁,編譯一些無關(guān)文件并將語法樹遍歷一遍將會(huì)浪費(fèi)大量時(shí)間。通過文件過濾將大大降低插樁文件集大小,自動(dòng)插樁文件過濾的流程圖如圖3所示,包括如下步驟步驟60 自動(dòng)插樁文件過濾是對(duì)某一工作空間所有文件進(jìn)行過濾;步驟61 先看該工作空間是否包含其它工程,如沒有則跳轉(zhuǎn)到步驟64開始進(jìn)行包的過濾,若有則進(jìn)入下一步;步驟62 將工程名與工程名正則表達(dá)式進(jìn)行匹配,若匹配則進(jìn)入下一步驟,若不匹配則回到步驟61繼續(xù)查看是否有下一個(gè)工程;步驟63 該工程名與正則表達(dá)式相匹配,說明該工程需要進(jìn)行插樁,將其添加到插樁工程集合中,然后跳回至步驟61 ;步驟64 先看工程集合中的工程是否包含其它包,如沒有則跳轉(zhuǎn)到步驟67開始進(jìn)行文件的過濾,若有則進(jìn)入下一步;步驟65 將包名與包名正則表達(dá)式進(jìn)行匹配,若匹配則進(jìn)入下一步驟,若不匹配則回到步驟64繼續(xù)查看是否有下一個(gè)包;步驟66 該包名與正則表達(dá)式相匹配,說明該包需要進(jìn)行插樁,將其添加到插樁包集合中,然后跳回至步驟64;步驟67 先看包集合中的包是否包含其它文件,如果沒有則跳轉(zhuǎn)到步驟6b,如果有則進(jìn)入下一步;步驟68 將文件名與文件名正則表達(dá)式進(jìn)行匹配,若匹配則進(jìn)入下一步對(duì)方法名進(jìn)行匹配,否則跳回至步驟67 ;步驟69 查看文件中是否包含與方法名正則表達(dá)式相匹配的方法,若匹配則進(jìn)入下一步,否則跳回至步驟67;步驟6a 將匹配的文件添加到文件匹配集合;步驟6b 對(duì)工程中所有工程名、包名、文件名以及方法名進(jìn)行匹配后并完成對(duì)文件的過濾操作。通過語法樹匹配可實(shí)現(xiàn)插樁定位,該部分使用設(shè)計(jì)模式中的visitor模式進(jìn)行匹配,語法樹匹配并插入代碼的流程圖如圖4所示,包括如下步驟步驟70 對(duì)文件進(jìn)行插樁是逐個(gè)文件進(jìn)行操作的,然后根據(jù)不同插樁類型進(jìn)行插樁,下面流程包含對(duì)方法、IF分支、Switch分支、While分支、Do-while分支以及For分支類型進(jìn)行語法樹結(jié)構(gòu)匹配并進(jìn)行插樁。步驟71 查看是否還有下一個(gè)文件,如果沒有則結(jié)束,否則進(jìn)入下一步驟;步驟72 將文件編譯成語法樹,以便后面的插樁定位使用,下面將以Visitor模式訪問各個(gè)節(jié)點(diǎn),下面幾個(gè)步驟描述了 visitor模型下幾種插樁類型的操作;步驟73 首先判斷語法樹是否有下一個(gè)節(jié)點(diǎn);步驟74 根據(jù)所選插樁類型判斷是否包含方法類型,若包含并且該結(jié)點(diǎn)是方法體結(jié)點(diǎn),則跳轉(zhuǎn)到下一步,否則跳轉(zhuǎn)到步驟76 ;步驟75 將事先由分析人員所定義的方法類型插樁代碼插入到抽象語法樹中;步驟76 根據(jù)所選插樁類型判斷是否包含IF分支類型,若包含并且該結(jié)點(diǎn)是IF 分支結(jié)點(diǎn),則跳轉(zhuǎn)到下一步,否則跳轉(zhuǎn)到步驟78 ;步驟77 將事先由分析人員所定義的IF分支類型插樁代碼插入到抽象語法樹中;步驟78 根據(jù)所選插樁類型判斷是否包含Switch分支類型,若包含并且該結(jié)點(diǎn)是 Switch分支結(jié)點(diǎn),則跳轉(zhuǎn)到下一步,否則跳轉(zhuǎn)到步驟7a ;步驟79 將事先由分析人員所定義的Switch分支類型插樁代碼插入到抽象語法樹中;步驟7a 根據(jù)所選插樁類型判斷是否包含While分支類型,若包含并且該結(jié)點(diǎn)是 While分支結(jié)點(diǎn),則跳轉(zhuǎn)到下一步,否則跳轉(zhuǎn)到步驟7a ;步驟7b 將事先由分析人員所定義的While分支類型插樁代碼插入到抽象語法樹中;步驟7c 根據(jù)所選插樁類型判斷是否包含Do-While分支類型,若包含并且該結(jié)點(diǎn)是Do-While分支結(jié)點(diǎn),則跳轉(zhuǎn)到下一步,否則跳轉(zhuǎn)到步驟7a ;步驟7d 將事先由分析人員所定義的Do-While分支類型插樁代碼插入到抽象語法樹中;步驟7e:根據(jù)所選插樁類型判斷是否包含分支類型,若包含并且該結(jié)點(diǎn)是分支結(jié)點(diǎn),則跳轉(zhuǎn)到下一步,否則跳轉(zhuǎn)到步驟7a ;步驟7f 將事先由分析人員所定義的For分支類型插樁代碼插入到抽象語法樹中;步驟7g 完成語法樹插樁后,將語法樹轉(zhuǎn)換成源代碼文件,然后進(jìn)入下一步對(duì)下一個(gè)文件進(jìn)行插樁;步驟幾完成了對(duì)所有文件的插樁插樁,整個(gè)過程結(jié)束;最后對(duì)所產(chǎn)生的新文件進(jìn)行編譯,生成包含原文件和插樁代碼的字節(jié)碼文件,運(yùn)行這些文件便可獲得插樁后文件運(yùn)行結(jié)果。本發(fā)明的技術(shù)方案利用標(biāo)志編輯并保存插樁代碼,插樁標(biāo)志能夠?qū)⒉鍢洞a與原代碼區(qū)分開,同時(shí)能在插樁位置顯示插樁代碼,能夠有效地提高程序的可閱讀性。插樁標(biāo)志不影響對(duì)源程序的編輯工作,此外插樁點(diǎn)的集中管理提高了插樁標(biāo)志的易用性。本發(fā)明使用語法樹結(jié)構(gòu)匹配提高了定位精度,將原源代碼文件編譯成語法樹后進(jìn)行結(jié)構(gòu)匹配,對(duì)語法樹進(jìn)行修改最后將語法樹轉(zhuǎn)換成源代碼文件。另外,為提高匹配效率,方案還提出了文件過濾方法和元插樁類型重用框架。文件過濾方法有效地降低了所需編譯和遍歷的文件數(shù)目,元插樁類型重用框架使得多種插樁類型能在一次語法樹遍歷中完成。最后應(yīng)當(dāng)說明的是以上步驟僅用于說明本發(fā)明的技術(shù)方案而非對(duì)其限制。盡管上述步驟對(duì)本發(fā)明進(jìn)行了詳細(xì)的說明,相關(guān)領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,依然可以對(duì)本發(fā)明的具體技術(shù)進(jìn)行修改或者對(duì)部分技術(shù)進(jìn)行等同替換;而不脫離本發(fā)明技術(shù)方案的精神,其均應(yīng)涵蓋在本發(fā)明請(qǐng)求保護(hù)的技術(shù)方案范圍當(dāng)中。
權(quán)利要求
1.一種無痕可管理的源代碼自動(dòng)插樁方法,其特征是步驟包括 步驟40:開始,打開一個(gè)工程;步驟41 定義一個(gè)文件過濾器,對(duì)所需插樁的工程進(jìn)行匹配,保留匹配的工程; 步驟42 接著使用所述文件過濾器對(duì)被插樁的源文件進(jìn)行過濾; 步驟43 選擇自動(dòng)插樁的具體應(yīng)用類型,定義相應(yīng)類型所需插樁的代碼; 步驟44:用語法樹結(jié)構(gòu)匹配,根據(jù)自動(dòng)插樁的具體應(yīng)用類型進(jìn)行相應(yīng)插樁點(diǎn)的位置定位,并在相應(yīng)位置插入代碼,生成一個(gè)新源文件;步驟45 所述新源文件進(jìn)行編譯產(chǎn)生新的可執(zhí)行字節(jié)碼文件,并保存; 步驟46 生成可執(zhí)行文件,結(jié)束。
2.根據(jù)權(quán)利要求1所述的無痕可管理的源代碼自動(dòng)插樁方法,其特征是本自動(dòng)插樁方法提供了元插樁類型重用框架,包括元插樁操作組合器和元插樁類型池,其中,元插樁類型池包括多個(gè)元插樁類型,并且支持添加新的元插樁類型; 元插樁操作組合器將多個(gè)元插樁類型組合到一起,通過遍歷一次語法樹完成在語法樹上多種類型的插樁操作;所述元插樁類型支持對(duì)不同類型插樁進(jìn)行插樁,且每一個(gè)元插樁類型只能針對(duì)某一類型元插樁進(jìn)行插樁。
3.根據(jù)權(quán)利要求1所述的無痕可管理的源代碼自動(dòng)插樁方法,其特征是所述步驟41 中,對(duì)所需插樁的工程進(jìn)行匹配,包括匹配工程中的包、文件、和方法。
4.根據(jù)權(quán)利要求3所述的無痕可管理的源代碼自動(dòng)插樁方法,其特征是所述步驟42 中,所述源文件過濾的步驟包括步驟60 開始源文件過濾是對(duì)某一工作空間所有源文件進(jìn)行過濾; 步驟61 先判斷該工作空間是否包含其它工程,如沒有則跳轉(zhuǎn)到步驟64,若有則進(jìn)入步驟62 ;步驟62 匹配工程名,如果匹配則進(jìn)入步驟63,如果不匹配則返回步驟61繼續(xù)查看是否有下一個(gè)工程;步驟63:如果工程名匹配,說明該工程需要進(jìn)行插樁,將其添加到插樁工程集合中,然后跳回至步驟61 ;步驟64:進(jìn)行包的過濾,先判斷工程集合中的工程是否包含其它包,如沒有則跳轉(zhuǎn)到步驟67開始進(jìn)行文件的過濾,若有則進(jìn)入步驟65 ;步驟65 匹配包名,若匹配則進(jìn)入步驟66,若不匹配則回到步驟64繼續(xù)查看是否有下一個(gè)包;步驟66 匹配包名,若相匹配,說明該包需要進(jìn)行插樁,將其添加到插樁包集合中,然后跳回至步驟64;步驟67 判斷包集合中的包是否包含其它源文件,如果沒有則跳轉(zhuǎn)到步驟6b,如果有則進(jìn)入步驟68 ;步驟68 匹配源文件名,若匹配則進(jìn)入步驟69對(duì)方法進(jìn)行匹配,否則跳回至步驟67 ; 步驟69 匹配方法,若匹配則進(jìn)入步驟6a,否則跳回至步驟67 ; 步驟6a 將匹配的源文件添加到文件匹配集合;步驟6b 對(duì)工程中所有工程名、包名、文件名和方法名進(jìn)行匹配后并完成對(duì)文件的過濾操作。
5.根據(jù)權(quán)利要求4所述的無痕可管理的源代碼自動(dòng)插樁方法,其特征是所述步驟62中,匹配工程名,是將工程名與工程名正則表達(dá)式進(jìn)行匹配; 所述步驟65中,匹配包名,是將包名與包名正則表達(dá)式進(jìn)行匹配;所述步驟66中,匹配包名,是將包名與包名正則表達(dá)式進(jìn)行匹配; 所述步驟68中,匹配源文件名,是將源文件名與源文件名正則表達(dá)式進(jìn)行匹配; 所述步驟69中,匹配方法,是將源文件中的方法的方法名與方法名正則表達(dá)式進(jìn)行匹配。
6.根據(jù)權(quán)利要求1所述的無痕可管理的源代碼自動(dòng)插樁方法,其特征是所述步驟44 中,通過語法樹匹配可實(shí)現(xiàn)插樁定位,該部分使用visitor模式進(jìn)行匹配,語法樹匹配并插入代碼的步驟包括步驟70 開始對(duì)源文件進(jìn)行插樁是逐個(gè)文件進(jìn)行操作的,然后根據(jù)不同插樁類型進(jìn)行插樁;插樁類型包括方法、IF分支、Switch分支、While分支、Do-while分支和For分支類型;步驟71 查看是否還有下一個(gè)源文件,如果沒有則進(jìn)入步驟幾,結(jié)束;如果有則進(jìn)入步驟72 ;步驟72 先把源文件編譯成語法樹,再以Visitor模式訪問各個(gè)節(jié)點(diǎn),Visitor模型下幾種插樁類型的操作步驟如下步驟73 首先判斷語法樹是否有下一個(gè)節(jié)點(diǎn);步驟74:根據(jù)所選插樁類型判斷是否包含方法類型,若包含并且該結(jié)點(diǎn)是方法體結(jié)點(diǎn),則進(jìn)入步驟75,否則跳轉(zhuǎn)到步驟76 ;步驟75 將事先由分析人員所定義的方法類型插樁代碼插入到抽象語法樹中的相應(yīng)節(jié)占.I— /、、、 步驟76 根據(jù)所選插樁類型判斷是否包含IF分支類型,若包含并且該結(jié)點(diǎn)是IF分支結(jié)點(diǎn),則進(jìn)入步驟77,否則跳轉(zhuǎn)到步驟78 ;步驟77 將事先由分析人員所定義的IF分支類型插樁代碼插入到抽象語法樹中的相應(yīng)節(jié)點(diǎn);步驟78 根據(jù)所選插樁類型判斷是否包含Switch分支類型,若包含并且該結(jié)點(diǎn)是 Switch分支結(jié)點(diǎn),則進(jìn)入步驟79,否則跳轉(zhuǎn)到步驟7a ;步驟79 將事先由分析人員所定義的Switch分支類型插樁代碼插入到抽象語法樹中的相應(yīng)節(jié)點(diǎn);步驟7a:根據(jù)所選插樁類型判斷是否包含Whi Ie分支類型,若包含并且該結(jié)點(diǎn)是 While分支結(jié)點(diǎn),則進(jìn)入步驟7b,否則跳轉(zhuǎn)到步驟7a ;步驟7b 將事先由分析人員所定義的While分支類型插樁代碼插入到抽象語法樹中的相應(yīng)節(jié)點(diǎn);步驟7c 根據(jù)所選插樁類型判斷是否包含Do-While分支類型,若包含并且該結(jié)點(diǎn)是 Do-While分支結(jié)點(diǎn),則進(jìn)入步驟7d,否則跳轉(zhuǎn)到步驟7a ;步驟7d 將事先由分析人員所定義的Do-While分支類型插樁代碼插入到抽象語法樹中的相應(yīng)節(jié)點(diǎn);步驟7e 根據(jù)所選插樁類型判斷是否包含F(xiàn)or分支類型,若包含并且該結(jié)點(diǎn)是For分支結(jié)點(diǎn),則進(jìn)入步驟7f,否則跳轉(zhuǎn)到步驟7a ;步驟7f 將事先由分析人員所定義的For分支類型插樁代碼插入到抽象語法樹中的相應(yīng)節(jié)點(diǎn);步驟7g 完成語法樹插樁后,將語法樹轉(zhuǎn)換成源代碼文件,然后進(jìn)入步驟73對(duì)下一個(gè)源文件進(jìn)行插樁;步驟幾完成了對(duì)所有文件的插樁插樁,整個(gè)過程結(jié)束。
全文摘要
一種無痕可管理的源代碼自動(dòng)插樁方法,步驟包括40開始,打開一個(gè)工程;41定義一個(gè)文件過濾器,對(duì)所需插樁的工程進(jìn)行匹配,保留匹配的工程;42接著使用所述文件過濾器對(duì)被插樁的源文件進(jìn)行過濾;43選擇自動(dòng)插樁的具體應(yīng)用類型,定義相應(yīng)類型所需插樁的代碼;44用語法樹結(jié)構(gòu)匹配,根據(jù)自動(dòng)插樁的具體應(yīng)用類型進(jìn)行相應(yīng)插樁點(diǎn)的位置定位,并在相應(yīng)位置插入代碼,生成一個(gè)新源文件;45所述新源文件進(jìn)行編譯產(chǎn)生新的可執(zhí)行字節(jié)碼文件,并保存;46生成可執(zhí)行文件,結(jié)束。本方法主要特點(diǎn)為插樁代碼可視化、集中管理插入代碼、插樁過程無痕化、插樁點(diǎn)自動(dòng)化定位、自動(dòng)插樁可擴(kuò)展、自動(dòng)插樁高效性。
文檔編號(hào)G06F9/44GK102231109SQ20111019858
公開日2011年11月2日 申請(qǐng)日期2011年7月15日 優(yōu)先權(quán)日2011年7月15日
發(fā)明者張?zhí)? 陳華杰 申請(qǐng)人:南京大學(xué)