用于在持续存储器系统中的应用验证的技术的制作方法

文档序号:11779703阅读:302来源:国知局
用于在持续存储器系统中的应用验证的技术的制作方法与工艺

相关申请的交叉引用

本申请要求2015年3月27日提交的题为“technologiesforapplicationvalidationinpersistentmemorysystems”的美国实用专利申请序列号14/670,965的优先权。



技术实现要素:

一些计算系统包括持续存储器,该持续存储器可以是可字节寻址的高性能的非易失性存储器。持续存储器可以提供与传统的易失性随机存取存储器(ram)相当的性能,同时还提供数据持久性。然而,持续存储器可能对应用开发人员提出额外的挑战。具体地,应用开发人员可能必须保证在任何给定的时间,持续存储器中的数据是一致的。否则,诸如硬件故障或电源故障之类的意外的故障可能会导致数据损坏。

诸如编译器和调试器之类的传统软件开发工具可以被用于校正错误,并且以另外的方式使用持续存储器来验证应用的正确性。另外,用于测试使用持续存储器的应用的基于管理程序的框架在philiplantz等人,yat:avalidationframeworkforpersistentmemorysoftware,usenixannualtechnicalconferenceat433(2014)中有所描述。

附图说明

本文描述的概念通过示例而不通过附图中的限制的方式进行了说明。为了说明的简单和清楚,附图中例示的元件不一定按比例绘制。在适当的情况下,图中已经重复了附图标记,以指示对应或相似的元件。

图1是用于具有持续存储器的应用测试的计算设备的至少一个实施例的简化框图;

图2是可以由图1的计算设备建立的至少一个实施例环境的简化框图;

图3是用于可以由图1和图2的计算设备执行的具有持续存储器的应用测试的方法的至少一个实施例的简化流程图;以及

图4是可以使用图3的方法来测试的应用和相关联的测试功能的至少一个实施例的伪代码。

具体实施方式

虽然本公开内容的概念易于受到各种修改和替代形式的影响,但是其具体实施例已经通过附图中的示例示出并且将在本文中进行详细描述。然而,应当理解,并不意图将本公开内容的概念限制为所公开的特定形式,相反,本发明意图涵盖与本公开内容和所附权利要求一致的所有修改、等同和替代方案。

说明书中对“一个实施例”、“实施例”、“说明性实施例”等的引用指出所描述的实施例可以包括特定的特征、结构或特性,但是每个实施例可以或可以不一定包括特定的特征、结构或特性。此外,这样的短语不一定指代相同的实施例。另外,当结合实施例描述特定的特征、结构或特性时,认为在本领域技术人员的知识范围内,结合其它实施例来实现这些特征、结构或特性,无论是否明确描述。另外,应当理解,以“a、b和c中的至少一个”形式包含在列表中的项可以是(a);(b);(c);(a和b);(a和c);(b和c);或者(a、b和c)。类似地,以“a、b或c中的至少一个”的形式列出的项可以是(a);(b);(c);(a和b);(a和c);(b和c);或者(a、b和c)。

在一些情况下,可以在硬件、固件、软件或它们的任何组合中实施所公开的实施例。所公开的实施例还可以被实施为由一个或多个暂时性或非暂时性机器可读(例如,计算机可读)储存介质承载或者储存在一个或多个暂时性或非暂时性机器可读(例如,计算机可读)储存介质上的指令,该指令可由一个或多个处理器读取和执行。机器可读储存介质可以被具体化为用于以机器可读的形式(例如,易失性或非易失性存储器、介质盘或其它介质设备)储存或发送信息的任何储存设备、机构或其它物理结构。

在附图中,可以以具体的布置和/或排序示出一些结构或方法特征。然而,应当理解,这些具体的布置和/或排序可能不被需要。相反,在一些实施例中,这些特征可以以与在说明性图形中示出的不同的方式和/或顺序布置。另外,在特定图形中包括结构或方法特征并不意味着指在所有实施例中都需要这些特征,并且在一些实施例中,这些特征可以不被包括或者可以与其它特征组合。

现在参考图1,在一个实施例中,用于测试持续存储器应用的计算设备100配置有全平台模拟器和用于测试的应用。平台模拟器模拟具有持续存储器的模拟计算设备102的执行。具体地,平台模拟器模拟模拟计算设备102的处理器寄存器、易失性高速缓存、易失性存储器和持续存储器的内容。在使用中,如下面更详细描述的那样,计算设备100在应用(例如,要测试的功能)中的测试位置处创建检查点,然后使用平台模拟器模拟执行应用直到结束位置。在模拟执行期间,计算设备100追踪由应用执行的持续存储器写入。在完成模拟执行之后,计算设备100可以生成由应用执行的持续存储器写入的许多不同排列并且例如通过执行部分但不是全部追踪的持续存储器写入来模拟电源故障。对于每个被测试的排列,计算设备100使用平台模拟器来执行用户供应的测试功能,以验证模拟的电源故障之后的模拟持续存储器的一致性。计算设备100可以向用户报告任何测试失败。通过提供用于测试持续存储器一致性的自动化框架,计算设备100可以使用持续存储器来提高应用的质量。此外,计算设备100可以使用用户级和/或应用级工具来执行应用测试,而不需要对操作系统或管理程序的修改。另外,在说明性实施例中,计算设备100具有与模拟计算设备102相同的架构;例如,计算设备100包括持续存储器。然而,应当理解,在一些实施例中,计算设备100可以具有与模拟的计算设备102不同的架构和/或可以不包括持续存储器。

