本發(fā)明涉及一種確定性重放功能的實現(xiàn)方法,尤其涉及一種支持故障注入的確定性重放功能的實現(xiàn)方法。
背景技術(shù):
隨著軟件規(guī)模越來越大,軟件的并發(fā)性與不確定性越來越強,軟件的調(diào)試和故障診斷越來越困難。確定性重現(xiàn)技術(shù)能夠使難以重現(xiàn)的錯誤得以重現(xiàn),從而幫助軟件開發(fā)人員更好更簡單地調(diào)試程序,提高程序開發(fā)效率。而現(xiàn)有的確定性重現(xiàn)技術(shù)還不支持故障注入,使確定性重放支持故障注入能夠讓軟件開發(fā)人員不僅可以重現(xiàn)執(zhí)行過程,而且還能對程序狀態(tài)進行修改,使程序進入新的執(zhí)行流程,使軟件測試覆蓋更多的運行分支,增強軟件的魯棒性。而且,現(xiàn)有的故障注入不支持快照日志記錄。支持故障注入的確定性重放通過恢復到快照日志記錄的模擬器運行狀態(tài),減少到達注入點的運行時間,提高軟件調(diào)試和測試的效率。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的在于針對現(xiàn)有技術(shù)的不足,提供一種支持故障注入的確定性重放功能的實現(xiàn)方法。
本發(fā)明的目的是通過以下技術(shù)方案來實現(xiàn)的,一種支持故障注入的確定性重放功能的實現(xiàn)方法,包括以下步驟:
(1)模擬運行被測程序,當接收外設發(fā)送的數(shù)據(jù),將接收的外設數(shù)據(jù)記錄到接收日志文件;當向外設發(fā)送數(shù)據(jù),將向外設發(fā)送的數(shù)據(jù)記錄到發(fā)送日志文件;若發(fā)生中斷事件,則記錄到中斷日志文件,并定時將模擬器狀態(tài)保存到快照日志文件。
(2)確定性重放系統(tǒng)開始運行,通過讀取快照日志文件恢復模擬器內(nèi)核到相應的運行狀態(tài)。
(3)若選擇重放,則對以前的執(zhí)行流程進行重放,跳轉(zhuǎn)到步驟4,若選擇進行故障注入,則跳轉(zhuǎn)到步驟6。
(4)打開相應的接收日志文件與中斷日志文件。
(5)模擬器內(nèi)核運行,并判斷運行是否結(jié)束,如果運行結(jié)束則跳轉(zhuǎn)到步驟7,否則循環(huán)執(zhí)行該步驟。
(6)確定性重放建立與外設的通信機制,確定性重放根據(jù)接收日志文件與發(fā)送日志文件里的記錄與外設進程進行通信,調(diào)整外設進程到與模擬器匹配的狀態(tài)。
(7)模擬器內(nèi)核運行,當?shù)竭_注入點時進行故障注入,并建立新的快照日志文件、接受日志文件、發(fā)送日志文件和中斷日志文件,然后判斷運行是否結(jié)束,如果運行結(jié)束則跳轉(zhuǎn)到步驟8,否則循環(huán)執(zhí)行該步驟。
(8)關(guān)閉各日志文件,結(jié)束程序的運行。
進一步地,所述步驟5具體為:模擬器內(nèi)核運行,當接收外設數(shù)據(jù)時,則從接收日志文件中讀取。同時根據(jù)中斷日志文件里的記錄來觸發(fā)相應的中斷事件。判斷運行是否結(jié)束,如果運行結(jié)束則跳轉(zhuǎn)到步驟7,否則循環(huán)執(zhí)行該步驟。
進一步地,所述步驟7具體為:模擬器內(nèi)核運行,當?shù)竭_注入點時進行故障注入,確定性重放記錄此時內(nèi)核運行狀態(tài)到新的快照日志文件;與外設進程進行通信,將接收的外設數(shù)據(jù)記錄到新的接收日志文件,向外設發(fā)送的數(shù)據(jù)記錄到新的發(fā)送日志文件;若發(fā)生中斷事件,則記錄到新的中斷日志文件。然后判斷運行是否結(jié)束,如果運行結(jié)束則跳轉(zhuǎn)到步驟7,否則循環(huán)執(zhí)行該步驟。
本發(fā)明的有益效果是:本發(fā)明通過將故障注入和確定性重放技術(shù)結(jié)合,使確定性重放支持故障注入。支持故障注入的確定性重現(xiàn)技術(shù)不僅能夠重現(xiàn)整個系統(tǒng)的運行過程,還能調(diào)整系統(tǒng)的執(zhí)行流程,使之覆蓋到更多的代碼,同時,通過恢復到快照日志記錄的模擬器運行狀態(tài),軟件調(diào)試人員能夠大大降低運行到注入點的時間,極大地提高了軟件調(diào)試與測試的效率。
附圖說明
圖1是系統(tǒng)不進行故障注入的執(zhí)行流程示意圖。
圖2是系統(tǒng)進行故障注入的執(zhí)行流程示意圖。
具體實施方式
下面結(jié)合附圖和具體實施例對本發(fā)明作進一步詳細說明。
本發(fā)明提供的一種支持故障注入的確定性重放功能的實現(xiàn)方法,包括以下步驟:
(1)模擬運行被測程序,當接收外設發(fā)送的數(shù)據(jù),將接收的外設數(shù)據(jù)記錄到接收日志文件;當向外設發(fā)送數(shù)據(jù),將向外設發(fā)送的數(shù)據(jù)記錄到發(fā)送日志文件;若發(fā)生中斷事件,則記錄到中斷日志文件,并定時將模擬器狀態(tài)保存到快照日志文件。
(2)確定性重放系統(tǒng)開始運行,通過讀取快照日志文件恢復模擬器內(nèi)核到相應的運行狀態(tài)。
(3)若選擇重放,則對以前的執(zhí)行流程進行重放,跳轉(zhuǎn)到步驟4,若選擇進行故障注入,則跳轉(zhuǎn)到步驟6。
(4)打開相應的接收日志文件與中斷日志文件。
(5)模擬器內(nèi)核運行,并判斷運行是否結(jié)束,如果運行結(jié)束則跳轉(zhuǎn)到步驟7,否則循環(huán)執(zhí)行該步驟。具體為:模擬器內(nèi)核運行,當接收外設數(shù)據(jù)時,則從接收日志文件中讀?。煌瑫r根據(jù)中斷日志文件里的記錄來觸發(fā)相應的中斷事件;判斷運行是否結(jié)束,如果運行結(jié)束則跳轉(zhuǎn)到步驟7,否則循環(huán)執(zhí)行該步驟。
(6)確定性重放建立與外設的通信機制,確定性重放根據(jù)接收日志文件與發(fā)送日志文件里的記錄與外設進程進行通信,調(diào)整外設進程到與模擬器匹配的狀態(tài)。
(7)模擬器內(nèi)核運行,當?shù)竭_注入點時進行故障注入,并建立新的快照日志文件、接受日志文件、發(fā)送日志文件和中斷日志文件,然后判斷運行是否結(jié)束,如果運行結(jié)束則跳轉(zhuǎn)到步驟8,否則循環(huán)執(zhí)行該步驟。具體為:模擬器內(nèi)核運行,當?shù)竭_注入點時進行故障注入,確定性重放記錄此時內(nèi)核運行狀態(tài)到新的快照日志文件;與外設進程進行通信,將接收的外設數(shù)據(jù)記錄到新的接收日志文件,向外設發(fā)送的數(shù)據(jù)記錄到新的發(fā)送日志文件;若發(fā)生中斷事件,則記錄到新的中斷日志文件;然后判斷運行是否結(jié)束,如果運行結(jié)束則跳轉(zhuǎn)到步驟7,否則循環(huán)執(zhí)行該步驟。
(8)關(guān)閉各日志文件,結(jié)束程序的運行。
以下通過實施例對本發(fā)明內(nèi)容做進一步解釋。圖1是系統(tǒng)不進行故障注入的執(zhí)行流程示意圖。重放系統(tǒng)開始運行之后,從快照日志文件讀取最近的檢查點,恢復模擬器的運行狀態(tài)。打開接收日志文件和中斷日志文件,模擬器開始運行,當有接收外設發(fā)送的數(shù)據(jù)時,從接收日志文件中讀取數(shù)據(jù),并且讀取中斷日志文件,如果有中斷發(fā)生,觸發(fā)相應的中斷事件。運行結(jié)束時,關(guān)閉各日志文件,退出運行。
圖2是系統(tǒng)進行故障注入的執(zhí)行流程示意圖。重放系統(tǒng)開始運行之后,從快照日志文件讀取最近的檢查點,恢復模擬器的運行狀態(tài)。并與外設進行通信,調(diào)整外設的狀態(tài)與模擬器匹配。模擬器開始運行,當?shù)竭_注入點時,對可注入對象進行故障注入,并將此時的模擬器狀態(tài)保存至新的快照日志文件。當有接收外設發(fā)送的數(shù)據(jù)時,將接收的數(shù)據(jù)寫入新的接收日志文件,有向外設發(fā)送數(shù)據(jù)時,將發(fā)送的數(shù)據(jù)寫入新的發(fā)送日志文件,如果有中斷發(fā)生,記錄中斷事件至新的中斷日志文件。運行結(jié)束時,關(guān)閉各日志文件,退出運行。