一種多核實時系統(tǒng)應(yīng)用數(shù)據(jù)競爭錯誤的調(diào)試方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及針對多核操作系統(tǒng)應(yīng)用程序的并發(fā)錯誤數(shù)據(jù)競爭通過統(tǒng)計調(diào)試的方 法進(jìn)行定位,屬于多核應(yīng)用程序調(diào)試技術(shù)領(lǐng)域,方便開發(fā)人員快速定位并發(fā)錯誤。
【背景技術(shù)】
[0002] 多核操作系統(tǒng)應(yīng)用程序因為非確定性的線程交替,容易產(chǎn)生數(shù)據(jù)競爭,死鎖,原子 性侵犯等并發(fā)相關(guān)的錯誤,并且由于調(diào)度不確定性在調(diào)試過程中導(dǎo)致問題極其難以定位。 對于開發(fā)者來說,即使知道產(chǎn)生錯誤的輸入,重現(xiàn)錯誤執(zhí)行也是很困難的。數(shù)據(jù)競爭是至少 兩個線程沒有按順序限制訪問同一內(nèi)存位置,其中至少一個訪問是寫操作。數(shù)據(jù)競爭本身 不一定是錯誤,但是它導(dǎo)致嚴(yán)重的難以發(fā)現(xiàn),崩潰,并發(fā)相關(guān)的軟件缺陷。
[0003] -方面,針對不同處理器已有硬件設(shè)備通過仿真來輔助開發(fā)人員在開發(fā)階段順利 調(diào)試,但是其價格昂貴,同時對開發(fā)者技術(shù)水平也有很高要求。另一方面,也有通過靜態(tài)或 者動態(tài)算法來檢測代碼中的并發(fā)錯誤來輔助開發(fā)人員排除故障,但是靜態(tài)方法利用程序的 依賴關(guān)系和類型約束等信息來分析程序的可能故障點,為更深層次的自動化檢測提供必要 條件;而動態(tài)二進(jìn)制插粧技術(shù)來檢測代碼中的并發(fā)錯誤的方法不需要修改或重新編譯應(yīng) 用程序的源代碼,并且支持動態(tài)生成代碼來檢測程序,但是會有較高的開銷,拖慢程序的執(zhí) 行,這部分的開銷對于程序執(zhí)行而言是不可忽略的。
[0004] 目前針對多核操作系統(tǒng)應(yīng)用程序,不適用已有的自動化插粧工具,而且針對特定 操作系統(tǒng)開發(fā)維護(hù)一套自動化插粧工具耗費時力人力較高,且動態(tài)插粧技術(shù)存在開銷大的 問題。
【發(fā)明內(nèi)容】
[0005] 本發(fā)明為了克服現(xiàn)有技術(shù)的不足,提供一種多核實時系統(tǒng)應(yīng)用數(shù)據(jù)競爭錯誤的調(diào) 試方法,通過統(tǒng)計調(diào)試的方法對收集的信息進(jìn)行處理對插粧位置進(jìn)行可疑度排序,快速通 過排序結(jié)果定位應(yīng)用程序中的實際發(fā)生故障的位置,且降低了動態(tài)二進(jìn)制插粧方法對程序 執(zhí)行的開銷。
[0006] 本發(fā)明提供的一種多核實時系統(tǒng)應(yīng)用數(shù)據(jù)競爭錯誤的調(diào)試方法,實現(xiàn)步驟如下:
[0007] 步驟1,在特定多核操作系統(tǒng)基礎(chǔ)上編寫應(yīng)用程序測試集,發(fā)生并發(fā)錯誤數(shù)據(jù)競爭 的 benchmark ;
[0008] 步驟2,設(shè)計插粧謂詞,對測試集中的程序進(jìn)行手工插粧;
[0009] 所述的插粧謂詞,用于記錄訪問全局變量的值改變次數(shù);
[0010] 步驟3,運行插粧后的測試集,在程序運行過程中收集插粧的謂詞記錄信息,并記 錄程序的每次執(zhí)行結(jié)果;
[0011] 所述的謂詞記錄信息,包括謂詞值、插粧行號和插粧所在函數(shù);
[0012] 步驟4,將插粧后的測試集至少執(zhí)行X次,收集謂詞記錄信息和程序執(zhí)行結(jié)果,作 為統(tǒng)計調(diào)試算法的輸入,執(zhí)行統(tǒng)計調(diào)試算法,輸出對程序插粧位置可能發(fā)生并發(fā)錯誤數(shù)據(jù) 競爭的可疑度排序;X為正整數(shù);
[0013] 步驟5,根據(jù)可疑度排序結(jié)果快速定位測試集程序中可能發(fā)生并發(fā)錯誤數(shù)據(jù)競爭 的位置。
[0014] 所述步驟2中,對測試集中的程序進(jìn)行手工插粧,實現(xiàn)過程包括:
[0015] (1)對多核操作系統(tǒng)應(yīng)用程序的每一個任務(wù)中全局變量的訪問位置都進(jìn)行插粧;
[0016] (2)利用編寫的插粧謂詞函數(shù)在測試集程序中手動插粧;
[0017] 所述的插粧函數(shù)包括三個接口函數(shù):函數(shù)initSiteO在初次訪問時初始化謂詞 記錄信息結(jié)構(gòu)體;函數(shù)cmpSiteO用于更新數(shù)據(jù)結(jié)構(gòu)體中謂詞值,在訪問全局變量之前,比 較該全局變量的本次值與記錄值是否一致,若不一致,將謂詞值加1,否則保持謂詞值不變; 函數(shù)UpSiteO在訪問全局變量之后更新全局變量的記錄值。
[0018] 所述步驟4中的統(tǒng)計調(diào)試算法的實現(xiàn)過程為:
[0019] 步驟4. 1,輸入謂詞記錄信息和程序執(zhí)行結(jié)果;
[0020] 步驟4. 2,統(tǒng)計成功測試總數(shù)Tp,失敗測試總數(shù)Tf,測試用例總數(shù)Tp+T f,覆蓋插粧位 置s的成功測試數(shù)Tp (s),覆蓋插粧位置s的失敗測試數(shù)Tf (s),覆蓋插粧位置s的測試總數(shù) Tp (s)+Tf (s),未覆蓋插粧位置s的成功執(zhí)行次數(shù),未覆蓋插粧位置s的失敗執(zhí)行次數(shù),未覆 蓋插粧位置s的執(zhí)行次數(shù)。
[0021] 執(zhí)行步驟4. 3或步驟4. 4來獲得插粧位置的可疑度排序;
[0022] 步驟4. 3,利用概率統(tǒng)計的方法計算每個謂詞位置存在可疑度的概率;
[0023] 步驟4. 4,利用基于謂詞覆蓋統(tǒng)計的原理,分析插粧周圍代碼的出錯概率。
[0024] 所述的步驟4. 3根據(jù)不同的統(tǒng)計模型計算公式來得到插粧位置的可疑度:
[0028] 對各插粧位置的可疑度進(jìn)行排序。
[0029] 所述的步驟4. 4中對每個謂詞P,根據(jù)設(shè)如下公式計算謂詞P的懷疑度:
[0031] 其中,F(xiàn)t(P)和St(P)分別表示P在失敗和成功執(zhí)行中取值為真的次數(shù),F(xiàn) ci(P)和 Sci(P)分別表示P在失敗和成功執(zhí)行中出現(xiàn)的次數(shù)。
[0032] 本發(fā)明具有如下優(yōu)點和積極效果:
[0033] (1)調(diào)試人員在調(diào)試定位并發(fā)錯誤的過程中可以方便快速的對共享數(shù)據(jù)進(jìn)行插 粧,只需傳入共享數(shù)據(jù)的地址,大小,行號,所在函數(shù)等容易獲得的信息,調(diào)用插粧API接口 可以自動維護(hù)記錄插粧信息。降低開發(fā)自動化插粧工具的成本和時間。
[0034] (2)根據(jù)插粧覆蓋記錄的信息和程序執(zhí)行結(jié)果成功或失敗作為統(tǒng)計調(diào)試算法的輸 入,計算得到各個插粧位置的可疑度排序結(jié)果來定位錯誤,降低了對調(diào)試人員技術(shù)水平的 要求,同時也節(jié)約了通過循環(huán)執(zhí)行斷點調(diào)試方法所耗費的時間。
【附圖說明】
[0035] 圖1是本發(fā)明謂詞插粧API接口示意圖;
[0036] 圖2是本發(fā)明進(jìn)行謂詞插粧的流程示意圖;
[0037] 圖3是本發(fā)明中統(tǒng)計調(diào)試算法程序的工作流程示意圖。
【具體實施方式】
[0038] 下面將結(jié)合附圖和實施示例對本發(fā)明作進(jìn)一步的詳細(xì)說明。通過足夠詳細(xì)的描述 這些示例,使得本領(lǐng)域技術(shù)人員能夠理解和實踐本發(fā)明。在不脫離本發(fā)明的主旨和范圍的 情況下,可以對實施做出邏輯的、實現(xiàn)的和其他的改變。因此,以下詳細(xì)說明不應(yīng)該被理解 為限制意義,本發(fā)明的范圍僅僅由權(quán)利要求來限定。
[0039] 多核操作系統(tǒng)應(yīng)用程序的調(diào)試工作,調(diào)試人員通常通過程序的循環(huán)多次執(zhí)行,設(shè) 定斷點的方法進(jìn)行,但此方法對調(diào)試人員的技術(shù)水平提出了較高要求,且在實際工作中調(diào) 試過程會耗費較多時間。故而可以通過在開發(fā)程序過程中按照謂詞插粧的要求在代碼中插 粧,當(dāng)程序出現(xiàn)問題時,多次執(zhí)行程序完成插粧覆蓋信息的記錄并且記錄程序執(zhí)行成功或 者失敗,將這些結(jié)果作為統(tǒng)計調(diào)試算法的輸入,統(tǒng)計調(diào)試算法輸出對插粧位置的可疑度排 序結(jié)果,調(diào)試人員根據(jù)排序結(jié)果來快速定位代碼中可能存在故障的位置,減少調(diào)試人員的 工作。
[0040] 本發(fā)明提供的多核實時系統(tǒng)應(yīng)用數(shù)據(jù)競爭錯誤的調(diào)試方法,針對某特定多核操作 系統(tǒng),基本步驟包括:編寫應(yīng)用程序測試集;設(shè)計插粧謂詞;手工在測試集上插粧謂詞;運 行插粧后的測試集收集執(zhí)行結(jié)果,執(zhí)行結(jié)果作為統(tǒng)計調(diào)試算法的輸入,統(tǒng)計調(diào)試算法輸出 可疑度排序結(jié)果;根據(jù)排序結(jié)果定位測試集中發(fā)生并發(fā)錯誤的位置。下面詳細(xì)說明步驟 1~步驟5。
[0041] 步驟1,在特定多核操作系統(tǒng)基礎(chǔ)上編寫應(yīng)用程序測試集,發(fā)生并發(fā)錯誤數(shù)據(jù)競爭 的 benchmark。
[0042] Benchmark表示基準(zhǔn)測試程序。
[0043] 步驟2,設(shè)計插粧謂詞,對測試集中的程序進(jìn)行手工插粧。
[0044] 根據(jù)發(fā)生并發(fā)錯誤數(shù)據(jù)競爭的特征,設(shè)計記錄在被同一任務(wù)連續(xù)兩次訪問過程中 訪問的全局變量的值改變次數(shù)的謂詞。每次運行程序,收集謂詞記錄信息,包括:謂詞值,插 粧行號,以及插粧所在函數(shù)。
[0045] 本步驟中,對測試集中的程序進(jìn)行手工插粧,收集測試程序訪問全局變量的信息, 實現(xiàn)過程包括步驟2. 1~2. 3。
[0046] 步驟2. 1,對多核操作系統(tǒng)應(yīng)用程序的每一個任務(wù)中全局變量的訪問位置都進(jìn)行 插粧;
[0047] 步驟2. 2,利用編寫的插粧函數(shù)在測試集程序中手動插粧;
[0048] 如圖1所示,為所設(shè)計的謂詞記錄信息結(jié)構(gòu)體和插粧函數(shù)示意圖。插粧函數(shù)包括 三個接口函數(shù):initSite Ο、cmpSite O和upSite O。函數(shù)initSite O在初次訪問時初始 化謂詞記錄信息結(jié)構(gòu)體。函數(shù)cmpSiteO用于更新數(shù)據(jù)結(jié)構(gòu)體中謂詞值,在訪問全局變量 之前,比較該全局變量本次值與記錄值是否一致,若不一致,將謂詞值加1,否則保持謂詞值 不變。函數(shù)upSite ()在訪問全局變量之后更新全局變量的記錄值。
[0049] 謂詞記錄信息結(jié)構(gòu)體如下:
[0050] int line ;//line 表示插粧行號
[0051] int predicate !//predicate 表不謂詞值
[0052] char func[20] ;//func 表示插粧所在函數(shù)
[0053] const void*address ;//address 表不全局變量起始地址
[0054] 其中,predicate表示謂詞值,如果本次全局變量的值與記錄值不一致,predicate 增加1,否則predicate保持不變。
[0055] 初始化謂詞記錄信息結(jié)構(gòu)體時,謂詞值是0。
[0056] 圖 1 所不,函數(shù) initSite ()包括四個參數(shù):line、address、size 和 function,其 中size表示全局變量地址空間大小,function就是插