计算设备100可以被具体化为能够执行本文描述的功能的任何类型的计算设备,该计算设备包括但不限于计算机、工作站、多处理器系统、服务器、机架式服务器、刀片服务器、膝上型计算机、笔记本计算机、网络装置、web装置、分布式计算系统、基于处理器的系统和/或消费电子设备。如图1所示,计算设备100包括处理器120、输入/输出子系统122、存储器124、数据储存设备130和通信电路132。当然,计算设备100可以包括其它或附加组件(诸如在其它实施例中通常在服务器设备(例如,各种输入/输出设备)中发现的那些)。另外,在一些实施例中,一个或多个说明性组件可以并入或以其他方式形成另一组件的一部分。例如,在一些实施例中,存储器124或其部分可以并入处理器120中。

处理器120可以被具体化为能够执行本文所描述的功能的任何类型的处理器。处理器120可以被具体化为单核或多核处理器、数字信号处理器、微控制器或其它处理器或处理/控制电路。类似地,存储器124可以被具体化为能够执行本文所描述的功能的任何类型的易失性或非易失性存储器或数据储存器。在操作中,存储器124可以储存在计算设备100的操作期间使用的各种数据和软件(诸如操作系统、应用、程序、库和驱动器)。存储器124还包括易失性存储器126和持续存储器128。易失性存储器126可以被具体化为传统ram,这意味着当从计算设备100和/或易失性存储器126移除电力时,包含在易失性存储器126中的任何数据都会丢失。持续存储器128可以被具体化为任何字节可寻址的高性能的非易失性存储器。例如,持续存储器128可以被具体化为电池支持的ram、相变存储器、基于忆阻器的存储器或其它类型的持续存储器。持续存储器128可以包括类似于易失性存储器126的程序和数据;然而,在从计算设备100和/或持续存储器128移除电力的至少一段时间内,持续存储器128的内容被保留。

存储器124经由i/o子系统122通信地耦合到处理器120,i/o子系统122可被具体化为电路和/或组件,以促进与计算设备100的处理器120、存储器124和其它组件的输入/输出操作。例如,i/o子系统122可以被具体化为或者另外包括存储器控制器中心、输入/输出控制中心、固件设备、通信链路(即,点到点链路、总线链路、电线、电缆、光导、印刷电路板迹线等)和/或其它组件和子系统,以促进输入/输出操作。在一些实施例中,i/o子系统122可以形成片上系统(soc)的一部分,并且与计算设备100的处理器120、存储器124和其它组件一起合并到单个集成电路芯片。

数据储存设备130可以被具体化为被配置用于数据的短期或长期储存的任意类型的设备或多个设备(诸如存储设备和电路、存储卡、硬盘驱动器、固态驱动器、或其它数据储存设备)。访问数据存储设备130可能比访问持续存储器128慢得多。另外,数据储存设备130可以通过块设备、文件系统、或其它非字节可寻址接口来访问。

计算设备100的通信电路132可以被具体化为能够通过计算网络实现计算设备100与其它远程设备之间的通信的任何通信电路、设备或它们的集合。通信电路132可以被配置为使用任何一种或多种通信技术(例如,有线或无线通信、以太网、wimax、infiniband等)以及相关联的协议(例如,tcp、udp、iwarp、rdma等)来实现此类通信。

在一些实施例中,计算设备100还可以包括一个或多个外围设备134。外围设备134可以包括任意数量的附加输入/输出设备、接口设备和/或其它外围设备。例如,在一些实施例中,外围设备134可以包括显示器、触摸屏、图形电路、键盘、鼠标、扬声器系统和/或其它输入/输出设备、接口设备和/或外围设备。

如图1所示,模拟计算设备102可以包括模拟的硬件组件,该模拟的硬件组件包括模拟处理器120′、模拟i/o子系统122′、模拟存储器124′(包括模拟易失性存储器126′和模拟持续存储器128′)、模拟数据储存设备130′、模拟通信电路132′和模拟外围设备134′。模拟计算设备102的那些模拟的组件可以类似于计算设备100的对应的组件,其描述适用于模拟计算设备102的对应的模拟组件,并且在本文中不重复以便不使本公开内容模糊。

现在参考图2,在说明性实施例中,计算设备100建立应用202、测试功能206、平台模拟器模块208、捕获模块210和重放模块212。环境200的各种模块可以被具体化为硬件、固件、软件或它们的组合。例如,环境200的各种模块、逻辑和其它组件可以形成计算设备100的处理器120或其它硬件组件的一部分,或以其他方式由计算设备100的处理器120或其它硬件组件建立。这样,在一些实施例中,环境200的任何一个或多个模块可被具体化为电气设备的电路或集合(例如,捕获电路、重放电路等)。

