一種并發(fā)程序的缺陷模式發(fā)現(xiàn)方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明屬于軟件故障診斷領(lǐng)域,是一種自主發(fā)現(xiàn)并發(fā)程序缺陷模式的方法,尤其 是一種針對(duì)系統(tǒng)執(zhí)行軌跡使用序列模式挖掘的缺陷模式發(fā)現(xiàn)方法。
【背景技術(shù)】
[0002] 發(fā)現(xiàn)并發(fā)程序缺陷是一件困難的事情,一般都只能根據(jù)日志信息判斷故障原因, 而普通的監(jiān)控系統(tǒng)只對(duì)軟件行為進(jìn)行檢測(cè)而無法進(jìn)一步判斷軟件的執(zhí)行是否處于正確的 軌跡(正確的行為)之上。
[0003] 基于面向方面編程的監(jiān)控程序可將監(jiān)測(cè)邏輯和業(yè)務(wù)邏輯相互分離,能方便獲取到 一個(gè)并行程序系統(tǒng)的執(zhí)行軌跡。針對(duì)這些獲取到的并發(fā)程序系統(tǒng)的執(zhí)行軌跡,可利用序列 模式挖掘技術(shù)對(duì)這些軌跡進(jìn)行挖掘,這樣能有效解決并發(fā)程序故障診斷困難的問題,并能 從并發(fā)程序執(zhí)行軌跡這一海量數(shù)據(jù)中提取有用信息,以獲取到隱含在歷史并發(fā)程序軌跡 序列集上的故障特征關(guān)鍵點(diǎn)。這種技術(shù)將可有效地保障并發(fā)軟件系統(tǒng)的安全性。
[0004] 現(xiàn)有技術(shù)的典型實(shí)現(xiàn)方案如下: 第一,基于專家系統(tǒng)的故障/缺陷診斷程序。其主要原理是將領(lǐng)域?qū)<业闹R(shí)與經(jīng)驗(yàn) 被表示成產(chǎn)生式規(guī)則,并在知識(shí)庫和數(shù)據(jù)庫的支持下,綜合運(yùn)用各種規(guī)則進(jìn)行一系列的推 理。該診斷程序在運(yùn)行中要求用戶輸入必要的信息后,就可快速地直接找到最終故障/缺 陷或是最有可能的故障/缺陷,并由用戶對(duì)結(jié)果進(jìn)行進(jìn)一步判斷。但這種方法需要建立規(guī) 則庫,并利用規(guī)則庫對(duì)程序軌跡狀態(tài)進(jìn)行判斷和預(yù)測(cè),這種方法的主要缺點(diǎn)是自動(dòng)化程度 不高,方法的復(fù)用性較差。
[0005] 第二,方便和有效的獲取程序執(zhí)行軌跡是進(jìn)行軟件故障/缺陷診斷的前提。在程 序執(zhí)行軌跡獲取方面,美國加利福尼亞大學(xué)伯克利分校和貝兒實(shí)驗(yàn)室共同提出了動(dòng)態(tài)偏序 化簡(jiǎn)算法(DynamicPartialOrderReduction,DP0R),探索線程的交互執(zhí)行情況,并提出 了Persistent集合的概念,以保證線程執(zhí)行情況搜索的完備性。該算法從程序的初始狀態(tài) 執(zhí)行的迀移序列開始采用深度優(yōu)先搜索程序狀態(tài)棧,動(dòng)態(tài)探索線程間交互信息,然后利用 這些信息去鑒定回溯點(diǎn),從而探索狀態(tài)空間的可選路徑,獲取程序執(zhí)行軌跡。
[0006] 在程序狀態(tài)的搜索過程中計(jì)算各個(gè)狀態(tài)的Persistent集合,使得程序里所有迀 移序列都不是空序列,在某一狀態(tài)下可行的迀移集合里所有迀移和其他迀移序列中的迀移 都是獨(dú)立的,保證搜索的完備性。
[0007] 但該算法的主要缺點(diǎn)是沒有將完整地程序軌跡序列獲取并存儲(chǔ);沒有為程序軌跡 序列的進(jìn)一步分析提供基礎(chǔ);沒有針對(duì)含有循環(huán)的并發(fā)程序進(jìn)行優(yōu)化,會(huì)出現(xiàn)對(duì)已經(jīng)搜索 過的迀移反復(fù)搜索的情況,這會(huì)造成了DP0R算法效率的低下,這反映在采用該算法的總探 索時(shí)間和單次平均探索時(shí)間都較長(zhǎng)。
[0008] 第三,在對(duì)缺陷模式的發(fā)現(xiàn)方法上,美國康奈爾大學(xué)提出序列模式挖掘算法 (SequentialPAtternMining,SPAM)進(jìn)行序列模式挖掘,對(duì)序列集進(jìn)行挖掘得到頻繁模 式。SPAM算法首先將序列信息存儲(chǔ)于數(shù)據(jù)庫位圖中,然后可在項(xiàng)集層面實(shí)行項(xiàng)集拓展,和可 在序列層面實(shí)行序列拓展,并使用格理論對(duì)數(shù)據(jù)庫進(jìn)行深度優(yōu)先遍歷從而找出序列模式。SPAM算法的主要缺點(diǎn)是需要用戶自己來設(shè)定最小支持度閾值,不當(dāng)?shù)闹С侄乳撝悼赡軒?挖掘出的模式質(zhì)量差的問題;只能對(duì)單一類型的序列集進(jìn)行處理,誤報(bào)情況嚴(yán)重。
【發(fā)明內(nèi)容】
[0009] 本發(fā)明的目的在于針對(duì)以上不足,在傳統(tǒng)基于動(dòng)態(tài)偏序化簡(jiǎn)算法獲取并發(fā)程序執(zhí) 行軌跡和SPAM算法進(jìn)行序列模式挖掘的基礎(chǔ)上,針對(duì)算法的核心步驟,即獲取并發(fā)程序軌 跡和對(duì)軌跡進(jìn)行挖掘以發(fā)現(xiàn)缺陷模式,提出涉及這兩步的改進(jìn)的做法,能自主發(fā)現(xiàn)程序缺 陷模式。
[0010] 本發(fā)明的技術(shù)方案是基于已插裝的并發(fā)程序,在其運(yùn)行過程中動(dòng)態(tài)調(diào)度線程的執(zhí) 行,實(shí)時(shí)收集程序執(zhí)行信息,根據(jù)需要存儲(chǔ)程序軌跡序列,對(duì)執(zhí)行序列進(jìn)行挖掘得到缺陷模 式。
[0011] 本發(fā)明提供一種并發(fā)程序的缺陷模式發(fā)現(xiàn)方法,包括以下步驟: (1) 監(jiān)控目標(biāo)程序,使用面向方面編程探針代碼的注入方法對(duì)監(jiān)控點(diǎn)進(jìn)行監(jiān)控以便獲 取狀態(tài)信息; (2) 使用動(dòng)態(tài)標(biāo)記迀移算法DLT對(duì)設(shè)置監(jiān)控點(diǎn)的目標(biāo)程序的執(zhí)行進(jìn)行調(diào)度,獲取目標(biāo) 程序的監(jiān)控點(diǎn)的狀態(tài)信息; (3) 把監(jiān)控到的狀態(tài)信息,以軌跡序列的形式存儲(chǔ)在數(shù)據(jù)庫中,獲取數(shù)據(jù)庫中每條軌跡 序列的執(zhí)行結(jié)果,對(duì)軌跡序列進(jìn)行分類,得到成功執(zhí)行序列集和失效執(zhí)行序列集; (4) 在成功執(zhí)行序列集和失效執(zhí)行序列集中,利用序列模式挖掘算法ISPAM進(jìn)行挖掘, 得到目標(biāo)程序缺陷模式。
[0012] 在上述技術(shù)方案中,步驟(1)中所述的獲取狀態(tài)信息的步驟如下: 步驟一,基于面向方面編程思想和待監(jiān)控的源程序,首先由用戶在待監(jiān)控的并發(fā)程序 中針對(duì)共享變量的讀寫操作定義監(jiān)控點(diǎn),接著用戶在監(jiān)控點(diǎn)處添加若干個(gè)切點(diǎn); 步驟二,由用戶定義每一個(gè)切點(diǎn)對(duì)應(yīng)的通知,同時(shí)定義該通知需執(zhí)行的處理代碼,當(dāng)切 點(diǎn)匹配時(shí),通知內(nèi)定義的處理代碼在切點(diǎn)之前,或在切點(diǎn)之后,或在切點(diǎn)附近這3處執(zhí)行, 通知內(nèi)的transformO方法將用于存放包含源程序中被監(jiān)控方法的參數(shù)表數(shù)組args中的 行號(hào)、序列號(hào)信息的臨時(shí)變量meg中的內(nèi)容以及執(zhí)行環(huán)境中的線程標(biāo)識(shí)符轉(zhuǎn)換成監(jiān)控現(xiàn)場(chǎng) 信息,并存入在事件類EventPO中。
[0013] 在上述技術(shù)方案中,步驟(2)中所述的動(dòng)態(tài)標(biāo)記迀移算法DLT(S,T,t,SeS)的算 法輸入?yún)?shù)有:全局狀態(tài)棧S,全局迀移序列集T,局部迀移t和初始的全局序列集SeS;算 法輸出參數(shù)有:全局序列集SeS;其步驟如下: 步驟一,將S中的棧頂元素出棧存入狀態(tài)s,將SeS中的當(dāng)前序列存入序列變量〇中; 步驟二,更新s的回溯信息; 步驟三,如果存在線程P和s狀態(tài)下可行迀移集合s.enabled中線程p的一個(gè)迀移元 素t,執(zhí)行以下步驟: (3. 1)將線程p賦值給狀態(tài)s的回溯集s.backtrack; (3. 2)創(chuàng)建狀態(tài)s下已經(jīng)執(zhí)行過的迀移集合s.done,并將其置為空; (3. 3)如果存在某一線程q是狀態(tài)s的回溯集s.backtrack與狀態(tài)s下已經(jīng)執(zhí)行過的 迀移集合S.done的差集中的元素,重復(fù)執(zhí)行以下步驟,直到不存在這樣的線程q為止: (3. 3. 1)將q加入狀態(tài)s下已經(jīng)執(zhí)行過的迀移集合s.done中; (3. 3. 2)從狀態(tài)s的回溯集s. backtrack中刪除線程q ; (3. 3. 3)設(shè)p'是執(zhí)行迀移tm的線程,若線程p'屬于s.done,且tm屬于s.enabled,則 將tjj[]入集合s.retrieved中; (3. 3. 4)將s狀態(tài)下可行迀移集合s.enabled中線程q執(zhí)行的迀移設(shè)置為tn; (3. 3. 5)創(chuàng)建項(xiàng)集is并初始化為空,并將tn添加到is中; (3. 3. 6)將項(xiàng)集is添加到序列變量〇中; (3. 3. 7)判斷從狀態(tài)s出發(fā)且執(zhí)行tnS移后到達(dá)的狀態(tài)是否為空值,若不是,則執(zhí)行以 下步驟,否則不執(zhí)行: (3. 3. 7. 1)將從狀態(tài)s出發(fā)且執(zhí)行tnS移后得到的狀態(tài)設(shè)為s' ; (3. 3. 7. 2)將獨(dú)立于迀移t且屬于s. enabled中的迀移t'存入s', retrieved集合中; (3. 3. 7. 3)將 s' ? enabled 與 s' ? retrieved 集合的差集存入 s' ? enabled 中; (3. 3. 7. 4)將迀移、添加入迀移序列T中; (3. 3. 7. 5)將狀態(tài)s'壓入狀態(tài)棧S中; (3. 3. 7. 6)遞歸調(diào)用DLT(S,T,t,SeS)算法; (3. 3. 7. 7)將T中的最后一項(xiàng)序列移出; (3. 3. 8)將S中的一項(xiàng)狀態(tài)出棧; 步驟四,返回全局序列集SeS。
[0014] 在上述技術(shù)方案中,步驟(4)中序列模式挖掘算法ISPAM的步驟如下: 步驟一,將候選模式集合R和前k個(gè)缺陷模式的集合L設(shè)置為空集,并設(shè)置全局變量minsup為 0 ; 步驟二,將成功執(zhí)行序列集GS和失效執(zhí)行序列集BS分別轉(zhuǎn)化為垂直序列數(shù)據(jù)集V(GS) 和V(BS),生成V(BS)中項(xiàng)集列表Sinit; 步驟三,對(duì)于項(xiàng)集列表Sinit中的每一個(gè)項(xiàng)items,完成以下步驟: (3. 1)計(jì)算其是否是頻繁項(xiàng),如果是: (3. 1. 1)調(diào)用SAVE0方法對(duì)由單個(gè)項(xiàng)組成的模式存儲(chǔ)到L中; (3. 1. 2)在R集合添加項(xiàng)items,Sinit,Sinit>f在items之后的項(xiàng)的集合組成的三元組; 步驟四,如果存在元組>屬于R集合并且r的支持度大于等于minsup,則 重復(fù)做以下步驟,直到不滿足這一條件為止: (4. 1)選擇R集合中擁有最高支持度的模式r的元組< :> ; (4. 2)通過調(diào)用SEARCH0方法對(duì)候選模式集合R進(jìn)行拓展,更新候選模式集合R,并將 拓展得到的模式調(diào)用SAVE()方法存儲(chǔ)到L中; (4. 3)將元組< 7%S1; >從R中移除; (4. 4)將R中的所有滿足>e5+sup(i') <mksup>條件的元組從R中移除; 步驟五,返回含有