專利名稱:一種分析Linux內(nèi)核動(dòng)態(tài)執(zhí)行的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)操作系統(tǒng)工作中對(duì)系統(tǒng)安全性進(jìn)行分析的方法。確切講本發(fā)明是一種遵循POSIX標(biāo)準(zhǔn),對(duì)Linux操作系統(tǒng)的內(nèi)核在動(dòng)態(tài)執(zhí)行過程中所涉及的函數(shù)、語句的一種追蹤、分析方法。
背景技術(shù):
作為開源軟件的代表,Linux的應(yīng)用越來越廣泛,但是對(duì)Linux的安全分析、安全級(jí)別的驗(yàn)證還有很大的欠缺。與Windows操作系統(tǒng)因商業(yè)而帶來的費(fèi)用、代碼不公開而可能存在“后門”、病毒越來越多等一系列不利因素相比,Linux操作系統(tǒng)則具有免費(fèi),代碼開放等優(yōu)點(diǎn),從而逐漸為更多的企業(yè)、個(gè)人接受。伴隨著更加廣泛的應(yīng)用,Linux可能會(huì)在安全相關(guān)的領(lǐng)域有更多的應(yīng)用,從而分析Linux的安全級(jí)別是否達(dá)到應(yīng)用的需求也越來越有必要。但是由于應(yīng)用環(huán)境的不同、Linux本身非常龐大,對(duì)Linux的安全級(jí)別的分析還存在 很大的問題?,F(xiàn)今,還沒有分析表明,Linux系統(tǒng)的應(yīng)用達(dá)到IEC61508中所定義的SIL4的級(jí)別。而在操作系統(tǒng)工作前,對(duì)其安全性進(jìn)行分析是十分必要的。但現(xiàn)階段尚缺少這方面的技術(shù)?,F(xiàn)有的開源軟件strace可以追蹤可執(zhí)行文件用到的系統(tǒng)調(diào)用,但它只能追蹤確定的可執(zhí)行文件,而且對(duì)多個(gè)可執(zhí)行文件的追蹤結(jié)果不能很好的區(qū)分,另外在其結(jié)果中還有除了系統(tǒng)調(diào)用以外的很多附加信息;現(xiàn)有的開源軟件KFT可以追蹤到設(shè)定的入口函數(shù)和出口函數(shù)之間的內(nèi)核信息,并且KFT的kd功能將結(jié)果轉(zhuǎn)換成調(diào)用樹的形式,但是KFT每次只能按照這一次的設(shè)定來追蹤,生成的多個(gè)調(diào)用樹不能自己做比較;在編譯內(nèi)核后的內(nèi)核目錄下會(huì)生成tags文件,該文件中含有內(nèi)核函數(shù)名,定義、聲明該內(nèi)核函數(shù)的內(nèi)核文件,以及一些其他的信息;現(xiàn)有的開源程序gcov能追蹤到內(nèi)核文件的執(zhí)行時(shí)的覆蓋情況。
發(fā)明內(nèi)容
本發(fā)明提供了一種對(duì)Linux操作系統(tǒng)的內(nèi)核在動(dòng)態(tài)執(zhí)行過程中所涉及的函數(shù)、語句分析的方法。本發(fā)明的分析Linux內(nèi)核動(dòng)態(tài)執(zhí)行的方法是將開源程序strace通過程序進(jìn)行擴(kuò)展,經(jīng)擴(kuò)展后的strace在原來的基礎(chǔ)上自動(dòng)的對(duì)擬分析項(xiàng)目中的每一個(gè)可執(zhí)行文件進(jìn)行追蹤,同時(shí)過濾出相應(yīng)的被追蹤的可執(zhí)行文件在執(zhí)行過程中的系統(tǒng)調(diào)用,將過濾出的系統(tǒng)調(diào)用給予一個(gè)新命名單獨(dú)保存在與該可執(zhí)行文件相對(duì)應(yīng)的另外建立的新文件中;將開源程序的KFT功能通過程序進(jìn)行擴(kuò)展,擴(kuò)展后的KFT在原來的基礎(chǔ)上可自動(dòng)追蹤每個(gè)系統(tǒng)調(diào)用所調(diào)用的內(nèi)核函數(shù),并自動(dòng)對(duì)同一個(gè)文件中每個(gè)系統(tǒng)調(diào)用追蹤100次,創(chuàng)建數(shù)據(jù)庫,并在數(shù)據(jù)庫的表I中保存KFT追蹤結(jié)果,對(duì)結(jié)果的調(diào)用樹去重,建立追蹤結(jié)果和調(diào)用樹的對(duì)應(yīng)關(guān)系,在前述數(shù)據(jù)庫的表2中保存,在KFT對(duì)所有系統(tǒng)調(diào)用追蹤結(jié)束后,將當(dāng)前配置下的函數(shù)映射地址保存在前述數(shù)據(jù)庫的表3,將autoKFT執(zhí)行時(shí)的系統(tǒng)環(huán)境信息保存在數(shù)據(jù)庫的前述數(shù)據(jù)庫的表4中;在編譯過Linux源代碼的目錄下會(huì)生成tags文件,從數(shù)據(jù)庫表I中取出前述步驟中KFT追蹤到的內(nèi)核函數(shù),在tags中過濾這些內(nèi)核函數(shù)以及內(nèi)核函數(shù)定義、聲明的內(nèi)核文件,并在前述數(shù)據(jù)庫的表5中保存這些內(nèi)核函數(shù)名和對(duì)應(yīng)的內(nèi)核文件名;將開源程序gcov通過程序進(jìn)行擴(kuò)展,使擴(kuò)展后的gcov在原來的基礎(chǔ)上能得到內(nèi)核c文件中函數(shù)的起始行的數(shù)、結(jié)束行的數(shù)以及執(zhí)行覆蓋率,以及內(nèi)核C文件中語句塊的起始、結(jié)束的 行數(shù)和執(zhí)行的次數(shù),調(diào)用這些功能自動(dòng)處理每一個(gè)內(nèi)核文件的gcov結(jié)果,得到執(zhí)行過程中用到的每一個(gè)內(nèi)核文件中函數(shù)覆蓋率,保存到前述數(shù)據(jù)庫的表6中,得到調(diào)用過的每個(gè)內(nèi)核文件中語句塊的起始、終止行數(shù)、執(zhí)行次數(shù),將結(jié)果存在前述數(shù)據(jù)庫的表7中,對(duì)這些內(nèi)核文件預(yù)編譯成匯編文件,將結(jié)果保存在前述數(shù)據(jù)庫的表8中,將autogcov執(zhí)行時(shí)的系統(tǒng)環(huán)境信息保存到前述數(shù)據(jù)庫的表4中;最終在網(wǎng)頁上顯示從數(shù)據(jù)庫中的每個(gè)系統(tǒng)調(diào)用的名稱,對(duì)每個(gè)系統(tǒng)調(diào)用的每次追蹤讀取執(zhí)行時(shí)間,統(tǒng)計(jì)出最大、最小執(zhí)行時(shí)間,計(jì)算出平均執(zhí)行時(shí)間和時(shí)間方差,在網(wǎng)頁上顯示,每個(gè)系統(tǒng)調(diào)用鏈接顯示追蹤的結(jié)果,對(duì)每個(gè)系統(tǒng)調(diào)用顯示調(diào)用樹的個(gè)數(shù),并鏈接顯示調(diào)用樹;調(diào)用樹中的每個(gè)內(nèi)核函數(shù)鏈接到定義該內(nèi)核函數(shù)的文件,顯示內(nèi)容包括該文件中函數(shù)的覆蓋率,以及每個(gè)語句的執(zhí)行次數(shù)。上述內(nèi)容中擴(kuò)展的autostrace、autoKFT、autotags和autogcov可以使用腳本實(shí)現(xiàn),例如使用shell或peri或python實(shí)現(xiàn),也可以用如C語言實(shí)現(xiàn),用這些程序語言編寫相應(yīng)的源程序,即代碼,以實(shí)現(xiàn)相關(guān)的要求。本發(fā)明的一個(gè)實(shí)施例是采用shell腳本分別對(duì)strace、KFT、tags (去掉)和gcov進(jìn)行擴(kuò)展,其中對(duì)strace的擴(kuò)展是通過遍歷得到被分析項(xiàng)目中的每一個(gè)可執(zhí)行文件,使strace自動(dòng)追蹤被分析項(xiàng)目中的每一個(gè)可執(zhí)行文件,并過濾出相應(yīng)的被追蹤的可執(zhí)行文件在執(zhí)行過程中的系統(tǒng)調(diào)用,將過濾出的系統(tǒng)調(diào)用給予一個(gè)新命名單獨(dú)保存在與該可執(zhí)行文件相對(duì)應(yīng)的另外建立的新文件中;使用循環(huán)的方式,使KFT自動(dòng)追蹤每個(gè)系統(tǒng)調(diào)用所調(diào)用的內(nèi)核函數(shù),并自動(dòng)對(duì)同一個(gè)文件中每個(gè)系統(tǒng)調(diào)用追蹤100次,同時(shí)在新建數(shù)據(jù)庫的表I中保存追蹤結(jié)果,對(duì)結(jié)果的調(diào)用樹去重,建立保存追蹤結(jié)果和調(diào)用樹的對(duì)應(yīng)關(guān)系并在新建立的數(shù)據(jù)庫表2中保存,系統(tǒng)調(diào)用追蹤結(jié)束后,在數(shù)據(jù)庫表3中保存當(dāng)前配置下的函數(shù)映射地址,將autoKFT執(zhí)行時(shí)的系統(tǒng)環(huán)境信息保存在數(shù)據(jù)庫的前述數(shù)據(jù)庫的表4中;編寫autoctags從數(shù)據(jù)庫中自動(dòng)取出前述擴(kuò)展后的KFT追蹤到的內(nèi)核函數(shù),根據(jù)編譯后內(nèi)核目錄下的tags文件,得到在此環(huán)境下函數(shù)定義的內(nèi)核文件,并在數(shù)據(jù)庫表5中保存定義這些內(nèi)核文件的函數(shù)名和對(duì)應(yīng)的內(nèi)核文件;修改了一些gcov的代碼,能處理gcov得到的結(jié)果,使擴(kuò)展后的gcov在原來的基礎(chǔ)上得到內(nèi)核c文件中函數(shù)的起始行的數(shù)、結(jié)束行的數(shù)以及執(zhí)行覆蓋率,以及內(nèi)核C文件中語句塊的起始、結(jié)束的行數(shù)以及執(zhí)行的次數(shù),再調(diào)用這些功能自動(dòng)處理每一個(gè)內(nèi)核文件的gcov結(jié)果,得到執(zhí)行過程中用到的每一個(gè)內(nèi)核文件中函數(shù)覆蓋率保存在數(shù)據(jù)庫表6中,將語句塊的起始、終止行數(shù)、執(zhí)行次數(shù),將結(jié)果存在數(shù)據(jù)庫表7中,內(nèi)核文件編譯成匯編格式保存在數(shù)據(jù)庫表8中,執(zhí)行時(shí)的系統(tǒng)環(huán)境信息保存到前述數(shù)據(jù)庫的表4中。使用cgi-bin的腳本實(shí)現(xiàn)網(wǎng)頁。從數(shù)據(jù)庫中讀每個(gè)系統(tǒng)調(diào)用的名稱,對(duì)每個(gè)系統(tǒng)調(diào)用的每次追蹤讀取執(zhí)行時(shí)間,統(tǒng)計(jì)出最大、最小執(zhí)行時(shí)間,計(jì)算出平均執(zhí)行時(shí)間和時(shí)間方差。每次追蹤,最大、最小執(zhí)行時(shí)間都通過traCe_id鏈接到一個(gè)新的網(wǎng)頁界面,顯示這次追蹤的具體信息。對(duì)每個(gè)系統(tǒng)調(diào)用統(tǒng)計(jì)出調(diào)用樹的個(gè)數(shù),對(duì)每個(gè)調(diào)用樹鏈接到一個(gè)新的界面,傳遞tree_id,在數(shù)據(jù)庫中找到對(duì)應(yīng)的trace_id,取出該trace_id的原始結(jié)果,使用’ kd’功能轉(zhuǎn)化成執(zhí)行樹的形式在網(wǎng)頁上顯示。執(zhí)行樹上的每一個(gè)內(nèi)核函數(shù)鏈接到一個(gè)新的網(wǎng)頁界面,通過傳遞內(nèi)核函數(shù)的名稱,在數(shù)據(jù)庫中找到到該函數(shù)的定義文件,在通過該文件名在數(shù)據(jù)庫中取出關(guān)于該內(nèi)核文件的gcov結(jié)果,并在網(wǎng)頁上顯示。本發(fā)明利用對(duì)現(xiàn)有的開源程序改造,較為方便地為L(zhǎng)inux的安全級(jí)別分析提供數(shù)據(jù)支持,并為其后繼的工作,如開發(fā)或者改進(jìn)提供便利,而且通過本發(fā)明的技術(shù)方案克服現(xiàn)有的相關(guān)開源程序及tags中的不足,例如可以使strace和KFT可以自動(dòng)追蹤被檢測(cè)項(xiàng)目中的每個(gè)可執(zhí)行文件,可以自動(dòng)的對(duì)內(nèi)核函數(shù)的執(zhí)行覆蓋情況進(jìn)行統(tǒng)計(jì)。本發(fā)明還具有如下優(yōu)點(diǎn)I、能夠追蹤、記錄Linux內(nèi)核動(dòng)態(tài)執(zhí)行的行為,包括執(zhí)行樹、執(zhí)行時(shí)間、代碼覆蓋情況等,為L(zhǎng)inux的安全分析提供了數(shù)據(jù)支持。 2、擴(kuò)展了已有的Linux工具,能夠自動(dòng)的追蹤過濾,得到想要的結(jié)果,減少了人為操作所需要的時(shí)間和可能的誤操作。3、本發(fā)明是遵循POSIX標(biāo)準(zhǔn),而POSIX標(biāo)準(zhǔn)具有很強(qiáng)的通用性,所以能廣泛的應(yīng)用到遵循POSix標(biāo)準(zhǔn)的領(lǐng)域中。
附圖I為系統(tǒng)架構(gòu)示意圖。附圖2為L(zhǎng)inux的架構(gòu)示意圖。附圖3為開源工具的功能及關(guān)系圖。附圖4是關(guān)于系統(tǒng)調(diào)用的網(wǎng)頁界面。
具體實(shí)施例方式以下結(jié)合本發(fā)明的一個(gè)具體實(shí)施方式
解說本實(shí)施例的開發(fā)平臺(tái)如下硬件選用DELL 2950型號(hào)服務(wù)器,處理器Xeon 2. OGHz,內(nèi)存2Gb。軟件選用Debian Linux作為操作系統(tǒng),支持KFT功能的2. 6. 23的內(nèi)核和支持gcov功能的2. 6. 23的內(nèi)核。開發(fā)語言shelI。測(cè)試項(xiàng)目posixtestsuite項(xiàng)目中的應(yīng)用程序。具體實(shí)現(xiàn)I、對(duì) strace 的擴(kuò)展采用循環(huán)語句的方式,用shell腳本編寫psx. sh,將其加入strace中,經(jīng)此擴(kuò)展后的程序命名為autostrace。在實(shí)際的運(yùn)行中,由運(yùn)行posixtestsuite中的每一個(gè)可執(zhí)行文件,同時(shí)使用strace進(jìn)行追蹤;過濾strace的結(jié)果,得到此每個(gè)可執(zhí)行文件運(yùn)行過程中用到的系統(tǒng)調(diào)用。首先,使用自帶的psxtsstrce功能,將posixtestsuite中的文件編譯,得到可執(zhí)行文件,這些可執(zhí)行文件以.exe或.sh結(jié)尾;接著,psx. sh腳本查找posixtestsuite下的所有以· exe或· sh結(jié)尾的文件,使用“if [-X $TAGET] ;then”判斷這些文件是否可執(zhí)行,將這些所有可執(zhí)行的文件保存在tmp文件中;然后,對(duì)tmp中的每一個(gè)文件FILE逐個(gè)運(yùn)行追蹤,具體實(shí)現(xiàn)過程如下tmp中的每個(gè)可執(zhí)行文件保存的形式是目錄$DIR可執(zhí)行文件$file,使用psxtsstrace中的dir_and_file函數(shù)將這些目錄和文件名分開,并去掉后綴名。此時(shí),SFILE是包含路徑的可執(zhí)行文件名,$DIR為目錄,$file_name為去掉后綴名的文件名,再增加兩個(gè)變量,其代碼如下raw_data = $DIR$tile_name” · log”kcalls = $DIR$file_name “· syscall”再由autostrace利用原strace的命令進(jìn)行追蹤,并將結(jié)果保存在$raw_data文件中,其代碼為 strace-f-o$raw_data $FILE。對(duì)于strace的結(jié)果,過濾出其中的沒有的信息,只保留系統(tǒng)調(diào)用中,其代碼為sed/ /·*(·*)·*/ ! d' $raw_data > $tmplawk 1 {len = index($2, " ( " ) ;len = len_l ;print substr ($2,1,len)} 1 $tmpl > $tmp2sed/ /'$/d/ $tmp2 > $tmpl將這些系統(tǒng)調(diào)用以'sys_/開頭,但是有些系統(tǒng)調(diào)用以_開頭,比如_exit,得到的結(jié)果sys—exit,這是不識(shí)別的,需要去掉一個(gè)_,從而改成sys_exit中,其代碼為awd1 {print" sys_" $1} 1 $tmpl > $tmp3sed" s/—/_/g" $tmp3 I > $tmpl去掉重復(fù)的系統(tǒng)調(diào)用并去掉空行中,其代碼為sort-u$tmpl I > $tmp2sed' /'$/d/ $tmp2 I > $kcalls此時(shí),這些$kcalls文件保留了正確系統(tǒng)調(diào)用信息,將這些文件名(包括路徑)放到專門的文件syscall中中,其代碼為echo $kcalls > > $ SYSCALL2、對(duì)KFT的擴(kuò)展采用循環(huán)語句的方式,用shell腳本編寫autokft. sh,將其加入KFT中,經(jīng)此擴(kuò)展后的程序命名為autokft。在運(yùn)彳丁中autokft使用KFT原有的功能,對(duì)每Iv系統(tǒng)調(diào)用都能追蹤100次,在數(shù)據(jù)庫中保存追蹤的結(jié)果,使用'kd'功能將追蹤到的結(jié)果生成系統(tǒng)調(diào)用樹的形式,去重后將結(jié)果在數(shù)據(jù)庫中保存。Autokft是在內(nèi)核支持kft的模式下執(zhí)行的。在autostrace生成的syscall文件中,每行都是一個(gè)后綴是· syscall的文件,逐個(gè)讀出其中的每個(gè)文件進(jìn)處理。每個(gè).syscall文件($SYSCALL)都是“所在的目錄$DIR$file. syscall”的形式。查看此文件對(duì)應(yīng)的可執(zhí)行文件是否存在中,其代碼為
權(quán)利要求
1.一種分析Linux內(nèi)核動(dòng)態(tài)執(zhí)行的方法,其特征是 將開源程序strace通過程序進(jìn)行擴(kuò)展,經(jīng)擴(kuò)展后的strace在原來的基礎(chǔ)上自動(dòng)的對(duì)擬分析項(xiàng)目中的每一個(gè)可執(zhí)行文件進(jìn)行追蹤,同時(shí)過濾出相應(yīng)的被追蹤的可執(zhí)行文件在執(zhí)行過程中的系統(tǒng)調(diào)用,將過濾出的系統(tǒng)調(diào)用給予一個(gè)新命名單獨(dú)保存在與該可執(zhí)行文件相對(duì)應(yīng)的另外建立的新文件中;將開源程序的KFT功能通過程序進(jìn)行擴(kuò)展,擴(kuò)展后的KFT在原來的基礎(chǔ)上可自動(dòng)追蹤每個(gè)系統(tǒng)調(diào)用所調(diào)用的內(nèi)核函數(shù),并自動(dòng)對(duì)同一個(gè)文件中每個(gè)系統(tǒng)調(diào)用追蹤100次,創(chuàng)建數(shù)據(jù)庫,并在數(shù)據(jù)庫的表I中保存KFT追蹤結(jié)果,對(duì)結(jié)果的調(diào)用樹去重,建立追蹤結(jié)果和調(diào)用樹的對(duì)應(yīng)關(guān)系,在前述數(shù)據(jù)庫的表2中保存,在KFT對(duì)所有系統(tǒng)調(diào)用追蹤結(jié)束后,將當(dāng)前配置下的函數(shù)映射地址保存在前述數(shù)據(jù)庫的表3,將autoKFT執(zhí)行時(shí)的系統(tǒng)環(huán)境信息保存在數(shù)據(jù)庫的前述數(shù)據(jù)庫的表4中;在編譯過Linux源代碼的目錄下會(huì)生成tags文件,從數(shù)據(jù)庫表I中取出前述步驟中KFT追蹤到的內(nèi)核函數(shù),在tags中過濾這些內(nèi)核函數(shù)以及內(nèi)核函數(shù)定義、聲明的內(nèi)核文件,并在前述數(shù)據(jù)庫的表5中保存這些內(nèi)核函數(shù)名和對(duì)應(yīng)的內(nèi)核文件名;將開源程序gcov通過程序進(jìn)行擴(kuò)展,使擴(kuò)展后的gcov在原來的基礎(chǔ)上能得到內(nèi)核c文件中函數(shù)的起始行的數(shù)、結(jié)束行的數(shù)以及執(zhí)行覆蓋率,以及內(nèi)核C文件中語句塊的起始、結(jié)束的行數(shù)和執(zhí)行的次數(shù),調(diào)用這些功能自動(dòng)處理每一個(gè)內(nèi)核文件的gcov結(jié)果,得到執(zhí)行過程中用到的每一個(gè)內(nèi)核文件中函數(shù)覆蓋率,保存到前述數(shù)據(jù)庫的表6中,得到調(diào)用過的每個(gè)內(nèi)核文件中語句塊的起始、終止行數(shù)、執(zhí)行次數(shù),將結(jié)果存在前述數(shù)據(jù)庫的表7中,對(duì)這些內(nèi)核文件預(yù)編譯成匯編文件,將結(jié)果保存在前述數(shù)據(jù)庫的表8中,將autogcov執(zhí)行時(shí)的系統(tǒng)環(huán)境信息保存到前述數(shù)據(jù)庫的表4中;最終在網(wǎng)頁上顯示從數(shù)據(jù)庫中的每個(gè)系統(tǒng)調(diào)用的名稱,對(duì)每個(gè)系統(tǒng)調(diào)用的每次追蹤讀取執(zhí)行時(shí)間,統(tǒng)計(jì)出最大、最小執(zhí)行時(shí)間,計(jì)算出平均執(zhí)行時(shí)間和時(shí)間方差,在網(wǎng)頁上顯示,每個(gè)系統(tǒng)調(diào)用鏈接顯示追蹤的結(jié)果,對(duì)每個(gè)系統(tǒng)調(diào)用顯示調(diào)用樹的個(gè)數(shù),并鏈接顯示調(diào)用樹;調(diào)用樹中的每個(gè)內(nèi)核函數(shù)鏈接到定義該內(nèi)核函數(shù)的文件,顯示內(nèi)容包括該文件中函數(shù)的覆蓋率,以及每個(gè)語句的執(zhí)行次數(shù)。
2.根據(jù)權(quán)利要求I所述的一種分析Linux內(nèi)核動(dòng)態(tài)執(zhí)行的方法,其特征是采用shell腳本分別對(duì)strace、KFT、tags和gcov進(jìn)行擴(kuò)展,其中 對(duì)strace的擴(kuò)展是通過遍歷得到被分析項(xiàng)目中的每一個(gè)可執(zhí)行文件,使strace自動(dòng)追蹤被分析項(xiàng)目中的每一個(gè)可執(zhí)行文件,并過濾出相應(yīng)的被追蹤的可執(zhí)行文件在執(zhí)行過程中的系統(tǒng)調(diào)用,將過濾出的系統(tǒng)調(diào)用給予一個(gè)新命名單獨(dú)保存在與該可執(zhí)行文件相對(duì)應(yīng)的另外建立的新文件中; 使用循環(huán)的方式,使KFT自動(dòng)追蹤每個(gè)系統(tǒng)調(diào)用所調(diào)用的內(nèi)核函數(shù),并自動(dòng)對(duì)同一個(gè)文件中每個(gè)系統(tǒng)調(diào)用追蹤100次,同時(shí)在新建數(shù)據(jù)庫的表I中保存追蹤結(jié)果,對(duì)結(jié)果的調(diào)用樹去重,建立保存追蹤結(jié)果和調(diào)用樹的對(duì)應(yīng)關(guān)系并在新建立的數(shù)據(jù)庫表2中保存,系統(tǒng)調(diào)用追蹤結(jié)束后,在數(shù)據(jù)庫表3中保存當(dāng)前配置下的函數(shù)映射地址,將autoKFT執(zhí)行時(shí)的系統(tǒng)環(huán)境信息保存在數(shù)據(jù)庫的前述數(shù)據(jù)庫的表4中; 編寫autoctags從數(shù)據(jù)庫中自動(dòng)取出前述擴(kuò)展后的KFT追蹤到的內(nèi)核函數(shù),根據(jù)編譯后內(nèi)核目錄下的tags文件,得到在此環(huán)境下函數(shù)定義的內(nèi)核文件,并在數(shù)據(jù)庫表5中保存定義這些內(nèi)核文件的函數(shù)名和對(duì)應(yīng)的內(nèi)核文件; 修改了一些gcov的代碼,能處理gcov得到的結(jié)果,使擴(kuò)展后的gcov在原來的基礎(chǔ)上得到內(nèi)核C文件中函數(shù)的起始行的數(shù)、結(jié)束行的數(shù)以及執(zhí)行覆蓋率,以及內(nèi)核C文件中語句塊的起始、結(jié)束的行數(shù)以及執(zhí)行的次數(shù),再調(diào)用這些功能自動(dòng)處理每一個(gè)內(nèi)核文件的gcov結(jié)果,得到執(zhí)行過程中用到的每一個(gè)內(nèi)核文件中函數(shù)覆蓋率保存在數(shù)據(jù)庫表6中,將語句塊的起始、終止行數(shù)、執(zhí)行次數(shù),將結(jié)果存在數(shù)據(jù)庫表7中,內(nèi)核文件編譯成匯編格式保存在數(shù)據(jù)庫表8中,執(zhí)行時(shí)的系統(tǒng)環(huán)境信息保存到前述數(shù)據(jù)庫的表4中。
使用cgi-bin的腳本實(shí)現(xiàn)網(wǎng)頁。從數(shù)據(jù)庫中讀每個(gè)系統(tǒng)調(diào)用的名稱,對(duì)每個(gè)系統(tǒng)調(diào)用的每次追蹤讀取執(zhí)行時(shí)間,統(tǒng)計(jì)出最大、最小執(zhí)行時(shí)間,計(jì)算出平均執(zhí)行時(shí)間和時(shí)間 方差。每次追蹤,最大、最小執(zhí)行時(shí)間都通過traCe_id鏈接到一個(gè)新的網(wǎng)頁界面,顯示這次追蹤的具體信息。對(duì)每個(gè)系統(tǒng)調(diào)用統(tǒng)計(jì)出調(diào)用樹的個(gè)數(shù),對(duì)每個(gè)調(diào)用樹鏈接到一個(gè)新的界面,傳遞tree_id,在數(shù)據(jù)庫中找到對(duì)應(yīng)的trace_id,取出該trace_id的原始結(jié)果,使用’ kd’功能轉(zhuǎn)化成執(zhí)行樹的形式在網(wǎng)頁上顯示。執(zhí)行樹上的每一個(gè)內(nèi)核函數(shù)鏈接到一個(gè)新的網(wǎng)頁界面,通過傳遞內(nèi)核函數(shù)的名稱,在數(shù)據(jù)庫中找到到該函數(shù)的定義文件,在通過該文件名在數(shù)據(jù)庫中取出關(guān)于該內(nèi)核文件的gcov結(jié)果,并在網(wǎng)頁上顯示。
全文摘要
本發(fā)明公開一種對(duì)Linux操作系統(tǒng)的內(nèi)核在動(dòng)態(tài)執(zhí)行過程中所涉及的函數(shù)、語句進(jìn)行追蹤、分析的方法。本發(fā)明的的方法是通過對(duì)開源程序strace、KFT、tags和gcov進(jìn)行擴(kuò)展,使這些程序在原有的基礎(chǔ)上對(duì)每一個(gè)可執(zhí)行文件進(jìn)行追蹤,同時(shí)過濾出相應(yīng)的被追蹤的可執(zhí)行文件在執(zhí)行過程中的系統(tǒng)調(diào)用等信息,并將這些信息存入新建立的數(shù)據(jù)庫中,最終在網(wǎng)頁上顯示相關(guān)的信息,并鏈接顯示調(diào)用樹;調(diào)用樹中的每個(gè)內(nèi)核函數(shù)鏈接到定義該內(nèi)核函數(shù)的文件;顯示內(nèi)容包括該文件中函數(shù)的覆蓋率;以及每個(gè)語句的執(zhí)行次數(shù)。
文檔編號(hào)G06F11/36GK102810078SQ20111015116
公開日2012年12月5日 申請(qǐng)日期2011年6月2日 優(yōu)先權(quán)日2011年6月2日
發(fā)明者周慶國, 邊立軍, 金國軍, 盛勇, 孫彥猛, 楊紅剛 申請(qǐng)人:蘭州大學(xué)