应用202可以被具体化为操纵储存在持续存储器中的数据的任何应用、模块、功能、子程序或其它代码或代码模块。应用202可以被具体化为可由通过平台模拟器模块208模拟的计算设备执行的机器可执行代码、字节码、中间代码、汇编代码、源代码或任何其他代码。应用202可以被具体化为用户级和/或内核级代码。在一些实施例中,应用202还可以由计算设备100本机地执行。应用202可以包括恢复功能204。恢复功能204可以被具体化为任何应用、模块、功能、子程序或其它代码,它们可能在应用202的断电、崩溃或其它故障之后被应用202执行,以便修复或以其他方式恢复储存在持续存储器128中的数据。例如,数据库应用202的恢复功能204可以尝试在电源故障后修复数据表之间的数据表和关联。

测试功能206可以具体化为可以被执行以验证通过应用202生成或以其他方式操纵的储存在持续存储器中的数据的正确性的任何用户定义的功能、子程序、模块、应用或其它代码。测试功能206可以是独立模块,或者在一些实施例中可以并入到应用202中。例如,用于数据库应用202的测试功能206可以被具体化为完整性检验器,该完整性检验器验证数据表、数据行、表与行之间的关系、和/或储存在持续存储器128中的其它数据的正确性。

平台模拟器模块208被配置为模拟诸如模拟计算设备102的整个计算平台的执行,包括处理器状态(例如,寄存器状态和易失性高速缓存状态)、存储器状态(易失性和持续)、数据储存状态以及与模拟计算设备102相关联的其它数据和/或设备的模拟。平台模拟器模块208可以例如模拟在模拟计算设备102上启动操作系统和/或管理程序,然后可以模拟该操作系统内的应用202的执行。平台模拟器模块208可以生成模拟计算设备102的状态的检查点,暂停模拟计算设备102的执行,基于检查点重新启动模拟计算设备102的执行,和/或执行修改模拟计算设备102的状态的其它操作。平台模拟器模块208可以被具体化为例如模拟技术。

捕获模块210被配置为使用平台模拟器模块208来生成针对应用202内的测试位置的状态检查点。捕获模块210还被配置为使用平台模拟器模块208从测试位置到应用202中的第二位置执行应用202,并且在模拟执行期间追踪应用202的持续存储器状态。捕获模块210可以生成指示在模拟执行期间由应用202执行的持续存储器写入、存储器栅栏、高速缓存行冲洗(cachelineflushes)、持续存储器提交或其它持续存储器操作的追踪数据。

重放模块212被配置为使用由捕获模块210记录的追踪数据来生成由应用202执行的存储器写入的许多排列。每个排列描述了模拟计算设备102的硬件规范所允许的所追踪的持续存储器写入的可能排序。重放模块212被配置为从保存的检查点重放持续存储器写入的每个排列,模拟电源故障,然后使用平台模拟器模块208调用测试功能206。重放模块212可以报告测试功能206的结果。重放模块212被配置为继续测试持续存储器写入的排列,直到观察到失败或者直到充分排列已被成功测试以验证应用202。

现在参考图3,在使用中,计算设备100可以执行用于应用测试的方法300。方法300在框302中开始,其中,计算设备100在平台模拟器中执行应用202。平台模拟器还可以执行支持应用202的执行所需的任何操作系统或其它代码。平台模拟器在应用202的执行期间模拟模拟计算设备102的状态(包括模拟处理器120′寄存器或高速缓存、模拟易失性存储器126′和模拟持续存储器128′的内容)。在说明性实施例中,平台模拟器模拟具有与计算设备100相同架构的模拟计算设备102;然而,在其它实施例中,平台模拟器可以模拟具有不同架构的计算设备。计算设备100可以继续在平台模拟器中执行应用202,直到到达应用202内的测试位置。测试位置可以是应用202内的任何用户定义的位置或断点(诸如功能、模块、或其它要测试的代码段的开头)。在框304中,计算设备100使用平台模拟器来在测试位置处创建检查点。当执行到达测试位置时,检查点将模拟计算设备102的硬件和软件状态记录在平台模拟器内,并且可以包括或以其他方式表示模拟处理器120′寄存器和高速缓存、模拟易失性存储器126′和/或模拟持续存储器128′的内容。

在框306中,计算设备100在平台模拟器中从测试位置开始直到应用202中的结束位置执行应用202。类似于测试位置,结束位置可以是任何用户定义的应用202内的位置或断点(诸如要测试的功能、模块或其它代码段的结尾)。在到达结束位置之后,平台模拟器可以暂停应用202的执行。在模拟期间,计算设备100追踪应用202的执行。在执行期间生成的追踪数据可用于重建对模拟计算设备102的模拟持续存储器128′的修改,包括在模拟执行期间的任何特定时间的易失性高速缓存的状态和/或模拟持续存储器128′的状态。

在一些实施例中,在框308中,计算设备100追踪被执行的持续存储器写入、高速缓存行冲洗和存储器栅栏。持续存储器写入可以包括导致将值写入到模拟持续存储器128′的任何储存指令或其它指令。当然,对于具有回写高速缓存的模拟计算设备102,所储存的数据可能不会立即到达模拟持续存储器128′。因此,在一些实施例中,储存指令可以将数据放置在模拟处理器120′高速缓存中,并将相关联的高速缓存行标记为脏的。高速缓存行冲洗可以被具体化为使得模拟处理器120′将模拟的脏的高速缓存行的内容写到模拟持续存储器128′的指令或处理器原语。高速缓存行冲洗可以被具体化为例如clflush指令、clflushopt指令或clwb(高速缓存行写回)指令。存储器栅栏可以被具体化为强制执行对模拟持续存储器128′的存储器写入的排序的指令或处理器原语。例如,模拟处理器120′可以保证在以程序顺序发生在存储器栅栏之前的持续存储器储存(或高速缓存行冲洗)在以程序顺序发生在存储器栅栏之后的任何持续存储器储存之前变得全局可见。存储器栅栏可以被具体化为例如sfence指令或mfence指令。

