相關(guān)申請的交叉引用
本申請要求2015年3月27日提交的題為“technologiesforapplicationvalidationinpersistentmemorysystems”的美國實(shí)用專利申請序列號14/670,965的優(yōu)先權(quán)。
技術(shù)實(shí)現(xiàn)要素:
一些計算系統(tǒng)包括持續(xù)存儲器,該持續(xù)存儲器可以是可字節(jié)尋址的高性能的非易失性存儲器。持續(xù)存儲器可以提供與傳統(tǒng)的易失性隨機(jī)存取存儲器(ram)相當(dāng)?shù)男阅?,同時還提供數(shù)據(jù)持久性。然而,持續(xù)存儲器可能對應(yīng)用開發(fā)人員提出額外的挑戰(zhàn)。具體地,應(yīng)用開發(fā)人員可能必須保證在任何給定的時間,持續(xù)存儲器中的數(shù)據(jù)是一致的。否則,諸如硬件故障或電源故障之類的意外的故障可能會導(dǎo)致數(shù)據(jù)損壞。
諸如編譯器和調(diào)試器之類的傳統(tǒng)軟件開發(fā)工具可以被用于校正錯誤,并且以另外的方式使用持續(xù)存儲器來驗(yàn)證應(yīng)用的正確性。另外,用于測試使用持續(xù)存儲器的應(yīng)用的基于管理程序的框架在philiplantz等人,yat:avalidationframeworkforpersistentmemorysoftware,usenixannualtechnicalconferenceat433(2014)中有所描述。
附圖說明
本文描述的概念通過示例而不通過附圖中的限制的方式進(jìn)行了說明。為了說明的簡單和清楚,附圖中例示的元件不一定按比例繪制。在適當(dāng)?shù)那闆r下,圖中已經(jīng)重復(fù)了附圖標(biāo)記,以指示對應(yīng)或相似的元件。
圖1是用于具有持續(xù)存儲器的應(yīng)用測試的計算設(shè)備的至少一個實(shí)施例的簡化框圖;
圖2是可以由圖1的計算設(shè)備建立的至少一個實(shí)施例環(huán)境的簡化框圖;
圖3是用于可以由圖1和圖2的計算設(shè)備執(zhí)行的具有持續(xù)存儲器的應(yīng)用測試的方法的至少一個實(shí)施例的簡化流程圖;以及
圖4是可以使用圖3的方法來測試的應(yīng)用和相關(guān)聯(lián)的測試功能的至少一個實(shí)施例的偽代碼。
具體實(shí)施方式
雖然本公開內(nèi)容的概念易于受到各種修改和替代形式的影響,但是其具體實(shí)施例已經(jīng)通過附圖中的示例示出并且將在本文中進(jìn)行詳細(xì)描述。然而,應(yīng)當(dāng)理解,并不意圖將本公開內(nèi)容的概念限制為所公開的特定形式,相反,本發(fā)明意圖涵蓋與本公開內(nèi)容和所附權(quán)利要求一致的所有修改、等同和替代方案。
說明書中對“一個實(shí)施例”、“實(shí)施例”、“說明性實(shí)施例”等的引用指出所描述的實(shí)施例可以包括特定的特征、結(jié)構(gòu)或特性,但是每個實(shí)施例可以或可以不一定包括特定的特征、結(jié)構(gòu)或特性。此外,這樣的短語不一定指代相同的實(shí)施例。另外,當(dāng)結(jié)合實(shí)施例描述特定的特征、結(jié)構(gòu)或特性時,認(rèn)為在本領(lǐng)域技術(shù)人員的知識范圍內(nèi),結(jié)合其它實(shí)施例來實(shí)現(xiàn)這些特征、結(jié)構(gòu)或特性,無論是否明確描述。另外,應(yīng)當(dāng)理解,以“a、b和c中的至少一個”形式包含在列表中的項(xiàng)可以是(a);(b);(c);(a和b);(a和c);(b和c);或者(a、b和c)。類似地,以“a、b或c中的至少一個”的形式列出的項(xiàng)可以是(a);(b);(c);(a和b);(a和c);(b和c);或者(a、b和c)。
在一些情況下,可以在硬件、固件、軟件或它們的任何組合中實(shí)施所公開的實(shí)施例。所公開的實(shí)施例還可以被實(shí)施為由一個或多個暫時性或非暫時性機(jī)器可讀(例如,計算機(jī)可讀)儲存介質(zhì)承載或者儲存在一個或多個暫時性或非暫時性機(jī)器可讀(例如,計算機(jī)可讀)儲存介質(zhì)上的指令,該指令可由一個或多個處理器讀取和執(zhí)行。機(jī)器可讀儲存介質(zhì)可以被具體化為用于以機(jī)器可讀的形式(例如,易失性或非易失性存儲器、介質(zhì)盤或其它介質(zhì)設(shè)備)儲存或發(fā)送信息的任何儲存設(shè)備、機(jī)構(gòu)或其它物理結(jié)構(gòu)。
在附圖中,可以以具體的布置和/或排序示出一些結(jié)構(gòu)或方法特征。然而,應(yīng)當(dāng)理解,這些具體的布置和/或排序可能不被需要。相反,在一些實(shí)施例中,這些特征可以以與在說明性圖形中示出的不同的方式和/或順序布置。另外,在特定圖形中包括結(jié)構(gòu)或方法特征并不意味著指在所有實(shí)施例中都需要這些特征,并且在一些實(shí)施例中,這些特征可以不被包括或者可以與其它特征組合。
現(xiàn)在參考圖1,在一個實(shí)施例中,用于測試持續(xù)存儲器應(yīng)用的計算設(shè)備100配置有全平臺模擬器和用于測試的應(yīng)用。平臺模擬器模擬具有持續(xù)存儲器的模擬計算設(shè)備102的執(zhí)行。具體地,平臺模擬器模擬模擬計算設(shè)備102的處理器寄存器、易失性高速緩存、易失性存儲器和持續(xù)存儲器的內(nèi)容。在使用中,如下面更詳細(xì)描述的那樣,計算設(shè)備100在應(yīng)用(例如,要測試的功能)中的測試位置處創(chuàng)建檢查點(diǎn),然后使用平臺模擬器模擬執(zhí)行應(yīng)用直到結(jié)束位置。在模擬執(zhí)行期間,計算設(shè)備100追蹤由應(yīng)用執(zhí)行的持續(xù)存儲器寫入。在完成模擬執(zhí)行之后,計算設(shè)備100可以生成由應(yīng)用執(zhí)行的持續(xù)存儲器寫入的許多不同排列并且例如通過執(zhí)行部分但不是全部追蹤的持續(xù)存儲器寫入來模擬電源故障。對于每個被測試的排列,計算設(shè)備100使用平臺模擬器來執(zhí)行用戶供應(yīng)的測試功能,以驗(yàn)證模擬的電源故障之后的模擬持續(xù)存儲器的一致性。計算設(shè)備100可以向用戶報告任何測試失敗。通過提供用于測試持續(xù)存儲器一致性的自動化框架,計算設(shè)備100可以使用持續(xù)存儲器來提高應(yīng)用的質(zhì)量。此外,計算設(shè)備100可以使用用戶級和/或應(yīng)用級工具來執(zhí)行應(yīng)用測試,而不需要對操作系統(tǒng)或管理程序的修改。另外,在說明性實(shí)施例中,計算設(shè)備100具有與模擬計算設(shè)備102相同的架構(gòu);例如,計算設(shè)備100包括持續(xù)存儲器。然而,應(yīng)當(dāng)理解,在一些實(shí)施例中,計算設(shè)備100可以具有與模擬的計算設(shè)備102不同的架構(gòu)和/或可以不包括持續(xù)存儲器。
計算設(shè)備100可以被具體化為能夠執(zhí)行本文描述的功能的任何類型的計算設(shè)備,該計算設(shè)備包括但不限于計算機(jī)、工作站、多處理器系統(tǒng)、服務(wù)器、機(jī)架式服務(wù)器、刀片服務(wù)器、膝上型計算機(jī)、筆記本計算機(jī)、網(wǎng)絡(luò)裝置、web裝置、分布式計算系統(tǒng)、基于處理器的系統(tǒng)和/或消費(fèi)電子設(shè)備。如圖1所示,計算設(shè)備100包括處理器120、輸入/輸出子系統(tǒng)122、存儲器124、數(shù)據(jù)儲存設(shè)備130和通信電路132。當(dāng)然,計算設(shè)備100可以包括其它或附加組件(諸如在其它實(shí)施例中通常在服務(wù)器設(shè)備(例如,各種輸入/輸出設(shè)備)中發(fā)現(xiàn)的那些)。另外,在一些實(shí)施例中,一個或多個說明性組件可以并入或以其他方式形成另一組件的一部分。例如,在一些實(shí)施例中,存儲器124或其部分可以并入處理器120中。
處理器120可以被具體化為能夠執(zhí)行本文所描述的功能的任何類型的處理器。處理器120可以被具體化為單核或多核處理器、數(shù)字信號處理器、微控制器或其它處理器或處理/控制電路。類似地,存儲器124可以被具體化為能夠執(zhí)行本文所描述的功能的任何類型的易失性或非易失性存儲器或數(shù)據(jù)儲存器。在操作中,存儲器124可以儲存在計算設(shè)備100的操作期間使用的各種數(shù)據(jù)和軟件(諸如操作系統(tǒng)、應(yīng)用、程序、庫和驅(qū)動器)。存儲器124還包括易失性存儲器126和持續(xù)存儲器128。易失性存儲器126可以被具體化為傳統(tǒng)ram,這意味著當(dāng)從計算設(shè)備100和/或易失性存儲器126移除電力時,包含在易失性存儲器126中的任何數(shù)據(jù)都會丟失。持續(xù)存儲器128可以被具體化為任何字節(jié)可尋址的高性能的非易失性存儲器。例如,持續(xù)存儲器128可以被具體化為電池支持的ram、相變存儲器、基于憶阻器的存儲器或其它類型的持續(xù)存儲器。持續(xù)存儲器128可以包括類似于易失性存儲器126的程序和數(shù)據(jù);然而,在從計算設(shè)備100和/或持續(xù)存儲器128移除電力的至少一段時間內(nèi),持續(xù)存儲器128的內(nèi)容被保留。
存儲器124經(jīng)由i/o子系統(tǒng)122通信地耦合到處理器120,i/o子系統(tǒng)122可被具體化為電路和/或組件,以促進(jìn)與計算設(shè)備100的處理器120、存儲器124和其它組件的輸入/輸出操作。例如,i/o子系統(tǒng)122可以被具體化為或者另外包括存儲器控制器中心、輸入/輸出控制中心、固件設(shè)備、通信鏈路(即,點(diǎn)到點(diǎn)鏈路、總線鏈路、電線、電纜、光導(dǎo)、印刷電路板跡線等)和/或其它組件和子系統(tǒng),以促進(jìn)輸入/輸出操作。在一些實(shí)施例中,i/o子系統(tǒng)122可以形成片上系統(tǒng)(soc)的一部分,并且與計算設(shè)備100的處理器120、存儲器124和其它組件一起合并到單個集成電路芯片。
數(shù)據(jù)儲存設(shè)備130可以被具體化為被配置用于數(shù)據(jù)的短期或長期儲存的任意類型的設(shè)備或多個設(shè)備(諸如存儲設(shè)備和電路、存儲卡、硬盤驅(qū)動器、固態(tài)驅(qū)動器、或其它數(shù)據(jù)儲存設(shè)備)。訪問數(shù)據(jù)存儲設(shè)備130可能比訪問持續(xù)存儲器128慢得多。另外,數(shù)據(jù)儲存設(shè)備130可以通過塊設(shè)備、文件系統(tǒng)、或其它非字節(jié)可尋址接口來訪問。
計算設(shè)備100的通信電路132可以被具體化為能夠通過計算網(wǎng)絡(luò)實(shí)現(xiàn)計算設(shè)備100與其它遠(yuǎn)程設(shè)備之間的通信的任何通信電路、設(shè)備或它們的集合。通信電路132可以被配置為使用任何一種或多種通信技術(shù)(例如,有線或無線通信、以太網(wǎng)、
在一些實(shí)施例中,計算設(shè)備100還可以包括一個或多個外圍設(shè)備134。外圍設(shè)備134可以包括任意數(shù)量的附加輸入/輸出設(shè)備、接口設(shè)備和/或其它外圍設(shè)備。例如,在一些實(shí)施例中,外圍設(shè)備134可以包括顯示器、觸摸屏、圖形電路、鍵盤、鼠標(biāo)、揚(yáng)聲器系統(tǒng)和/或其它輸入/輸出設(shè)備、接口設(shè)備和/或外圍設(shè)備。
如圖1所示,模擬計算設(shè)備102可以包括模擬的硬件組件,該模擬的硬件組件包括模擬處理器120′、模擬i/o子系統(tǒng)122′、模擬存儲器124′(包括模擬易失性存儲器126′和模擬持續(xù)存儲器128′)、模擬數(shù)據(jù)儲存設(shè)備130′、模擬通信電路132′和模擬外圍設(shè)備134′。模擬計算設(shè)備102的那些模擬的組件可以類似于計算設(shè)備100的對應(yīng)的組件,其描述適用于模擬計算設(shè)備102的對應(yīng)的模擬組件,并且在本文中不重復(fù)以便不使本公開內(nèi)容模糊。
現(xiàn)在參考圖2,在說明性實(shí)施例中,計算設(shè)備100建立應(yīng)用202、測試功能206、平臺模擬器模塊208、捕獲模塊210和重放模塊212。環(huán)境200的各種模塊可以被具體化為硬件、固件、軟件或它們的組合。例如,環(huán)境200的各種模塊、邏輯和其它組件可以形成計算設(shè)備100的處理器120或其它硬件組件的一部分,或以其他方式由計算設(shè)備100的處理器120或其它硬件組件建立。這樣,在一些實(shí)施例中,環(huán)境200的任何一個或多個模塊可被具體化為電氣設(shè)備的電路或集合(例如,捕獲電路、重放電路等)。
應(yīng)用202可以被具體化為操縱儲存在持續(xù)存儲器中的數(shù)據(jù)的任何應(yīng)用、模塊、功能、子程序或其它代碼或代碼模塊。應(yīng)用202可以被具體化為可由通過平臺模擬器模塊208模擬的計算設(shè)備執(zhí)行的機(jī)器可執(zhí)行代碼、字節(jié)碼、中間代碼、匯編代碼、源代碼或任何其他代碼。應(yīng)用202可以被具體化為用戶級和/或內(nèi)核級代碼。在一些實(shí)施例中,應(yīng)用202還可以由計算設(shè)備100本機(jī)地執(zhí)行。應(yīng)用202可以包括恢復(fù)功能204。恢復(fù)功能204可以被具體化為任何應(yīng)用、模塊、功能、子程序或其它代碼,它們可能在應(yīng)用202的斷電、崩潰或其它故障之后被應(yīng)用202執(zhí)行,以便修復(fù)或以其他方式恢復(fù)儲存在持續(xù)存儲器128中的數(shù)據(jù)。例如,數(shù)據(jù)庫應(yīng)用202的恢復(fù)功能204可以嘗試在電源故障后修復(fù)數(shù)據(jù)表之間的數(shù)據(jù)表和關(guān)聯(lián)。
測試功能206可以具體化為可以被執(zhí)行以驗(yàn)證通過應(yīng)用202生成或以其他方式操縱的儲存在持續(xù)存儲器中的數(shù)據(jù)的正確性的任何用戶定義的功能、子程序、模塊、應(yīng)用或其它代碼。測試功能206可以是獨(dú)立模塊,或者在一些實(shí)施例中可以并入到應(yīng)用202中。例如,用于數(shù)據(jù)庫應(yīng)用202的測試功能206可以被具體化為完整性檢驗(yàn)器,該完整性檢驗(yàn)器驗(yàn)證數(shù)據(jù)表、數(shù)據(jù)行、表與行之間的關(guān)系、和/或儲存在持續(xù)存儲器128中的其它數(shù)據(jù)的正確性。
平臺模擬器模塊208被配置為模擬諸如模擬計算設(shè)備102的整個計算平臺的執(zhí)行,包括處理器狀態(tài)(例如,寄存器狀態(tài)和易失性高速緩存狀態(tài))、存儲器狀態(tài)(易失性和持續(xù))、數(shù)據(jù)儲存狀態(tài)以及與模擬計算設(shè)備102相關(guān)聯(lián)的其它數(shù)據(jù)和/或設(shè)備的模擬。平臺模擬器模塊208可以例如模擬在模擬計算設(shè)備102上啟動操作系統(tǒng)和/或管理程序,然后可以模擬該操作系統(tǒng)內(nèi)的應(yīng)用202的執(zhí)行。平臺模擬器模塊208可以生成模擬計算設(shè)備102的狀態(tài)的檢查點(diǎn),暫停模擬計算設(shè)備102的執(zhí)行,基于檢查點(diǎn)重新啟動模擬計算設(shè)備102的執(zhí)行,和/或執(zhí)行修改模擬計算設(shè)備102的狀態(tài)的其它操作。平臺模擬器模塊208可以被具體化為例如
捕獲模塊210被配置為使用平臺模擬器模塊208來生成針對應(yīng)用202內(nèi)的測試位置的狀態(tài)檢查點(diǎn)。捕獲模塊210還被配置為使用平臺模擬器模塊208從測試位置到應(yīng)用202中的第二位置執(zhí)行應(yīng)用202,并且在模擬執(zhí)行期間追蹤應(yīng)用202的持續(xù)存儲器狀態(tài)。捕獲模塊210可以生成指示在模擬執(zhí)行期間由應(yīng)用202執(zhí)行的持續(xù)存儲器寫入、存儲器柵欄、高速緩存行沖洗(cachelineflushes)、持續(xù)存儲器提交或其它持續(xù)存儲器操作的追蹤數(shù)據(jù)。
重放模塊212被配置為使用由捕獲模塊210記錄的追蹤數(shù)據(jù)來生成由應(yīng)用202執(zhí)行的存儲器寫入的許多排列。每個排列描述了模擬計算設(shè)備102的硬件規(guī)范所允許的所追蹤的持續(xù)存儲器寫入的可能排序。重放模塊212被配置為從保存的檢查點(diǎn)重放持續(xù)存儲器寫入的每個排列,模擬電源故障,然后使用平臺模擬器模塊208調(diào)用測試功能206。重放模塊212可以報告測試功能206的結(jié)果。重放模塊212被配置為繼續(xù)測試持續(xù)存儲器寫入的排列,直到觀察到失敗或者直到充分排列已被成功測試以驗(yàn)證應(yīng)用202。
現(xiàn)在參考圖3,在使用中,計算設(shè)備100可以執(zhí)行用于應(yīng)用測試的方法300。方法300在框302中開始,其中,計算設(shè)備100在平臺模擬器中執(zhí)行應(yīng)用202。平臺模擬器還可以執(zhí)行支持應(yīng)用202的執(zhí)行所需的任何操作系統(tǒng)或其它代碼。平臺模擬器在應(yīng)用202的執(zhí)行期間模擬模擬計算設(shè)備102的狀態(tài)(包括模擬處理器120′寄存器或高速緩存、模擬易失性存儲器126′和模擬持續(xù)存儲器128′的內(nèi)容)。在說明性實(shí)施例中,平臺模擬器模擬具有與計算設(shè)備100相同架構(gòu)的模擬計算設(shè)備102;然而,在其它實(shí)施例中,平臺模擬器可以模擬具有不同架構(gòu)的計算設(shè)備。計算設(shè)備100可以繼續(xù)在平臺模擬器中執(zhí)行應(yīng)用202,直到到達(dá)應(yīng)用202內(nèi)的測試位置。測試位置可以是應(yīng)用202內(nèi)的任何用戶定義的位置或斷點(diǎn)(諸如功能、模塊、或其它要測試的代碼段的開頭)。在框304中,計算設(shè)備100使用平臺模擬器來在測試位置處創(chuàng)建檢查點(diǎn)。當(dāng)執(zhí)行到達(dá)測試位置時,檢查點(diǎn)將模擬計算設(shè)備102的硬件和軟件狀態(tài)記錄在平臺模擬器內(nèi),并且可以包括或以其他方式表示模擬處理器120′寄存器和高速緩存、模擬易失性存儲器126′和/或模擬持續(xù)存儲器128′的內(nèi)容。
在框306中,計算設(shè)備100在平臺模擬器中從測試位置開始直到應(yīng)用202中的結(jié)束位置執(zhí)行應(yīng)用202。類似于測試位置,結(jié)束位置可以是任何用戶定義的應(yīng)用202內(nèi)的位置或斷點(diǎn)(諸如要測試的功能、模塊或其它代碼段的結(jié)尾)。在到達(dá)結(jié)束位置之后,平臺模擬器可以暫停應(yīng)用202的執(zhí)行。在模擬期間,計算設(shè)備100追蹤應(yīng)用202的執(zhí)行。在執(zhí)行期間生成的追蹤數(shù)據(jù)可用于重建對模擬計算設(shè)備102的模擬持續(xù)存儲器128′的修改,包括在模擬執(zhí)行期間的任何特定時間的易失性高速緩存的狀態(tài)和/或模擬持續(xù)存儲器128′的狀態(tài)。
在一些實(shí)施例中,在框308中,計算設(shè)備100追蹤被執(zhí)行的持續(xù)存儲器寫入、高速緩存行沖洗和存儲器柵欄。持續(xù)存儲器寫入可以包括導(dǎo)致將值寫入到模擬持續(xù)存儲器128′的任何儲存指令或其它指令。當(dāng)然,對于具有回寫高速緩存的模擬計算設(shè)備102,所儲存的數(shù)據(jù)可能不會立即到達(dá)模擬持續(xù)存儲器128′。因此,在一些實(shí)施例中,儲存指令可以將數(shù)據(jù)放置在模擬處理器120′高速緩存中,并將相關(guān)聯(lián)的高速緩存行標(biāo)記為臟的。高速緩存行沖洗可以被具體化為使得模擬處理器120′將模擬的臟的高速緩存行的內(nèi)容寫到模擬持續(xù)存儲器128′的指令或處理器原語。高速緩存行沖洗可以被具體化為例如clflush指令、clflushopt指令或clwb(高速緩存行寫回)指令。存儲器柵欄可以被具體化為強(qiáng)制執(zhí)行對模擬持續(xù)存儲器128′的存儲器寫入的排序的指令或處理器原語。例如,模擬處理器120′可以保證在以程序順序發(fā)生在存儲器柵欄之前的持續(xù)存儲器儲存(或高速緩存行沖洗)在以程序順序發(fā)生在存儲器柵欄之后的任何持續(xù)存儲器儲存之前變得全局可見。存儲器柵欄可以被具體化為例如sfence指令或mfence指令。
在一些實(shí)施例中,在框310中,計算設(shè)備100追蹤被執(zhí)行的持續(xù)存儲器提交原語。持續(xù)存儲器提交原語可以被具體化為使得持續(xù)存儲器128已接受的數(shù)據(jù)變得持久(即變得耐久)的指令或其它處理器原語。例如,即使在將數(shù)據(jù)從處理器高速緩存寫回到持續(xù)存儲器128之后,該數(shù)據(jù)也可以位于計算設(shè)備100的存儲控制器、持續(xù)存儲器模塊、或其他組件中的一個或多個高速緩存或其它易失性存儲器結(jié)構(gòu)中。執(zhí)行持續(xù)存儲器提交原語可能導(dǎo)致這樣的數(shù)據(jù)被提交到持續(xù)存儲器128,并且因此在任何電源故障之后被保留。持續(xù)存儲器提交原語可以被具體化為例如pcommit指令。
在框312中,計算設(shè)備100確定從測試位置到結(jié)束位置的應(yīng)用202的被追蹤的執(zhí)行的下一段。計算設(shè)備100可以基于持續(xù)存儲器提交原語來分割追蹤數(shù)據(jù)。在每個持續(xù)存儲器提交原語之后,模擬持續(xù)存儲器128′的內(nèi)容是可確定的,因?yàn)樗邢惹暗某掷m(xù)存儲器寫入都被保證將被提交。因此,追蹤數(shù)據(jù)可以被分割成持續(xù)存儲器提交原語之間的段,并且每個段都可以被獨(dú)立地分析。分割追蹤數(shù)據(jù)可能會大大減少持久寫入的潛在排列的數(shù)量,從而可能減少應(yīng)用確認(rèn)所需的時間。當(dāng)然,在一些實(shí)施例中,計算設(shè)備100可以將追蹤數(shù)據(jù)分析為單個段。
在框314中,計算設(shè)備100將模擬計算設(shè)備102的狀態(tài)恢復(fù)到當(dāng)前段的開頭。換而言之,模擬計算設(shè)備102的狀態(tài)被重置為其在當(dāng)前段開始時的狀態(tài)。模擬計算設(shè)備102的恢復(fù)的狀態(tài)可以基于在框304中記錄的測試位置處所保存的檢查點(diǎn)。模擬計算設(shè)備102的狀態(tài)可以包括模擬處理器120′寄存器或高速緩存、模擬易失性存儲器126′和/或在應(yīng)用202的執(zhí)行期間的模擬持續(xù)存儲器128′的內(nèi)容。
在框316中,計算設(shè)備100在當(dāng)前段中的應(yīng)用202的模擬執(zhí)行期間生成由計算設(shè)備100追蹤的持續(xù)存儲器寫入的排列。為了生成排列,計算設(shè)備100可以重新布置所追蹤的持久寫入被提交到模擬持續(xù)存儲器128′的順序。計算設(shè)備100僅選擇模擬計算設(shè)備102的硬件規(guī)范所允許的排列。例如,在存儲器柵欄和/或高速緩存沖洗之前發(fā)生的持續(xù)存儲器寫入可能不被重新排序以在存儲器柵欄和/或高速緩存沖洗之后發(fā)生。作為另一個示例,到相同存儲器地址的寫入可能無法重新排序。計算設(shè)備100可以按順序選擇存儲器寫入的下一個可能排列,例如,如果可能排列的總數(shù)低于預(yù)定義閾值(例如,250個排列)。在一些實(shí)施例中,在框318中,計算設(shè)備100可以從搜索空間中隨機(jī)選擇包括模擬計算設(shè)備102所允許的存儲器寫入的所有可能排列的排列。如下所述,可能排列的數(shù)量可以是非常大的,并且計算設(shè)備100可以驗(yàn)證排列的隨機(jī)抽樣而不是所有可能的排列。
在框320中,計算設(shè)備100重放所選擇的持續(xù)存儲器寫入的排列。計算設(shè)備100可以從對應(yīng)于測試位置的檢查點(diǎn)開始調(diào)整應(yīng)用202的保存的狀態(tài)。計算設(shè)備100可以通過應(yīng)用記錄在追蹤數(shù)據(jù)中的持續(xù)存儲器寫入,使用所選的排列的寫排序來調(diào)整模擬計算設(shè)備102的模擬處理器120′寄存器和易失性高速緩存、模擬易失性存儲器126′和/或模擬持續(xù)存儲器128′的內(nèi)容。在說明性實(shí)施例中,計算設(shè)備100可以通過調(diào)整狀態(tài)數(shù)據(jù)而不在平臺模擬器中執(zhí)行應(yīng)用202來重放排列。附加地或替代地,在一些實(shí)施例中,計算設(shè)備100可以在平臺模擬器中從保存的檢查點(diǎn)開始執(zhí)行應(yīng)用202。在框322中,計算設(shè)備100模擬電源故障。計算設(shè)備100例如可以在向模擬持續(xù)存儲器128′提交所有被追蹤的持久寫入之前停止重放所選擇的排列。在模擬電源故障之后,可以提交一些但不是全部的持續(xù)存儲器寫入,從而模擬計算設(shè)備102的模擬持續(xù)存儲器128′可能處于不一致的狀態(tài)。
在框324中,計算設(shè)備100使用平臺模擬器來調(diào)用測試功能206。平臺模擬器使用由模擬斷電產(chǎn)生的修改的系統(tǒng)狀態(tài)來開始執(zhí)行測試功能206。如上所述,測試功能206可以被具體化為對與應(yīng)用202相關(guān)聯(lián)的模擬持續(xù)存儲器128′執(zhí)行一致性檢查的任何用戶定義的功能、子程序、模塊、應(yīng)用或其它用戶指定的代碼。例如,測試功能206可以檢查模擬持續(xù)存儲器128′中的數(shù)據(jù)結(jié)構(gòu)(例如,通過遵循持續(xù)存儲器指針,檢查數(shù)據(jù)庫表關(guān)系等)。在執(zhí)行后,測試功能206可以指示一致性檢查是否成功。在一些實(shí)施例中,模擬持續(xù)存儲器128′中的不一致可能導(dǎo)致測試功能206無法執(zhí)行到完成(例如,通過導(dǎo)致崩潰、無限循環(huán)或其它錯誤情況)。在這些實(shí)施例中,計算設(shè)備100可以將無法執(zhí)行到完成解釋為不一致性測試的失敗。在一些實(shí)施例中,在框326中,計算設(shè)備100可以在執(zhí)行測試功能206之前在平臺模擬器中調(diào)用恢復(fù)功能204?;謴?fù)功能204可以嘗試修復(fù)模擬持續(xù)存儲器128′中的任何不一致或其它錯誤。恢復(fù)功能204可以是應(yīng)用202的標(biāo)準(zhǔn)組件。因此,在恢復(fù)功能204之后執(zhí)行測試功能206可以測試在電源故障之后應(yīng)用202是否可以從持續(xù)存儲器128的狀態(tài)成功地恢復(fù)。
在框328中,計算設(shè)備100確定測試功能206是否失敗。如果沒有,則方法300向前分支到塊332,如下所述。如果測試功能206失敗,則方法300分支到框330,其中計算設(shè)備100報告失敗。計算設(shè)備100例如可以向用戶顯示通知,生成報告或者提供有關(guān)失敗的信息。在一些實(shí)施例中,計算設(shè)備100可以報告關(guān)于導(dǎo)致測試失敗的持續(xù)存儲器寫入的特定排列的數(shù)據(jù)。用戶可以使用該數(shù)據(jù)來重構(gòu)失敗(例如使用調(diào)試器)。在報告測試失敗之后,方法300可以進(jìn)行到框332以繼續(xù)測試附加的排列。
返回參考框328,如果測試功能206沒有失敗,則方法300分支到框332。在框332中,計算設(shè)備100確定持續(xù)存儲器寫入的充分排列是否已經(jīng)被測試。計算設(shè)備100可以使用任何適當(dāng)?shù)臉?biāo)準(zhǔn)來確定何時已經(jīng)測試了充分排列。例如,在一些實(shí)施例中,計算設(shè)備100可以確定模擬計算設(shè)備102的硬件規(guī)范所允許的所有可能排列是否已經(jīng)被測試。在一些實(shí)施例中,在框334中,計算設(shè)備100可以確定搜索空間的測試覆蓋是否充分,換言之,是否充分大比例的可能排列已經(jīng)被測試。計算設(shè)備100可以例如確定閾值數(shù)量或閾值百分比的可能排列是否已經(jīng)被測試。在一些實(shí)施例中,計算設(shè)備100可以基于已經(jīng)測試的可能排列的比例來統(tǒng)計地確定已經(jīng)發(fā)現(xiàn)應(yīng)用202中的所有錯誤的可能性。計算設(shè)備100可以基于該可能性來確定充分排列是否已經(jīng)被測試。
在框336中,計算設(shè)備100檢查充分排列是否已經(jīng)被測試。如果沒有,則方法300循環(huán)回到框314以將模擬計算設(shè)備102恢復(fù)到當(dāng)前段的開頭,并生成用于測試的下一個排列。如果已經(jīng)測試了充分排列,則方法300前進(jìn)到框338。
在框338中,計算設(shè)備100確定附加段是否仍然被測試。例如,計算設(shè)備100可以確定直到應(yīng)用202的結(jié)束位置的所有分段是否已被測試。如果附加段保留,則方法300循環(huán)回到框312,其中計算設(shè)備100確定用于測試的下一段和持續(xù)存儲器寫入的集合。如果沒有附加段剩余,則方法300前進(jìn)到框340,其中計算設(shè)備100報告測試成功。計算設(shè)備100可以例如向用戶顯示通知,生成報告或者以其他方式提供關(guān)于成功確認(rèn)的信息。在報告確認(rèn)之后,方法300完成。方法300可以被重新執(zhí)行以重新測試應(yīng)用202或測試另一個應(yīng)用202。
現(xiàn)在參考圖4,偽代碼400例示可以使用方法300來測試的應(yīng)用202的一部分的一個潛在實(shí)施例。語句402例示了模擬持續(xù)存儲器128′的初始狀態(tài)。如圖所示,模擬持續(xù)存儲器128′包括三個變量a、b和c,每個分別存儲值10、11和12。語句428例示了測試功能206的一個潛在實(shí)施例。如圖所示,在說明性實(shí)施例中,如果a小于b且b小于c,則測試功能206成功。語句404至426表示要測試的應(yīng)用202的段。語句404對應(yīng)于測試位置(即,測試開始時保存的檢查點(diǎn)的位置),并且語句426對應(yīng)于結(jié)束位置。
在語句404中,將新值寫入模擬持續(xù)存儲器128′中的變量a。在執(zhí)行語句404之后,a的新值可以被儲存在模擬處理器120′高速緩存或其它易失性存儲器中。在語句406中,執(zhí)行存儲器柵欄。存儲器柵欄在寫入語句404與對存儲器柵欄之后發(fā)生的模擬持續(xù)存儲器128′的任何其它寫入(例如,下面描述的語句414、418)之間強(qiáng)制執(zhí)行排序。在語句408中,執(zhí)行高速緩存沖洗。高速緩存沖洗使得a的新值被從模擬處理器120′的高速緩存寫入到模擬持續(xù)存儲器128′。在執(zhí)行高速緩存沖洗之后,a的新值可以被模擬持續(xù)存儲器128′所接受,但可能還不持久。在語句410中,執(zhí)行存儲器柵欄。存儲器柵欄可以在語句408的高速緩存沖洗與任何其它高速緩存沖洗之間強(qiáng)制執(zhí)行排序。在語句412中,執(zhí)行持續(xù)存儲器提交原語。持續(xù)存儲器提交原語使得模擬持續(xù)存儲器128′接受的a的新值變得持久。因此,僅在執(zhí)行語句412之后,a的新值在模擬電源故障后可能可用。如上所述,偽代碼400可以由持續(xù)存儲器提交原語分割。因此,在測試期間,可以分開地分析語句404至412。因?yàn)檫@些語句只包含單個持續(xù)存儲器寫入,所以只能對持續(xù)存儲器寫入的一個排列進(jìn)行測試。對于該排列,語句428評估為真(即,5<11&&11<12評估為真)。因此,包括語句404到412的段可以被成功地確認(rèn)。
在語句414中,在模擬持續(xù)存儲器128′中將新值寫入變量b。在執(zhí)行語句414之后,b的新值可以被儲存在模擬處理器120′高速緩存或其它易失性存儲器中。在語句416中,將值寫入到模擬易失性存儲器126′。由于在電源故障之后易失性存儲器的內(nèi)容丟失,所以計算設(shè)備100可能不會在語句416中追蹤到模擬易失性存儲器126′的儲存。在語句418中,新值被寫入到模擬持續(xù)存儲器128′中的變量c。在執(zhí)行語句418之后,c的新值可以被儲存在模擬處理器120′高速緩存或其它易失性存儲器中。在語句420中,執(zhí)行存儲器柵欄。存儲器柵欄在在語句414、418中的寫入與對存儲器柵欄之后發(fā)生的模擬持續(xù)存儲器128′的任何其它寫入之間強(qiáng)制執(zhí)行排序。請注意,語句420的存儲器柵欄不強(qiáng)制在語句414、418的寫入之間的排序。在語句422中,執(zhí)行高速緩存沖洗。高速緩存沖洗使得b和c的新值被從模擬處理器120′高速緩存寫入到模擬持續(xù)存儲器128′。在執(zhí)行高速緩存沖洗之后,b和c的新值可以被模擬持續(xù)存儲器128′接受,但可能還不持久。在語句424中,執(zhí)行存儲器柵欄。存儲器柵欄可以在語句422的高速緩存沖洗與任何其它高速緩存沖洗之間強(qiáng)制執(zhí)行排序。在語句426中,執(zhí)行持續(xù)存儲器提交原語。持續(xù)存儲器提交原語使得被模擬持續(xù)存儲器128′接受的b和c的新值變得持久。因此,只有在執(zhí)行語句412之后,在模擬電源故障之后,b和c兩者的新值可能可用。如上所述,語句426的持續(xù)存儲器提交原語不會在語句414,418的寫入之間強(qiáng)制執(zhí)行排序。
在測試期間,語句414至426可以被分析為獨(dú)立的段。這些語句可能具有持續(xù)寫入的兩種可能排列:語句414可以在語句418之前(即,以程序順序)提交,或者語句418可以在語句414之前被提交(即,亂序)。在測試期間,計算設(shè)備100可以用在語句414之前提交的語句418重放排列。當(dāng)語句418的寫入已被提交到模擬持續(xù)存儲器128′但語句414的寫入尚未提交給模擬持續(xù)存儲器128′時,計算設(shè)備100可以模擬電源故障。在這種情況下,語句428評估為假(即,5<11且11<7評估為假),因此語句414至426可能未被確認(rèn)。在說明性實(shí)施例中,確認(rèn)錯誤可以通過例如修改應(yīng)用202來進(jìn)行校正,以在語句414、418之間插入存儲器柵欄、高速緩存行沖洗和/或持續(xù)存儲器提交原語,從而強(qiáng)制執(zhí)行適當(dāng)?shù)呐判颉?/p>
示例
以下提供本文公開的技術(shù)的說明性示例。技術(shù)的實(shí)施例可以包括以下描述的示例中的任意一個或多個、以及任意組合。
示例1包括用于軟件測試的計算設(shè)備,所述計算設(shè)備包括捕獲模塊,所述捕獲模塊用于:(i)使用所述計算設(shè)備的平臺模擬器來從代碼模塊中的測試位置到所述代碼模塊中的第二位置執(zhí)行所述代碼模塊并且(ii)在執(zhí)行所述代碼模塊期間追蹤由所述平臺模擬器模擬的模擬計算設(shè)備的持續(xù)存儲器狀態(tài),以生成指示所述持續(xù)存儲器狀態(tài)的追蹤數(shù)據(jù);以及重放模塊,所述重放模塊用于(i)基于所述追蹤數(shù)據(jù)來生成持續(xù)存儲器寫入的排列,其中,所述持續(xù)存儲器寫入的排列具有所述模擬計算設(shè)備的硬件規(guī)范所允許的排序,(ii)重放所述持續(xù)存儲器寫入的排列,(iii)響應(yīng)于所述持續(xù)存儲器寫入的排列的重放而模擬電源故障,以及(iv)響應(yīng)于所述電源故障的模擬,而使用所述平臺模擬器來調(diào)用與所述代碼模塊相關(guān)聯(lián)的測試功能。
示例2包括示例1的主題,并且其中,追蹤所述持續(xù)存儲器狀態(tài)包括追蹤由所述代碼模塊執(zhí)行的持續(xù)存儲器寫入。
示例3包括示例1和2中任一項(xiàng)的主題,并且其中,追蹤所述持續(xù)存儲器狀態(tài)包括追蹤由所述代碼模塊執(zhí)行的高速緩存行沖洗。
示例4包括示例1-3中任一項(xiàng)的主題,并且其中,追蹤所述持續(xù)存儲器狀態(tài)包括追蹤由所述代碼模塊執(zhí)行的存儲器柵欄。
示例5包括示例1-4中任一項(xiàng)的主題,并且其中,追蹤所述持續(xù)存儲器狀態(tài)包括追蹤由所述代碼模塊執(zhí)行的持續(xù)存儲器提交原語。
示例6包括示例1-5中任一項(xiàng)的主題,并且其中,基于所述追蹤數(shù)據(jù)來生成所述持續(xù)存儲器寫入的排列包括:選擇由持續(xù)存儲器提交原語定界的所述追蹤數(shù)據(jù)的段;以及生成被限于所述追蹤數(shù)據(jù)的所述段的持續(xù)存儲器寫入的排列。
示例7包括示例1-6中任一項(xiàng)的主題,并且其中,所述捕獲模塊還用于使用所述平臺模擬器來生成針對所述代碼模塊中的所述測試位置的狀態(tài)檢查點(diǎn),其中,所述狀態(tài)檢查點(diǎn)指示所述模擬計算設(shè)備的所述持續(xù)存儲器狀態(tài);并且重放所述持續(xù)存儲器寫入的排列包括基于所述狀態(tài)檢查點(diǎn)來重放所述持續(xù)存儲器寫入的排列。
示例8包括示例1-7中任一項(xiàng)的主題,并且其中,重放所述持續(xù)存儲器寫入的排列包括根據(jù)所述持續(xù)存儲器寫入的排列來修改所述狀態(tài)檢查點(diǎn)。
示例9包括示例1-8中任一項(xiàng)的主題,并且其中,所述重放模塊還用于響應(yīng)于從所述代碼模塊中的測試位置到所述代碼模塊中的所述第二位置執(zhí)行所述代碼模塊,而將所述代碼模塊恢復(fù)到狀態(tài)檢查點(diǎn)。
示例10包括示例1-9中任一項(xiàng)的主題,其中,基于所述追蹤數(shù)據(jù)來生成所述持續(xù)存儲器寫入的排列包括從可由所述追蹤數(shù)據(jù)定義的持續(xù)存儲器寫入的所有可能排列的集合中隨機(jī)選擇排列。
示例11包括示例1-10中任一項(xiàng)的主題,并且其中,模擬所述電源故障包括在所述排列部分地完成時停止所述排列的重放。
示例12包括示例1-11中任一項(xiàng)的主題,并且其中,所述重放模塊還用于響應(yīng)于所述電源故障的模擬而使用所述平臺模擬器來調(diào)用與所述代碼模塊相關(guān)聯(lián)的恢復(fù)功能;其中,調(diào)用所述測試功能包括響應(yīng)于所述恢復(fù)功能的調(diào)用而調(diào)用所述測試功能。
示例13包括示例1-12中任一項(xiàng)的主題,并且其中,所述重放模塊還用于確定測試功能是否響應(yīng)于所述測試功能的調(diào)用而失?。灰约绊憫?yīng)于確定所述測試功能失敗而報告測試失敗。
示例14包括示例1-13中任一項(xiàng)的主題,并且其中,所述重放模塊還用于確定持續(xù)存儲器寫入的充分排列是否已經(jīng)響應(yīng)于所述測試功能的調(diào)用而被測試;以及響應(yīng)于確定持續(xù)存儲器寫入的充分排列尚未被測試而基于所述追蹤數(shù)據(jù)來生成持續(xù)存儲器寫入的第二排列,其中,所述持續(xù)存儲器寫入的第二排列具有所述模擬計算設(shè)備的所述硬件規(guī)范所允許的并且不同于所述持續(xù)存儲器寫入的排列的排序的排序。
示例15包括示例1-14中任一項(xiàng)的主題,并且其中,確定持續(xù)存儲器寫入的充分排列是否已經(jīng)被測試包括確定具有模擬計算設(shè)備的所述硬件規(guī)范允許的排序的可由所述追蹤數(shù)據(jù)定義的持續(xù)存儲器寫入的所有可能排列是否已經(jīng)被測試。
示例16包括示例1-15中任一項(xiàng)的主題,并且其中,確定持續(xù)存儲器寫入的充分排列是否已經(jīng)被測試包括:確定具有所述模擬計算設(shè)備的所述硬件規(guī)范所允許的排序并且已經(jīng)被測試的可由追蹤數(shù)據(jù)定義的持續(xù)存儲器寫入的所有可能排列的比例是否具有與預(yù)定閾值比例的預(yù)定義關(guān)系。
示例17包括示例1-16中任一項(xiàng)的主題,并且其中,所述重放模塊還用于響應(yīng)于確定持續(xù)存儲器寫入的充分排列已經(jīng)被測試而報告測試成功。
示例18包括用于軟件測試的方法,所述方法包括由計算設(shè)備的平臺模擬器來模擬模擬計算設(shè)備;由所述平臺模擬器來從代碼模塊中的測試位置到所述代碼模塊中的第二位置執(zhí)行所述代碼模塊;在執(zhí)行所述代碼模塊時由所述計算設(shè)備來追蹤所述模擬計算設(shè)備的持續(xù)存儲器狀態(tài),以生成指示所述持續(xù)存儲器狀態(tài)的追蹤數(shù)據(jù);由所述計算設(shè)備基于所述追蹤數(shù)據(jù)來生成持續(xù)存儲器寫入的排列,其中,所述持續(xù)存儲器寫入的排列具有所述模擬計算設(shè)備的硬件規(guī)范所允許的排序;由所述計算設(shè)備來重放所述持續(xù)存儲器寫入的排列;響應(yīng)于重放所述持續(xù)存儲器寫入的排列而由所述計算設(shè)備來模擬電源故障;以及響應(yīng)于模擬所述電源故障而由所述計算設(shè)備使用所述平臺模擬器來調(diào)用與所述代碼模塊相關(guān)聯(lián)的測試功能。
示例19包括示例18的主題,并且其中,追蹤所述持續(xù)存儲器狀態(tài)包括追蹤由所述代碼模塊執(zhí)行的持續(xù)存儲器寫入。
示例20包括示例18和19中任一項(xiàng)的主題,并且其中,追蹤所述持續(xù)存儲器狀態(tài)包括追蹤由所述代碼模塊執(zhí)行的高速緩存行沖洗。
示例21包括示例18-20中任一項(xiàng)的主題,并且其中,追蹤持續(xù)存儲器狀態(tài)包括追蹤由所述代碼模塊執(zhí)行的存儲器柵欄。
示例22包括示例18-21中任一項(xiàng)的主題,并且其中,追蹤持續(xù)存儲器狀態(tài)包括追蹤由所述代碼模塊執(zhí)行的持續(xù)存儲器提交原語。
示例23包括示例18-22中任一項(xiàng)的主題,并且其中,基于所述追蹤數(shù)據(jù)來生成所述持續(xù)存儲器寫入的排列包括選擇由持續(xù)存儲器提交原語定界的所述追蹤數(shù)據(jù)的段;并且生成被限于所述追蹤數(shù)據(jù)的所述段的持續(xù)存儲器寫入的排列。
示例24包括示例18-23中任一項(xiàng)的主題,并且還包括由所述計算設(shè)備使用所述平臺模擬器來生成針對所述代碼模塊中的測試位置的狀態(tài)檢查點(diǎn),其中,所述狀態(tài)檢查點(diǎn)指示所述模擬計算設(shè)備的所述持續(xù)存儲器狀態(tài);其中,重放所述持續(xù)存儲器寫入的排列包括基于所述狀態(tài)檢查點(diǎn)來重放所述持續(xù)存儲器寫入的排列。
示例25包括示例18-24中任一項(xiàng)的主題,并且其中,重放所述持續(xù)存儲器寫入的排列包括根據(jù)所述持續(xù)存儲器寫入的排列來修改所述狀態(tài)檢查點(diǎn)。
示例26包括示例18-25中任一項(xiàng)的主題,還包括響應(yīng)于從所述代碼模塊中的所述測試位置到所述代碼模塊中的所述第二位置執(zhí)行所述代碼模塊,由所述計算設(shè)備將所述代碼模塊恢復(fù)到所述狀態(tài)檢查點(diǎn)。
示例27包括示例18-26中任一項(xiàng)的主題,并且其中,基于所述追蹤數(shù)據(jù)來生成所述持續(xù)存儲器寫入的排列包括從可由所述追蹤數(shù)據(jù)定義的持續(xù)存儲器寫入的所有可能排列的集合中隨機(jī)選擇排列。
示例28包括示例18-27中任一項(xiàng)的主題,并且其中,模擬所述電源故障包括當(dāng)所述排列部分地完成時停止所述排列的重放。
示例29包括示例18-28中任一項(xiàng)的主題,并且還包括響應(yīng)于模擬所述電源故障而由所述計算設(shè)備使用所述平臺模擬器來調(diào)用與所述代碼模塊相關(guān)聯(lián)的恢復(fù)功能;其中,調(diào)用所述測試功能包括響應(yīng)于調(diào)用所述恢復(fù)功能而調(diào)用所述測試功能。
示例30包括示例18-29中任一項(xiàng)的主題,并且還包括響應(yīng)于調(diào)用所述測試功能而由所述計算設(shè)備確定所述測試功能是否失?。灰约绊憫?yīng)于確定所述測試功能失敗而由所述計算設(shè)備報告測試失敗。
示例31包括示例18-30中任一項(xiàng)的主題,并且還包括響應(yīng)于調(diào)用所述測試功能而由所述計算設(shè)備確定持續(xù)存儲器寫入的充分排列是否已經(jīng)被測試;以及響應(yīng)于確定持續(xù)存儲器寫入的充分排列尚未被測試而由所述計算設(shè)備基于所述追蹤數(shù)據(jù)來生成持續(xù)存儲器寫入的第二排列,其中,所述持續(xù)存儲器寫入的第二排列具有所述模擬計算設(shè)備的所述硬件規(guī)范所允許的并且不同于所述持續(xù)存儲器寫入的排列的排序的排序。
示例32包括示例18-31中任一項(xiàng)的主題,并且其中,確定持續(xù)存儲器寫入的充分排列是否已經(jīng)被測試包括確定具有被所述模擬計算設(shè)備的所述硬件規(guī)范所允許的排序的可由所述追蹤數(shù)據(jù)定義的持續(xù)存儲器寫入的所有可能排列是否已經(jīng)被測試。
示例33包括示例18-32中任一項(xiàng)的主題,并且其中,確定持續(xù)存儲器寫入的充分排列是否已經(jīng)被測試包括:確定已經(jīng)被測試的具有所述模擬計算設(shè)備的所述硬件規(guī)范所允許的排序的可由所述追蹤數(shù)據(jù)定義的持續(xù)存儲器寫入的所有可能排列的比例是否具有與預(yù)定閾值比例的預(yù)定義關(guān)系。
示例34包括示例18-33中任一項(xiàng)的主題,并且還包括響應(yīng)于確定持續(xù)存儲器寫入的充分排列已被測試而由所述計算設(shè)備報告測試成功。
示例35包括計算設(shè)備,所述計算設(shè)備包括處理器以及存儲器,所述存儲器具有儲存在其中的多個指令,所述多個指令在被所述處理器執(zhí)行時,使得所述計算設(shè)備執(zhí)行示例18-34中任一項(xiàng)所述的方法。
示例36包括一個或多個包括存儲在其上的多個指令的機(jī)器可讀儲存介質(zhì),所述多個指令響應(yīng)于被執(zhí)行而導(dǎo)致計算設(shè)備執(zhí)行示例18-34中任一項(xiàng)所述的方法。
示例37包括計算設(shè)備,所述計算設(shè)備包括用于執(zhí)行示例18-34中任一項(xiàng)所述的方法的單元。
示例38包括用于軟件測試的計算設(shè)備,所述計算設(shè)備包括用于由所述計算設(shè)備的平臺模擬器來模擬模擬計算設(shè)備的單元;用于由所述平臺模擬器來從代碼模塊中的測試位置到所述代碼模塊中的第二位置執(zhí)行所述代碼模塊的單元;用于在執(zhí)行所述代碼模塊時追蹤所述模擬計算設(shè)備的持續(xù)存儲器狀態(tài),以生成指示所述持續(xù)存儲器狀態(tài)的追蹤數(shù)據(jù)的單元;用于基于所述追蹤數(shù)據(jù)來生成持續(xù)存儲器寫入的排列的單元,其中,所述持續(xù)存儲器寫入的排列具有所述模擬計算設(shè)備的硬件規(guī)范所允許的排序;用于重放所述持續(xù)存儲器寫入的排列的單元;用于響應(yīng)于重放所述持續(xù)存儲器寫入的排列而模擬電源故障的單元;以及用于響應(yīng)于模擬所述電源故障而使用所述平臺模擬器來調(diào)用與所述代碼模塊相關(guān)聯(lián)的測試功能的單元。
示例39包括示例38的主題,并且其中,所述用于追蹤所述持續(xù)存儲器狀態(tài)的單元包括用于追蹤由所述代碼模塊執(zhí)行的持續(xù)存儲器寫入的單元。
示例40包括示例38和39中任一項(xiàng)的主題,并且其中,所述用于追蹤所述持續(xù)存儲器狀態(tài)的單元包括用于追蹤由所述代碼模塊執(zhí)行的高速緩存行沖洗的單元。
示例41包括示例38-40中任一項(xiàng)的主題,并且其中,所述用于追蹤持續(xù)存儲器狀態(tài)的單元包括用于追蹤由所述代碼模塊執(zhí)行的存儲器柵欄的單元。
示例42包括示例38-41中任一項(xiàng)的主題,并且其中,所述用于追蹤持續(xù)存儲器狀態(tài)的單元包括用于追蹤由所述代碼模塊執(zhí)行的持續(xù)存儲器提交原語的單元。
示例43包括示例38-42中任一項(xiàng)的主題,并且其中,所述用于基于所述追蹤數(shù)據(jù)來生成所述持續(xù)存儲器寫入的排列的單元包括用于選擇由持續(xù)存儲器提交原語定界的所述追蹤數(shù)據(jù)的段的單元;以及用于生成被限于所述追蹤數(shù)據(jù)的所述段的持續(xù)存儲器寫入的排列的單元。
示例44包括示例38-43中任一項(xiàng)的主題,并且還包括用于使用所述平臺模擬器來生成針對所述代碼模塊中所述測試位置的狀態(tài)檢查點(diǎn)的單元,其中,所述狀態(tài)檢查點(diǎn)指示所述模擬計算設(shè)備的所述持續(xù)存儲器狀態(tài);其中,所述用于重放所述持續(xù)存儲器寫入的排列的單元包括用于基于所述狀態(tài)檢查點(diǎn)來重放所述持續(xù)存儲器寫入的排列的單元。
示例45包括示例38-44中任一項(xiàng)的主題,并且其中,所述用于重放持續(xù)存儲器寫入的排列的單元包括用于根據(jù)所述持續(xù)存儲器寫入的排列來修改所述狀態(tài)檢查點(diǎn)的單元。
示例46包括示例38-45中任一項(xiàng)的主題,并且還包括用于響應(yīng)于從所述代碼模塊中的測試位置到所述代碼模塊中的第二位置執(zhí)行所述代碼模塊而將所述代碼模塊恢復(fù)到所述狀態(tài)檢查點(diǎn)的單元。
示例47包括示例38-46中任一項(xiàng)的主題,并且其中,所述用于基于所述追蹤數(shù)據(jù)來生成所述持續(xù)存儲器寫入的排列的單元包括用于從可由所述追蹤數(shù)據(jù)定義的持續(xù)存儲器寫入的所有可能排列的集合中隨機(jī)選擇排列的單元。
示例48包括示例38-47中任一項(xiàng)的主題,并且其中,所述用于模擬所述電源故障的單元包括用于在所述排列部分地完成時停止所述排列的重放的單元。
示例49包括示例38-48中任一項(xiàng)的主題,并且還包括用于響應(yīng)于模擬所述電源故障而使用所述平臺模擬器來調(diào)用與所述代碼模塊相關(guān)聯(lián)的恢復(fù)功能的單元;其中,所述用于調(diào)用所述測試功能的單元包括用于響應(yīng)于調(diào)用所述恢復(fù)功能而調(diào)用所述測試功能的單元。
示例50包括示例38-49中任一項(xiàng)的主題,還包括用于響應(yīng)于調(diào)用所述測試功能而確定所述測試功能是否失敗的單元;以及用于響應(yīng)于確定所述測試功能失敗而報告測試失敗的單元。
示例51包括示例38-50中任一項(xiàng)的主題,并且還包括用于確定持續(xù)存儲器寫入的充分排列是否已經(jīng)響應(yīng)于調(diào)用所述測試功能而被測試的單元;以及用于響應(yīng)于確定持續(xù)存儲器寫入的充分排列尚未被測試而基于所述追蹤數(shù)據(jù)來生成持續(xù)存儲器寫入的第二排列的單元,其中,所述持續(xù)存儲器寫入的第二排列具有所述模擬計算設(shè)備的所述硬件規(guī)范所允許的并且不同于所述持續(xù)存儲器寫入的排列的排序的排序。
示例52包括示例38-51中任一項(xiàng)的主題,并且其中,所述用于確定持續(xù)存儲器寫入的充分排列是否已經(jīng)被測試的單元包括用于確定具有所述模擬計算設(shè)備的所述硬件規(guī)范所允許的排序的可由所述追蹤數(shù)據(jù)定義的持續(xù)存儲器寫入的所有可能排列是否已經(jīng)被測試的單元。
示例53包括示例38-52中任一項(xiàng)的主題,并且其中,所述用于確定持續(xù)存儲器寫入的充分排列是否已經(jīng)被測試的單元包括用于確定已經(jīng)被測試的具有所述模擬計算設(shè)備的所述硬件規(guī)范所允許的排序的可由所述追蹤數(shù)據(jù)定義的持續(xù)存儲器寫入的所有可能排列的比例是否具有與預(yù)定閾值比例的預(yù)定義關(guān)系。
示例54包括示例38-53中任一項(xiàng)的主題,并且還包括用于響應(yīng)于確定持續(xù)存儲器寫入的充分排列已經(jīng)被測試而報告測試成功的單元。