(北京控制工程研究所,北京 100081)
在軟件調(diào)試過(guò)程中,故障定位是最耗時(shí)和費(fèi)力的活動(dòng)之一[1]。隨著當(dāng)前軟件復(fù)雜度越來(lái)越高,迫切需要提高故障定位的效率,減少開(kāi)發(fā)人員的工作量,降低開(kāi)發(fā)過(guò)程的成本開(kāi)銷(xiāo)。軟件故障定位是通過(guò)對(duì)源程序的語(yǔ)義和結(jié)構(gòu)進(jìn)行分析,結(jié)合程序執(zhí)行情況和結(jié)果,幫助測(cè)試人員找到程序中的故障位置的過(guò)程。在故障定位的研究方法中依據(jù)是否需要運(yùn)行程序的準(zhǔn)則可以分為靜態(tài)方法和動(dòng)態(tài)方法。前者指的是不運(yùn)行待測(cè)程序,利用程序語(yǔ)句之間的依賴(lài)關(guān)系以及類(lèi)型約束來(lái)研究程序中的故障位置;后者則是結(jié)合測(cè)試用例運(yùn)行待定位的程序,對(duì)程序執(zhí)行過(guò)程中的信息進(jìn)行分析,利用程序動(dòng)態(tài)執(zhí)行信息進(jìn)行定位。
本文調(diào)研了近幾年提出的一些代表性的故障定位技術(shù),根據(jù)在進(jìn)行定位時(shí)所利用的信息及定位方式進(jìn)行分類(lèi)并闡述其原理模型,并對(duì)不同方法的優(yōu)缺點(diǎn)進(jìn)行了對(duì)比。然后對(duì)測(cè)試用例程序集以及故障定位效率評(píng)價(jià)方法進(jìn)行了介紹,最后對(duì)未來(lái)研究方向提出了展望。
軟件故障在IEEE標(biāo)準(zhǔn)中被定義為‘計(jì)算機(jī)程序中不正確的步驟、過(guò)程或者數(shù)據(jù)定義 ’,我們研究的故障定位就是要找到引起軟件出錯(cuò)的故障所在位置[2]。我們通常將故障描述為由于客觀因素或系統(tǒng)里包含一些系統(tǒng)問(wèn)題使軟件在運(yùn)行時(shí)出現(xiàn)得到的實(shí)際結(jié)果和預(yù)期輸出存在差異的情形。
在故障定位領(lǐng)域中,我們根據(jù)程序中包含的故障數(shù)目,將故障定位研究分成單故障定位和多故障定位。一般來(lái)說(shuō),多故障程序定位消耗的時(shí)間復(fù)雜度要高于單故障程序的時(shí)間復(fù)雜度,因此現(xiàn)在主要的研究重點(diǎn)大多是解決單故障程序的定位技術(shù)。本文首先介紹一些基于單故障程序定位的一些方法技術(shù),然后列舉一些多故障程序定位的算法技術(shù),最后從幾個(gè)方面對(duì)比單故障程序定位和多故障程序定位。
1.1.1 基于覆蓋的故障定位技術(shù)
該類(lèi)方法首先將待測(cè)程序進(jìn)行插樁處理,然后執(zhí)行源程序,得到程序語(yǔ)句在所有測(cè)試用例下的覆蓋執(zhí)行信息,最后利用各自的方法對(duì)執(zhí)行信息進(jìn)行分析計(jì)算并進(jìn)行定位。Wong對(duì)語(yǔ)句和測(cè)試用例之間的關(guān)系提出了這樣的假設(shè)[3]:一條語(yǔ)句包含故障的概率和它被成功用例執(zhí)行頻數(shù)成負(fù)相關(guān),和它被失敗用例執(zhí)行次數(shù)成正相關(guān)。也就是說(shuō),某一語(yǔ)句在失敗測(cè)試用例中出現(xiàn)的頻率越高,而在成功執(zhí)行的用例中出現(xiàn)的頻數(shù)越少,則該語(yǔ)句含有故障的概率就越大?;诟采w的故障定位技術(shù)的方法不足之處是對(duì)測(cè)試用例的要求和限制十分嚴(yán)格,如果測(cè)試集中的測(cè)試用例數(shù)目過(guò)少,則會(huì)導(dǎo)致語(yǔ)句覆蓋不全面的情況;如果測(cè)試用例數(shù)目過(guò)多,以至于出現(xiàn)大量冗余用例,那么會(huì)使程序語(yǔ)句重復(fù)執(zhí)行,會(huì)導(dǎo)致定位的精度降低[4]。另外大部分的錯(cuò)誤語(yǔ)句都會(huì)既在失敗執(zhí)行用例又在成功執(zhí)行用例中出現(xiàn),當(dāng)對(duì)程序語(yǔ)句進(jìn)行并集或者交集操作時(shí)[5],錯(cuò)誤語(yǔ)句往往會(huì)被去掉,導(dǎo)致得到的集合為空集或者不包含故障語(yǔ)句[6]。
1.1.2 基于程序切片的故障定位技術(shù)
程序切片技術(shù)最初是Weiser提出的一種程序分解技術(shù)[7],它是根據(jù)一些特定需求而截取的程序語(yǔ)句片段集合。我們把程序輸出語(yǔ)句看成興趣點(diǎn),將輸出結(jié)果變量看成興趣變量。根據(jù)構(gòu)成方式,我們可以將程序切片劃分為靜態(tài)切片和動(dòng)態(tài)切片兩種。前者是由包含和興趣點(diǎn)相關(guān)的興趣變量的所有語(yǔ)句組成,靜態(tài)切片大多和整個(gè)程序的規(guī)模一樣,因此利用靜態(tài)切片處理故障定位的效率不高。而動(dòng)態(tài)切片則是在某一具體輸入的前提下包含對(duì)興趣點(diǎn)有影響的興趣變量的語(yǔ)句組成,和前者相比,切片規(guī)模更小,精度更高,定位效果有所提高。比較典型的基于程序切片的故障定位方法有下面幾種:(1)李必信[8]等人提出了一些基于程序切片的故障定位方法,并且得到了不錯(cuò)的定位效果。(2)Zhang[9]等人采用基于動(dòng)態(tài)切片的方法實(shí)現(xiàn)故障定位技術(shù),主要思路是構(gòu)造數(shù)據(jù)切片、全切片以及相關(guān)切片3種程序切片,然后在這3種切片基礎(chǔ)上縮小范圍,找到程序的故障位置?;谇衅亩ㄎ患夹g(shù)優(yōu)點(diǎn)在于可以簡(jiǎn)化程序,將與故障無(wú)關(guān)的語(yǔ)句排除掉,降低了程序的復(fù)雜度,提高定位的效率。但是在大規(guī)模的程序中,我們得到的程序切片規(guī)模往往也很龐大,導(dǎo)致效率不能達(dá)到我們的預(yù)期;而且提取切片的過(guò)程有時(shí)相對(duì)比較繁瑣,增加算法的復(fù)雜性。
1.1.3 基于程序譜的故障定位技術(shù)
程序譜描述的是程序中的語(yǔ)句在執(zhí)行過(guò)程中包含的執(zhí)行信息與特征,通常用二維數(shù)組來(lái)表示,程序譜最初是Reps等人[10]在研究千年蟲(chóng)問(wèn)題時(shí)提出的?;诔绦蜃V的故障定位技術(shù)由于其形式簡(jiǎn)單、易于操作實(shí)現(xiàn)、存儲(chǔ)方便而且可以很清晰直白地將程序中所有語(yǔ)句在測(cè)試用例下的覆蓋執(zhí)行信息以及測(cè)試用例的執(zhí)行結(jié)果表現(xiàn)出來(lái),為統(tǒng)計(jì)語(yǔ)句的可疑度值提供了便利的條件。由于在單故障定位方面有著較高的效率,很多學(xué)者提出了大量基于程序譜的故障定位方法,比較有代表性的有以下幾種方法:(1)虞凱[11]使用多程序譜模型進(jìn)行軟件故障定位,在單程序譜的基礎(chǔ)上增加了依賴(lài)對(duì)的頻譜信息,構(gòu)造兩個(gè)程序頻譜分別對(duì)應(yīng)數(shù)據(jù)依賴(lài)和控制依賴(lài)對(duì)應(yīng)的頻譜,然后計(jì)算語(yǔ)句總的可疑度,以實(shí)現(xiàn)定位操作;(2)He在其論文中使用構(gòu)造層次譜的方法來(lái)進(jìn)行故障定位[12],將整個(gè)程序分為函數(shù)層和語(yǔ)句層,在不同層次間構(gòu)造對(duì)應(yīng)的頻譜,然后進(jìn)行定位;(3)Wong在程序譜的基礎(chǔ)上進(jìn)一步提出構(gòu)造語(yǔ)句的交叉表[13],并利用CrossTab方法來(lái)統(tǒng)計(jì)每條語(yǔ)句的可疑度,利用統(tǒng)計(jì)學(xué)的思想來(lái)完成故障定位操作。
但是基于程序譜的定位方法也存在一定的問(wèn)題。由于程序譜僅考慮了每條語(yǔ)句的執(zhí)行情況,并沒(méi)有將上下文語(yǔ)句之間包含的依賴(lài)關(guān)系進(jìn)行分析,所以有時(shí)會(huì)出現(xiàn)定位到的結(jié)果并不是真正的錯(cuò)誤語(yǔ)句,而是由于錯(cuò)誤傳遞而產(chǎn)生非預(yù)期運(yùn)行結(jié)果的相關(guān)語(yǔ)句。另外程序譜的構(gòu)造需要大量測(cè)試用例,對(duì)測(cè)試用例的要求也相對(duì)較高。
1.1.4 基于模型的故障定位技術(shù)
基于模型的定位技術(shù)最初是Reiter提出的[14]。他使用了包含(SD,COMPS,OBS)的三元組結(jié)構(gòu)來(lái)形式化的定義該方法。其中SD代表對(duì)源程序的描述,通常采用一階邏輯語(yǔ)句描述程序內(nèi)各部分之間的關(guān)系及行為;COMPS代表了程序組件的集合;OBS則定位為根據(jù)輸入得到的觀測(cè)值,是有限一階語(yǔ)句的子集合[15]。Cleve和Zeller提出的Delta Debugging方法[16]首先通過(guò)調(diào)試環(huán)境獲取不同測(cè)試用例執(zhí)行過(guò)程中的數(shù)據(jù);在此基礎(chǔ)上,構(gòu)建各個(gè)測(cè)試用例執(zhí)行過(guò)程中的程序狀態(tài)圖;接下來(lái)采用圖挖掘算法識(shí)別成功和失敗測(cè)試用例的程序狀態(tài)圖之間的差異;最后通過(guò)這些差異進(jìn)行故障定位。DeMillo[17]提出了一種用于調(diào)試的軟件故障分析模型。該方法在模型中定義了錯(cuò)誤模式和錯(cuò)誤類(lèi)型,主要的思路是在程序運(yùn)行過(guò)程中發(fā)現(xiàn)異常行為,就會(huì)根據(jù)對(duì)應(yīng)的模式進(jìn)行分類(lèi)。根據(jù)已建立的故障模型的參考,就可以定位到程序中的故障位置。
該類(lèi)方法通過(guò)代碼結(jié)構(gòu)和上下文依賴(lài)關(guān)系構(gòu)造故障模型,對(duì)程序的動(dòng)態(tài)信息利用的比較充分,定位效果較高[18]。但是該方法也有一定的缺陷,首先建立故障模型需要大量的數(shù)學(xué)知識(shí),同時(shí)模型建立以及推導(dǎo)過(guò)程也需要很多的時(shí)間。
在實(shí)際應(yīng)用中,程序中往往不止包含一處故障,我們?cè)谑褂冕槍?duì)單故障程序定位技術(shù)處理多故障問(wèn)題時(shí),會(huì)出現(xiàn)定位效果下降的問(wèn)題。因此我們需要對(duì)多故障程序定位進(jìn)行深入的研究是很有意義的。多故障定位技術(shù)的大致思想是將程序中的錯(cuò)誤都“孤立”出來(lái),使不同的錯(cuò)誤都能夠在測(cè)試用例中有所體現(xiàn),然后基于不同的方法找到暴露錯(cuò)誤的語(yǔ)句,使這些語(yǔ)句能夠很快的被找到,從而實(shí)現(xiàn)多故障定位。很多學(xué)者提出不同的改進(jìn)方法來(lái)實(shí)現(xiàn)多故障定位的需求。
李博[19]在虞凱提出的多程序譜的基礎(chǔ)上進(jìn)行改進(jìn),使之可以處理多故障程序定位問(wèn)題,改進(jìn)的方向是在得到數(shù)據(jù)依賴(lài)和控制依賴(lài)譜后,進(jìn)行計(jì)算時(shí)對(duì)得到的可疑度不是簡(jiǎn)單的線性操作,而是先進(jìn)行預(yù)處理后在求出總的可疑度值進(jìn)行排序定位。而于全江在多故障環(huán)境下對(duì)程序譜故障定位技術(shù)的各個(gè)風(fēng)險(xiǎn)評(píng)估函數(shù)的定位效果進(jìn)行研究[20],并提出對(duì)部分參數(shù)進(jìn)行修改權(quán)重的方法來(lái)探究最優(yōu)參數(shù)權(quán)重,從而實(shí)現(xiàn)多故障定位中良好的定位效果。相比于一般的基于程序譜的方法,文萬(wàn)志在其論文中提出一種基于條件切片譜的方法來(lái)實(shí)現(xiàn)多故障程序定位技術(shù)[21],其定位精度和效果有所提高。除了利用程序譜的方法之外,一些研究人員提出可以結(jié)合數(shù)據(jù)挖掘的思想來(lái)解決多故障定位問(wèn)題,并且取得了一定的進(jìn)展。張澤林在其論文[22]中提出利用聚類(lèi)分析的思想來(lái)處理測(cè)試用例,將不同故障進(jìn)行隔離,然后分別進(jìn)行定位。Cao采用基于Chameleon技術(shù)來(lái)實(shí)現(xiàn)軟件多故障定位的要求[23]。該技術(shù)先是將測(cè)試用例進(jìn)行約簡(jiǎn),然后在對(duì)測(cè)試用例進(jìn)行聚類(lèi)操作,最后將分離開(kāi)的所有故障單獨(dú)的進(jìn)行定位。
多故障程序定位的難點(diǎn)在于程序中多個(gè)故障之間存在互相干擾疊加的問(wèn)題,現(xiàn)有的傳統(tǒng)的處理單故障定位技術(shù)不能很好的解決這個(gè)現(xiàn)象,因此導(dǎo)致定位效果降低。很多學(xué)者提出的上述方法的本質(zhì)目的都是希望和單故障定位一樣,可以單獨(dú)的處理每一個(gè)錯(cuò)誤,從而提高多故障定位技術(shù)的效率。
表1 單故障程序與多故障程序區(qū)別
單故障程序定位和多故障程序定位技術(shù)的差異在下表1中已經(jīng)歸納總結(jié)出?,F(xiàn)階段主要的研究重點(diǎn)集中在單故障程序定位,而后者由于其復(fù)雜度要比單故障定位高很多,因此提出的相應(yīng)的定位技術(shù)方法比較少。
總的來(lái)說(shuō),兩者的差異主要是體現(xiàn)在對(duì)測(cè)試用例尤其是失敗執(zhí)行用例的統(tǒng)計(jì)處理方面,故障數(shù)目的差異因而導(dǎo)致對(duì)應(yīng)的測(cè)試用例也隨之不同,而就是這種不同造成在多故障定位中出現(xiàn)互相干擾影響的現(xiàn)象,進(jìn)而導(dǎo)致定位效率下降,定位開(kāi)銷(xiāo)增大。
本章主要從以下兩個(gè)方面進(jìn)行論述,首先介紹的是在軟件故障定位技術(shù)中使用的評(píng)測(cè)數(shù)據(jù)集,其中包含一些故障程序以及相應(yīng)的測(cè)試用例,其中我們主要以Siemens程序集為例進(jìn)行說(shuō)明。其次我們論述的是在利用Siemens程序集的基礎(chǔ)上,對(duì)使用的故障定位方法給出的測(cè)試評(píng)價(jià)方法的討論,列出了一些常用的測(cè)試評(píng)價(jià)方法。
在當(dāng)前故障定位技術(shù)研究領(lǐng)域中,應(yīng)用廣泛的程序集是Siemens程序集,該程序集由7個(gè)程序組成,程序結(jié)構(gòu)多樣性,通用性強(qiáng),每個(gè)程序的代碼行數(shù)不超過(guò)600行,主要是基于C語(yǔ)言程序定位,后續(xù)加入針對(duì)Java、c++等常用語(yǔ)言的程序定位。該程序集是由西門(mén)子公司開(kāi)發(fā)的,全部程序集可以從相應(yīng)的網(wǎng)站中下載[24]。大部分程序中只包含一個(gè)故障,每個(gè)版本都對(duì)應(yīng)大量測(cè)試用例。表2是該程序集的概要信息,其中包含程序名稱(chēng)、故障版本數(shù)、代碼行數(shù)、可執(zhí)行代碼行數(shù)以及測(cè)試用例數(shù)[25]。
表1中Siemens套件包含7個(gè)程序,每個(gè)程序都有正確源碼和若干帶有故障的源碼,一共有132個(gè)故障版本。print_tokens和print_tokens2是一些詞法分析的程序,replace是一些模式轉(zhuǎn)換的程序,schedule和schedule2是和調(diào)度功能相關(guān)的程序,tcas實(shí)現(xiàn)高度區(qū)分功能,tot-info實(shí)現(xiàn)信息估量功能。套件中程序的目錄結(jié)構(gòu)都是一致的,具體目錄結(jié)構(gòu)如下:
表2 Siemens測(cè)試套件概要
(1)source目錄:存放的是程序正確版本的源代碼。
(2)inputs目錄:存放的是輸入數(shù)據(jù),但不是所有程序的該文件夾都有內(nèi)容。
(3)versions目錄:存放的是程序各個(gè)故障版本的源代碼。
(4)scripts目錄:存放的是測(cè)試腳本,可以運(yùn)行測(cè)試用例,得到的結(jié)果存放在對(duì)應(yīng)輸出目錄中。
(5)outputs目錄:存放的是正確版本的輸出結(jié)果。
(6)newoutputs目錄:存放的是故障版本的輸出結(jié)果。
(7)testplans.alt目錄:存放的是所有的測(cè)試套件,其中包含universe文件,該文件包含一個(gè)測(cè)試用例集合,存放所有測(cè)試用例。
軟件故障定位技術(shù)的目的是盡可能通過(guò)自動(dòng)化過(guò)程實(shí)現(xiàn)故障的發(fā)現(xiàn),減少測(cè)試人員的工作量。軟件定位結(jié)果的好壞可以通過(guò)發(fā)現(xiàn)故障過(guò)程需要檢查的語(yǔ)句數(shù)量進(jìn)行評(píng)價(jià)。需要檢測(cè)的語(yǔ)句數(shù)越少,說(shuō)明效果越好。
Jones和Harrold[26]提出了一種度量軟件故障定位有效性和效率的方法,使用發(fā)現(xiàn)故障所需要檢查的語(yǔ)句數(shù)進(jìn)行評(píng)價(jià)。評(píng)價(jià)標(biāo)準(zhǔn)如公式(1)所示:
(1)
score中各個(gè)變量的含義為:|tested_entries|表示找到軟件故障需要檢查的語(yǔ)句數(shù)目;|executed_entries|表示執(zhí)行測(cè)試用例中所有可執(zhí)行語(yǔ)句數(shù)目。在定位過(guò)程中,不需要檢查的語(yǔ)句數(shù)目占所有語(yǔ)句的比例越大,說(shuō)明定位效果越好。
在一種基于分塊切片的故障定位技術(shù)中,采用約減率RR(reduction ratio)來(lái)度量分塊切片的約減度[27],其評(píng)價(jià)方法如公式(2)所示:
(2)
上述公式中,BlockBWSlice代表的是根據(jù)興趣塊B和興趣變量集V逆向遍歷系統(tǒng)依賴(lài)圖而得到的靜態(tài)切片。在定位過(guò)程中,BlockBWSlice的規(guī)模越小,說(shuō)明定位效果越好。
Zhang等人在衡量非參數(shù)檢驗(yàn)的故障定位技術(shù)的有效性時(shí),提出了基于謂詞排名的評(píng)分標(biāo)準(zhǔn),也稱(chēng)P-score[30]。基于謂詞可疑度降序排序給出故障報(bào)告,首先標(biāo)記程序中和故障最接近的謂詞為故障最相關(guān)謂詞,然后定義錯(cuò)誤定位技術(shù)的得分為檢查到故障最相關(guān)謂詞時(shí),已檢查的謂詞占列表上所有謂詞的百分比[31]。
以上這些衡量故障定位效果的方法大多在單故障程序定位中有著很好的效果,但是在多故障領(lǐng)域,這些衡量標(biāo)準(zhǔn)評(píng)價(jià)效果一般。因此,Jones在論文[32]提出一種基于其提出的標(biāo)準(zhǔn)基礎(chǔ)上的延伸公式,即:
(3)
(4)
針對(duì)多故障定位的分析,Jones提出了4的評(píng)價(jià)方法,利用發(fā)現(xiàn)并修復(fù)軟件中所有故障需要檢查的語(yǔ)句數(shù)目占程序所有語(yǔ)句比例的總和來(lái)表示算法的效率,但是對(duì)于發(fā)現(xiàn)并修復(fù)軟件的時(shí)間成本沒(méi)有考慮。Jones在Score的基礎(chǔ)上擴(kuò)展提出另外一種評(píng)價(jià)標(biāo)準(zhǔn)公式:
max{Expensef|fisfaultsubtaskatiterationi}
(5)
該標(biāo)準(zhǔn)利用發(fā)現(xiàn)并修復(fù)所有故障所需要的最小時(shí)間成本來(lái)表示定位的效率。
一般來(lái)說(shuō),大多數(shù)故障定位技術(shù)都是采用Jones提出的score法來(lái)評(píng)測(cè)方法本身的優(yōu)劣,通過(guò)比較再找到所有故障前需要查找的語(yǔ)句數(shù)目來(lái)評(píng)價(jià)所使用的定位方法的有效性。而且評(píng)價(jià)的結(jié)果相對(duì)準(zhǔn)確可靠,對(duì)提高定位方法的有效性提供了很大的幫助。
針對(duì)軟件故障定位問(wèn)題的研究已經(jīng)取得了一定的進(jìn)展,研究者提出了不同的方法來(lái)實(shí)現(xiàn)故障定位。仍然存在一些問(wèn)題需要進(jìn)一步研究,未來(lái)的工作方向可以從下面幾個(gè)角度入手:
1)大多數(shù)研究人員關(guān)注的重點(diǎn)是單故障程序,待定位的程序中只包含一處錯(cuò)誤,而實(shí)際應(yīng)用中,程序往往不只有一處故障,而且故障類(lèi)型也有很大的差異,因此可以將關(guān)注點(diǎn)更多地聚焦在對(duì)多故障程序定位的研究上,對(duì)現(xiàn)有技術(shù)進(jìn)行改進(jìn)研究,來(lái)滿足多故障程序定位的需求。
2)在故障定位的方法中,測(cè)試用例的選取也是十分重要,如果測(cè)試用例數(shù)目太少可能會(huì)導(dǎo)致不能覆蓋到所有執(zhí)行語(yǔ)句;而如果程序中有大量冗余的測(cè)試用例,則會(huì)導(dǎo)致可執(zhí)行語(yǔ)句被大量重復(fù)執(zhí)行,會(huì)對(duì)語(yǔ)句信息統(tǒng)計(jì)時(shí)造成干擾。因此在后續(xù)研究中,可以選擇對(duì)測(cè)試用例進(jìn)行優(yōu)化,以提高故障定位的效率。
3)目前在故障定位領(lǐng)域中,都是以Siemens程序集作為實(shí)驗(yàn)的樣本,并沒(méi)有在其他平臺(tái)進(jìn)行實(shí)驗(yàn),該程序集代碼量相對(duì)較小,不能涵蓋所有可能的故障。因此在后續(xù)研究中,可以選擇更大的程序集進(jìn)行實(shí)驗(yàn)研究,對(duì)故障種類(lèi)也可以進(jìn)行擴(kuò)展補(bǔ)充。
本文首先分別從單故障和多故障兩個(gè)角度綜述了現(xiàn)有的故障定位技術(shù),然后對(duì)這兩個(gè)方向進(jìn)行了對(duì)比,提出兩者的差異。最后給出了測(cè)試用例程序集和算法評(píng)價(jià)方法,并對(duì)故障定位研究方向進(jìn)行了展望。