在一些实施例中,在框310中,计算设备100追踪被执行的持续存储器提交原语。持续存储器提交原语可以被具体化为使得持续存储器128已接受的数据变得持久(即变得耐久)的指令或其它处理器原语。例如,即使在将数据从处理器高速缓存写回到持续存储器128之后,该数据也可以位于计算设备100的存储控制器、持续存储器模块、或其他组件中的一个或多个高速缓存或其它易失性存储器结构中。执行持续存储器提交原语可能导致这样的数据被提交到持续存储器128,并且因此在任何电源故障之后被保留。持续存储器提交原语可以被具体化为例如pcommit指令。

在框312中,计算设备100确定从测试位置到结束位置的应用202的被追踪的执行的下一段。计算设备100可以基于持续存储器提交原语来分割追踪数据。在每个持续存储器提交原语之后,模拟持续存储器128′的内容是可确定的,因为所有先前的持续存储器写入都被保证将被提交。因此,追踪数据可以被分割成持续存储器提交原语之间的段,并且每个段都可以被独立地分析。分割追踪数据可能会大大减少持久写入的潜在排列的数量,从而可能减少应用确认所需的时间。当然,在一些实施例中,计算设备100可以将追踪数据分析为单个段。

在框314中,计算设备100将模拟计算设备102的状态恢复到当前段的开头。换而言之,模拟计算设备102的状态被重置为其在当前段开始时的状态。模拟计算设备102的恢复的状态可以基于在框304中记录的测试位置处所保存的检查点。模拟计算设备102的状态可以包括模拟处理器120′寄存器或高速缓存、模拟易失性存储器126′和/或在应用202的执行期间的模拟持续存储器128′的内容。

在框316中,计算设备100在当前段中的应用202的模拟执行期间生成由计算设备100追踪的持续存储器写入的排列。为了生成排列,计算设备100可以重新布置所追踪的持久写入被提交到模拟持续存储器128′的顺序。计算设备100仅选择模拟计算设备102的硬件规范所允许的排列。例如,在存储器栅栏和/或高速缓存冲洗之前发生的持续存储器写入可能不被重新排序以在存储器栅栏和/或高速缓存冲洗之后发生。作为另一个示例,到相同存储器地址的写入可能无法重新排序。计算设备100可以按顺序选择存储器写入的下一个可能排列,例如,如果可能排列的总数低于预定义阈值(例如,250个排列)。在一些实施例中,在框318中,计算设备100可以从搜索空间中随机选择包括模拟计算设备102所允许的存储器写入的所有可能排列的排列。如下所述,可能排列的数量可以是非常大的,并且计算设备100可以验证排列的随机抽样而不是所有可能的排列。

在框320中,计算设备100重放所选择的持续存储器写入的排列。计算设备100可以从对应于测试位置的检查点开始调整应用202的保存的状态。计算设备100可以通过应用记录在追踪数据中的持续存储器写入,使用所选的排列的写排序来调整模拟计算设备102的模拟处理器120′寄存器和易失性高速缓存、模拟易失性存储器126′和/或模拟持续存储器128′的内容。在说明性实施例中,计算设备100可以通过调整状态数据而不在平台模拟器中执行应用202来重放排列。附加地或替代地,在一些实施例中,计算设备100可以在平台模拟器中从保存的检查点开始执行应用202。在框322中,计算设备100模拟电源故障。计算设备100例如可以在向模拟持续存储器128′提交所有被追踪的持久写入之前停止重放所选择的排列。在模拟电源故障之后,可以提交一些但不是全部的持续存储器写入,从而模拟计算设备102的模拟持续存储器128′可能处于不一致的状态。

在框324中,计算设备100使用平台模拟器来调用测试功能206。平台模拟器使用由模拟断电产生的修改的系统状态来开始执行测试功能206。如上所述,测试功能206可以被具体化为对与应用202相关联的模拟持续存储器128′执行一致性检查的任何用户定义的功能、子程序、模块、应用或其它用户指定的代码。例如,测试功能206可以检查模拟持续存储器128′中的数据结构(例如,通过遵循持续存储器指针,检查数据库表关系等)。在执行后,测试功能206可以指示一致性检查是否成功。在一些实施例中,模拟持续存储器128′中的不一致可能导致测试功能206无法执行到完成(例如,通过导致崩溃、无限循环或其它错误情况)。在这些实施例中,计算设备100可以将无法执行到完成解释为不一致性测试的失败。在一些实施例中,在框326中,计算设备100可以在执行测试功能206之前在平台模拟器中调用恢复功能204。恢复功能204可以尝试修复模拟持续存储器128′中的任何不一致或其它错误。恢复功能204可以是应用202的标准组件。因此,在恢复功能204之后执行测试功能206可以测试在电源故障之后应用202是否可以从持续存储器128的状态成功地恢复。

在框328中,计算设备100确定测试功能206是否失败。如果没有,则方法300向前分支到块332,如下所述。如果测试功能206失败,则方法300分支到框330,其中计算设备100报告失败。计算设备100例如可以向用户显示通知,生成报告或者提供有关失败的信息。在一些实施例中,计算设备100可以报告关于导致测试失败的持续存储器写入的特定排列的数据。用户可以使用该数据来重构失败(例如使用调试器)。在报告测试失败之后,方法300可以进行到框332以继续测试附加的排列。

返回参考框328,如果测试功能206没有失败,则方法300分支到框332。在框332中,计算设备100确定持续存储器写入的充分排列是否已经被测试。计算设备100可以使用任何适当的标准来确定何时已经测试了充分排列。例如,在一些实施例中,计算设备100可以确定模拟计算设备102的硬件规范所允许的所有可能排列是否已经被测试。在一些实施例中,在框334中,计算设备100可以确定搜索空间的测试覆盖是否充分,换言之,是否充分大比例的可能排列已经被测试。计算设备100可以例如确定阈值数量或阈值百分比的可能排列是否已经被测试。在一些实施例中,计算设备100可以基于已经测试的可能排列的比例来统计地确定已经发现应用202中的所有错误的可能性。计算设备100可以基于该可能性来确定充分排列是否已经被测试。

在框336中,计算设备100检查充分排列是否已经被测试。如果没有,则方法300循环回到框314以将模拟计算设备102恢复到当前段的开头,并生成用于测试的下一个排列。如果已经测试了充分排列,则方法300前进到框338。

在框338中,计算设备100确定附加段是否仍然被测试。例如,计算设备100可以确定直到应用202的结束位置的所有分段是否已被测试。如果附加段保留,则方法300循环回到框312,其中计算设备100确定用于测试的下一段和持续存储器写入的集合。如果没有附加段剩余,则方法300前进到框340,其中计算设备100报告测试成功。计算设备100可以例如向用户显示通知,生成报告或者以其他方式提供关于成功确认的信息。在报告确认之后,方法300完成。方法300可以被重新执行以重新测试应用202或测试另一个应用202。

现在参考图4,伪代码400例示可以使用方法300来测试的应用202的一部分的一个潜在实施例。语句402例示了模拟持续存储器128′的初始状态。如图所示,模拟持续存储器128′包括三个变量a、b和c,每个分别存储值10、11和12。语句428例示了测试功能206的一个潜在实施例。如图所示,在说明性实施例中,如果a小于b且b小于c,则测试功能206成功。语句404至426表示要测试的应用202的段。语句404对应于测试位置(即,测试开始时保存的检查点的位置),并且语句426对应于结束位置。

在语句404中,将新值写入模拟持续存储器128′中的变量a。在执行语句404之后,a的新值可以被储存在模拟处理器120′高速缓存或其它易失性存储器中。在语句406中,执行存储器栅栏。存储器栅栏在写入语句404与对存储器栅栏之后发生的模拟持续存储器128′的任何其它写入(例如,下面描述的语句414、418)之间强制执行排序。在语句408中,执行高速缓存冲洗。高速缓存冲洗使得a的新值被从模拟处理器120′的高速缓存写入到模拟持续存储器128′。在执行高速缓存冲洗之后,a的新值可以被模拟持续存储器128′所接受,但可能还不持久。在语句410中,执行存储器栅栏。存储器栅栏可以在语句408的高速缓存冲洗与任何其它高速缓存冲洗之间强制执行排序。在语句412中,执行持续存储器提交原语。持续存储器提交原语使得模拟持续存储器128′接受的a的新值变得持久。因此,仅在执行语句412之后,a的新值在模拟电源故障后可能可用。如上所述,伪代码400可以由持续存储器提交原语分割。因此,在测试期间,可以分开地分析语句404至412。因为这些语句只包含单个持续存储器写入,所以只能对持续存储器写入的一个排列进行测试。对于该排列,语句428评估为真(即,5<11&&11<12评估为真)。因此,包括语句404到412的段可以被成功地确认。

在语句414中,在模拟持续存储器128′中将新值写入变量b。在执行语句414之后,b的新值可以被储存在模拟处理器120′高速缓存或其它易失性存储器中。在语句416中,将值写入到模拟易失性存储器126′。由于在电源故障之后易失性存储器的内容丢失,所以计算设备100可能不会在语句416中追踪到模拟易失性存储器126′的储存。在语句418中,新值被写入到模拟持续存储器128′中的变量c。在执行语句418之后,c的新值可以被储存在模拟处理器120′高速缓存或其它易失性存储器中。在语句420中,执行存储器栅栏。存储器栅栏在在语句414、418中的写入与对存储器栅栏之后发生的模拟持续存储器128′的任何其它写入之间强制执行排序。请注意,语句420的存储器栅栏不强制在语句414、418的写入之间的排序。在语句422中,执行高速缓存冲洗。高速缓存冲洗使得b和c的新值被从模拟处理器120′高速缓存写入到模拟持续存储器128′。在执行高速缓存冲洗之后,b和c的新值可以被模拟持续存储器128′接受,但可能还不持久。在语句424中,执行存储器栅栏。存储器栅栏可以在语句422的高速缓存冲洗与任何其它高速缓存冲洗之间强制执行排序。在语句426中,执行持续存储器提交原语。持续存储器提交原语使得被模拟持续存储器128′接受的b和c的新值变得持久。因此,只有在执行语句412之后,在模拟电源故障之后,b和c两者的新值可能可用。如上所述,语句426的持续存储器提交原语不会在语句414,418的写入之间强制执行排序。

在测试期间,语句414至426可以被分析为独立的段。这些语句可能具有持续写入的两种可能排列:语句414可以在语句418之前(即,以程序顺序)提交,或者语句418可以在语句414之前被提交(即,乱序)。在测试期间,计算设备100可以用在语句414之前提交的语句418重放排列。当语句418的写入已被提交到模拟持续存储器128′但语句414的写入尚未提交给模拟持续存储器128′时,计算设备100可以模拟电源故障。在这种情况下,语句428评估为假(即,5<11且11<7评估为假),因此语句414至426可能未被确认。在说明性实施例中,确认错误可以通过例如修改应用202来进行校正,以在语句414、418之间插入存储器栅栏、高速缓存行冲洗和/或持续存储器提交原语,从而强制执行适当的排序。

示例

以下提供本文公开的技术的说明性示例。技术的实施例可以包括以下描述的示例中的任意一个或多个、以及任意组合。

示例1包括用于软件测试的计算设备,所述计算设备包括捕获模块,所述捕获模块用于:(i)使用所述计算设备的平台模拟器来从代码模块中的测试位置到所述代码模块中的第二位置执行所述代码模块并且(ii)在执行所述代码模块期间追踪由所述平台模拟器模拟的模拟计算设备的持续存储器状态,以生成指示所述持续存储器状态的追踪数据;以及重放模块,所述重放模块用于(i)基于所述追踪数据来生成持续存储器写入的排列,其中,所述持续存储器写入的排列具有所述模拟计算设备的硬件规范所允许的排序,(ii)重放所述持续存储器写入的排列,(iii)响应于所述持续存储器写入的排列的重放而模拟电源故障,以及(iv)响应于所述电源故障的模拟,而使用所述平台模拟器来调用与所述代码模块相关联的测试功能。

示例2包括示例1的主题,并且其中,追踪所述持续存储器状态包括追踪由所述代码模块执行的持续存储器写入。

示例3包括示例1和2中任一项的主题,并且其中,追踪所述持续存储器状态包括追踪由所述代码模块执行的高速缓存行冲洗。

示例4包括示例1-3中任一项的主题,并且其中,追踪所述持续存储器状态包括追踪由所述代码模块执行的存储器栅栏。

示例5包括示例1-4中任一项的主题,并且其中,追踪所述持续存储器状态包括追踪由所述代码模块执行的持续存储器提交原语。

示例6包括示例1-5中任一项的主题,并且其中,基于所述追踪数据来生成所述持续存储器写入的排列包括:选择由持续存储器提交原语定界的所述追踪数据的段;以及生成被限于所述追踪数据的所述段的持续存储器写入的排列。

示例7包括示例1-6中任一项的主题,并且其中,所述捕获模块还用于使用所述平台模拟器来生成针对所述代码模块中的所述测试位置的状态检查点,其中,所述状态检查点指示所述模拟计算设备的所述持续存储器状态;并且重放所述持续存储器写入的排列包括基于所述状态检查点来重放所述持续存储器写入的排列。

示例8包括示例1-7中任一项的主题,并且其中,重放所述持续存储器写入的排列包括根据所述持续存储器写入的排列来修改所述状态检查点。

示例9包括示例1-8中任一项的主题,并且其中,所述重放模块还用于响应于从所述代码模块中的测试位置到所述代码模块中的所述第二位置执行所述代码模块,而将所述代码模块恢复到状态检查点。

示例10包括示例1-9中任一项的主题,其中,基于所述追踪数据来生成所述持续存储器写入的排列包括从可由所述追踪数据定义的持续存储器写入的所有可能排列的集合中随机选择排列。

示例11包括示例1-10中任一项的主题,并且其中,模拟所述电源故障包括在所述排列部分地完成时停止所述排列的重放。

示例12包括示例1-11中任一项的主题,并且其中,所述重放模块还用于响应于所述电源故障的模拟而使用所述平台模拟器来调用与所述代码模块相关联的恢复功能;其中,调用所述测试功能包括响应于所述恢复功能的调用而调用所述测试功能。

示例13包括示例1-12中任一项的主题,并且其中,所述重放模块还用于确定测试功能是否响应于所述测试功能的调用而失败;以及响应于确定所述测试功能失败而报告测试失败。

示例14包括示例1-13中任一项的主题,并且其中,所述重放模块还用于确定持续存储器写入的充分排列是否已经响应于所述测试功能的调用而被测试;以及响应于确定持续存储器写入的充分排列尚未被测试而基于所述追踪数据来生成持续存储器写入的第二排列,其中,所述持续存储器写入的第二排列具有所述模拟计算设备的所述硬件规范所允许的并且不同于所述持续存储器写入的排列的排序的排序。

示例15包括示例1-14中任一项的主题,并且其中,确定持续存储器写入的充分排列是否已经被测试包括确定具有模拟计算设备的所述硬件规范允许的排序的可由所述追踪数据定义的持续存储器写入的所有可能排列是否已经被测试。

示例16包括示例1-15中任一项的主题,并且其中,确定持续存储器写入的充分排列是否已经被测试包括:确定具有所述模拟计算设备的所述硬件规范所允许的排序并且已经被测试的可由追踪数据定义的持续存储器写入的所有可能排列的比例是否具有与预定阈值比例的预定义关系。

示例17包括示例1-16中任一项的主题,并且其中,所述重放模块还用于响应于确定持续存储器写入的充分排列已经被测试而报告测试成功。

示例18包括用于软件测试的方法,所述方法包括由计算设备的平台模拟器来模拟模拟计算设备;由所述平台模拟器来从代码模块中的测试位置到所述代码模块中的第二位置执行所述代码模块;在执行所述代码模块时由所述计算设备来追踪所述模拟计算设备的持续存储器状态,以生成指示所述持续存储器状态的追踪数据;由所述计算设备基于所述追踪数据来生成持续存储器写入的排列,其中,所述持续存储器写入的排列具有所述模拟计算设备的硬件规范所允许的排序;由所述计算设备来重放所述持续存储器写入的排列;响应于重放所述持续存储器写入的排列而由所述计算设备来模拟电源故障;以及响应于模拟所述电源故障而由所述计算设备使用所述平台模拟器来调用与所述代码模块相关联的测试功能。

示例19包括示例18的主题,并且其中,追踪所述持续存储器状态包括追踪由所述代码模块执行的持续存储器写入。

示例20包括示例18和19中任一项的主题,并且其中,追踪所述持续存储器状态包括追踪由所述代码模块执行的高速缓存行冲洗。

示例21包括示例18-20中任一项的主题,并且其中,追踪持续存储器状态包括追踪由所述代码模块执行的存储器栅栏。

示例22包括示例18-21中任一项的主题,并且其中,追踪持续存储器状态包括追踪由所述代码模块执行的持续存储器提交原语。

示例23包括示例18-22中任一项的主题,并且其中,基于所述追踪数据来生成所述持续存储器写入的排列包括选择由持续存储器提交原语定界的所述追踪数据的段;并且生成被限于所述追踪数据的所述段的持续存储器写入的排列。

示例24包括示例18-23中任一项的主题,并且还包括由所述计算设备使用所述平台模拟器来生成针对所述代码模块中的测试位置的状态检查点,其中,所述状态检查点指示所述模拟计算设备的所述持续存储器状态;其中,重放所述持续存储器写入的排列包括基于所述状态检查点来重放所述持续存储器写入的排列。

示例25包括示例18-24中任一项的主题,并且其中,重放所述持续存储器写入的排列包括根据所述持续存储器写入的排列来修改所述状态检查点。

示例26包括示例18-25中任一项的主题,还包括响应于从所述代码模块中的所述测试位置到所述代码模块中的所述第二位置执行所述代码模块,由所述计算设备将所述代码模块恢复到所述状态检查点。

示例27包括示例18-26中任一项的主题,并且其中,基于所述追踪数据来生成所述持续存储器写入的排列包括从可由所述追踪数据定义的持续存储器写入的所有可能排列的集合中随机选择排列。

示例28包括示例18-27中任一项的主题,并且其中,模拟所述电源故障包括当所述排列部分地完成时停止所述排列的重放。

示例29包括示例18-28中任一项的主题,并且还包括响应于模拟所述电源故障而由所述计算设备使用所述平台模拟器来调用与所述代码模块相关联的恢复功能;其中,调用所述测试功能包括响应于调用所述恢复功能而调用所述测试功能。

示例30包括示例18-29中任一项的主题,并且还包括响应于调用所述测试功能而由所述计算设备确定所述测试功能是否失败;以及响应于确定所述测试功能失败而由所述计算设备报告测试失败。

示例31包括示例18-30中任一项的主题,并且还包括响应于调用所述测试功能而由所述计算设备确定持续存储器写入的充分排列是否已经被测试;以及响应于确定持续存储器写入的充分排列尚未被测试而由所述计算设备基于所述追踪数据来生成持续存储器写入的第二排列,其中,所述持续存储器写入的第二排列具有所述模拟计算设备的所述硬件规范所允许的并且不同于所述持续存储器写入的排列的排序的排序。

示例32包括示例18-31中任一项的主题,并且其中,确定持续存储器写入的充分排列是否已经被测试包括确定具有被所述模拟计算设备的所述硬件规范所允许的排序的可由所述追踪数据定义的持续存储器写入的所有可能排列是否已经被测试。

示例33包括示例18-32中任一项的主题,并且其中,确定持续存储器写入的充分排列是否已经被测试包括:确定已经被测试的具有所述模拟计算设备的所述硬件规范所允许的排序的可由所述追踪数据定义的持续存储器写入的所有可能排列的比例是否具有与预定阈值比例的预定义关系。

示例34包括示例18-33中任一项的主题,并且还包括响应于确定持续存储器写入的充分排列已被测试而由所述计算设备报告测试成功。

示例35包括计算设备,所述计算设备包括处理器以及存储器,所述存储器具有储存在其中的多个指令,所述多个指令在被所述处理器执行时,使得所述计算设备执行示例18-34中任一项所述的方法。

示例36包括一个或多个包括存储在其上的多个指令的机器可读储存介质,所述多个指令响应于被执行而导致计算设备执行示例18-34中任一项所述的方法。

示例37包括计算设备,所述计算设备包括用于执行示例18-34中任一项所述的方法的单元。

示例38包括用于软件测试的计算设备,所述计算设备包括用于由所述计算设备的平台模拟器来模拟模拟计算设备的单元;用于由所述平台模拟器来从代码模块中的测试位置到所述代码模块中的第二位置执行所述代码模块的单元;用于在执行所述代码模块时追踪所述模拟计算设备的持续存储器状态,以生成指示所述持续存储器状态的追踪数据的单元;用于基于所述追踪数据来生成持续存储器写入的排列的单元,其中,所述持续存储器写入的排列具有所述模拟计算设备的硬件规范所允许的排序;用于重放所述持续存储器写入的排列的单元;用于响应于重放所述持续存储器写入的排列而模拟电源故障的单元;以及用于响应于模拟所述电源故障而使用所述平台模拟器来调用与所述代码模块相关联的测试功能的单元。

示例39包括示例38的主题,并且其中,所述用于追踪所述持续存储器状态的单元包括用于追踪由所述代码模块执行的持续存储器写入的单元。

示例40包括示例38和39中任一项的主题,并且其中,所述用于追踪所述持续存储器状态的单元包括用于追踪由所述代码模块执行的高速缓存行冲洗的单元。

示例41包括示例38-40中任一项的主题,并且其中,所述用于追踪持续存储器状态的单元包括用于追踪由所述代码模块执行的存储器栅栏的单元。

示例42包括示例38-41中任一项的主题,并且其中,所述用于追踪持续存储器状态的单元包括用于追踪由所述代码模块执行的持续存储器提交原语的单元。

示例43包括示例38-42中任一项的主题,并且其中,所述用于基于所述追踪数据来生成所述持续存储器写入的排列的单元包括用于选择由持续存储器提交原语定界的所述追踪数据的段的单元;以及用于生成被限于所述追踪数据的所述段的持续存储器写入的排列的单元。

示例44包括示例38-43中任一项的主题,并且还包括用于使用所述平台模拟器来生成针对所述代码模块中所述测试位置的状态检查点的单元,其中,所述状态检查点指示所述模拟计算设备的所述持续存储器状态;其中,所述用于重放所述持续存储器写入的排列的单元包括用于基于所述状态检查点来重放所述持续存储器写入的排列的单元。

示例45包括示例38-44中任一项的主题,并且其中,所述用于重放持续存储器写入的排列的单元包括用于根据所述持续存储器写入的排列来修改所述状态检查点的单元。

示例46包括示例38-45中任一项的主题,并且还包括用于响应于从所述代码模块中的测试位置到所述代码模块中的第二位置执行所述代码模块而将所述代码模块恢复到所述状态检查点的单元。

示例47包括示例38-46中任一项的主题,并且其中,所述用于基于所述追踪数据来生成所述持续存储器写入的排列的单元包括用于从可由所述追踪数据定义的持续存储器写入的所有可能排列的集合中随机选择排列的单元。

示例48包括示例38-47中任一项的主题,并且其中,所述用于模拟所述电源故障的单元包括用于在所述排列部分地完成时停止所述排列的重放的单元。

示例49包括示例38-48中任一项的主题,并且还包括用于响应于模拟所述电源故障而使用所述平台模拟器来调用与所述代码模块相关联的恢复功能的单元;其中,所述用于调用所述测试功能的单元包括用于响应于调用所述恢复功能而调用所述测试功能的单元。

示例50包括示例38-49中任一项的主题,还包括用于响应于调用所述测试功能而确定所述测试功能是否失败的单元;以及用于响应于确定所述测试功能失败而报告测试失败的单元。

示例51包括示例38-50中任一项的主题,并且还包括用于确定持续存储器写入的充分排列是否已经响应于调用所述测试功能而被测试的单元;以及用于响应于确定持续存储器写入的充分排列尚未被测试而基于所述追踪数据来生成持续存储器写入的第二排列的单元,其中,所述持续存储器写入的第二排列具有所述模拟计算设备的所述硬件规范所允许的并且不同于所述持续存储器写入的排列的排序的排序。

示例52包括示例38-51中任一项的主题,并且其中,所述用于确定持续存储器写入的充分排列是否已经被测试的单元包括用于确定具有所述模拟计算设备的所述硬件规范所允许的排序的可由所述追踪数据定义的持续存储器写入的所有可能排列是否已经被测试的单元。

示例53包括示例38-52中任一项的主题,并且其中,所述用于确定持续存储器写入的充分排列是否已经被测试的单元包括用于确定已经被测试的具有所述模拟计算设备的所述硬件规范所允许的排序的可由所述追踪数据定义的持续存储器写入的所有可能排列的比例是否具有与预定阈值比例的预定义关系。

示例54包括示例38-53中任一项的主题,并且还包括用于响应于确定持续存储器写入的充分排列已经被测试而报告测试成功的单元。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1