对代码覆盖使用硬件辅助的自主测试用例反馈的方法和设备的制作方法

文档序号:6539360阅读:184来源:国知局
专利名称:对代码覆盖使用硬件辅助的自主测试用例反馈的方法和设备的制作方法
技术领域
本发明总体上涉及改进的数据处理系统。具体地,本发明提供了一种用于获取数据处理系统中的性能数据的方法和设备。更具体地,本发明提供了一种在获得数据处理系统中的代码覆盖数据时,对软件工具提供硬件辅助的方法和设备。
背景技术
在分析和增强数据处理系统以及在数据处理系统内执行的应用程序的性能时,如果知道数据处理系统内的哪些软件模块正在使用系统资源,是很有帮助的。对数据处理系统的有效管理和增强要求知道各种系统资源在何时和如何被使用。用性能工具来监视和检查数据处理系统,以确定当各种软件应用在数据处理系统中执行时的资源消耗。例如,性能工具可以识别数据处理系统中最常执行的模块和指令,或者可以识别那些分配最大量内存或者执行I/O请求最多的模块。硬件性能工具可以被内置在系统中,或者在以后添加。
一种已知的软件性能工具是跟踪工具。跟踪工具可以使用多种技术来提供跟踪信息,来指示执行程序的执行流。一种技术是通过在特定事件发生时记录这些事件,来跟踪特定的指令序列。这种技术称为基于事件的特征描绘(profiling)技术。例如,跟踪工具可以记录每一次进入和每一离开某个模块、子例程、方法、函数或者系统部件。或者,跟踪工具可以记录内存请求者以及分配给每一个内存分配请求的内存量。一般,对每一个这样的事件产生一个带有时间戳记的记录。使用类似于进入-退出记录的对应记录对来跟踪任意代码段的执行、I/O或数据传输的开始和结束,以及其它许多感兴趣的事件。
为了改进各种计算机系列所产生的代码的性能,常常需要判断在执行代码时,处理器将时间花在了什么地方。在计算机处理领域,这种做法就是通常所说的“热点”定位。理想情况下,希望在代码级的指令和/或源行分离出这样的热点,以将注意力集中于可能从对代码的改进获益最多的区域。
另一种跟踪技术涉及对程序的执行流定期采样,以识别程序中看来花费了大量时间的特定位置。这种技术系基于这样的思想按照规则的间隔,定期中断应用程序或者数据处理系统的执行。这种技术被称为基于采样的特征描绘技术。在每一次中断时,记录预定长度时间的信息,或者记录感兴趣的预定个数的事件的信息。例如,可以在每一个间隔记录当前执行线程(executing thread)的程序计数器,当前执行线程是被进行特征描绘的较大程序的一个可执行的部分。可以在后处理时对照数据处理系统的装入映像图(load map)以及符号表信息求解这些值,从而可以从该分析得到关于时间花费在什么地方的概要描述。
使用当前可用的软件工具确定测试覆盖范围是一个困难的问题。当测试程序代码时,尚不存在一种容易的机制来确定执行什么代码,不执行什么代码。这种标识也称为代码覆盖(code coverage)。存在标识代码覆盖的软件技术和工具。但是,这些技术和工具通常要改变被测试的代码。但是并不希望不得不改变或者改编代码,因为这样的过程可能冗长而耗费时间。其它类型的技术和工具基于根据程序的静态分析生成测试用例。这种方法不能保证测试的完全覆盖。
建立诸如上述这些工具以寻找与特定条件或者问题相关的答案会花费很多精力,并且可能非常难以校准,因为软件工具本身会影响被测试的系统。本发明认识到,对工具开发和问题分析提供硬件辅助能够大大减轻开发软件性能工具所需的工作量。另外,随着处理器密度(densitiy of processors)的不断增大,可以将硬件辅助包括进来,以提供另外的调试和分析功能。
因此,希望能够提供一种改进的方法、设备和计算机指令,用于为分析在数据处理系统中执行的代码的代码覆盖的性能工具提供硬件辅助。

发明内容
本发明提供了一种用于提供代码的覆盖数据的方法、设备和计算机指令。获得包含与代码相关的指令访问指示符的覆盖数据。识别由数据处理系统中的处理器响应处理器对代码的执行而设置的特定指令访问指示符,以形成被设定的指令访问指示符。将每一个被设定的指令访问指示符与所述代码的一部分相关联。产生该覆盖数据的一个表达。在该表达中标识所述被设定的指令访问指示符。该表达例如可以是图形表达。


在所附权利要求中给出了作为本发明的特征的新颖性特征。但是,本发明本身,以及其使用的优选方式,以及其进一步的目的和优点,接合附图阅读下面对说明性实施例的详细说明后可以得到最好的理解。附图中图1是可以实现本发明的数据处理系统的框图;图2是根据本发明的一个优选实施例用于处理信息的处理器系统的框图;图3图解了根据本发明的一个优选实施例,用于处理与指示符相关的指令的部件;图4图解了根据本发明的一个优选实施例,用于设定标识已被访问的存储单元的指示符的信号的数据流;图5图解了根据本发明的一个优选实施例的一种用于将访问标识符与指令或者存储单元关联起来的机制;图6图解了根据本发明的一个优选实施例的一个指令束(bundle);图7的框示了根据本发明的一个优选实施例用于产生元数据比如指示符的部件;图8是根据本发明的一个举例的实施例,用页表把程序指定的存储器地址转换为物理地址的数据流的举例的框图;图9是根据本发明的一个例证实施例的例证页表条目;图10是根据本发明的一个优选实施例用来标记对指令的访问的过程的流程图;图11是根据本发明的一个优选实施例,其后跟随指令高速缓存的设定指令访问指示符的过程的流程图;图12是根据本发明的一个优选实施例,标记对子例程的访问的过程的流程图;图13是根据本发明的一个优选实施例,标记对代码段的访问的过程的流程图;图14是根据本发明的一个优选实施例,用来分析代码覆盖数据的部件的框图;图15是根据本发明的一个优选实施例,用来收集代码覆盖数据和显示程序内被覆盖和不被覆盖的路径的过程的流程图;图16是根据本发明的一个优选实施例,用来标记对包含数据的存储单元的访问的过程的流程图;图17是根据本发明的一个优选实施例,其后跟随数据高速缓存的处理的流程图;图18是根据本发明的一个优选实施例,用于当在运行时间内发生动态存储器分配时,获取调用栈信息的过程的流程图;图19是根据本发明的一个优选实施例,用于在对存储器解除分配时,发送有关在程序执行期间发生的数据访问的信息的过程的流程图;图20是根据本发明的一个优选实施例,产生调用流树以标识没有被初始化或者访问的区域的过程的流程图;图21图解了根据本发明的一个优选实施例的一个图形化报告,其图示了数据区的覆盖;
图22是根据本发明的一个优选实施例,用于产生显示信息的过程的流程图;图23是根据本发明的一个优选实施例,使用元数据将数据预先取入高速缓存的过程的流程图;图24是根据本发明的一个优选实施例的图解元数据的过程的流程图,所述元数据包括将从开始点预先取入的什么数据的标识。
图25是根据本发明的一个优选实施例,图解包括对要从开始点预取出什么数据的标识的元数据的处理的流程图。
具体实施例方式
现在看图1,图1表示了其中可以实现本发明的数据处理系统的框图。客户机100是计算机的一个例子,其中可以有实现本发明的处理的代码或者指令。客户机100应用外围部件互连(PCI)局部总线结构。尽管所图示的例子应用的是PCI总线,但是也可以使用其它总线结构,比如加速图形端口(Accelerated Graphics Port(AGP))以及工业标准结构(Industry Standard Architecture(ISA))。处理器102和主存储器104通过PCI桥108连接到PCI局部总线106。PCI桥108还可以包括集成存储器控制器和处理器102用高速缓存存储器。可以通过直接部件互连或者通过插入板(add-in board)向PCI局部总线106进行另外的连接。
在图示的例子,局域网(LAN)适配器110、小型计算机系统接口SCSI主机总线适配器112以及扩展总线接口114通过直接部件连接被连接到PCI局部总线106。相反,音频适配器116、图形适配器118以及音频/视频适配器119通过插入扩展槽的插入板连接到PCI局部总线106。扩展总线接口114为键盘和鼠标适配器120、调制解调器122和附加存储器124提供连接。SCSI主机总线适配器112为硬盘驱动器126、磁带驱动器128以及CD-ROM驱动器130提供连接。典型的PCI局部总线实现支持三个或者四个PCI扩展槽或者插入连接器(add-in connector)。
操作系统在处理器102上运行,用来协调和控制图1的数据处理系统100中的各种部件。操作系统可以是市场上可购买的操作系统比如可从微软公司获得的Windows XP。面向对象的编程系统比如Java可以接合操作系统运行,提供从在客户机100上执行的Java程序或者应用对操作系统的调用。“Java”是太阳微系统公司(Sun Microsystems,Inc)的商标。用于操作系统、面向对象的编程系统以及应用或者程序的指令位于存储设备比如硬盘驱动器126上,并可以被装入主存储器109以由处理器102执行。
本领域的普通技术人员可以理解,图1中的硬件可以随具体实现而变化。除了图1所示的硬件之外或者取代之,可以使用其它内部硬件或者外围设备,比如快闪只读存储器(ROM)、等效的非易失性存储器,或者光盘驱动器等。另外,本发明的处理可以应用于多处理器数据处理系统。
例如,客户机100如果可选地被配置为网络计算机,则可以不包括SCSI主机总线适配器112、硬盘驱动器126、磁带驱动器128和CD-ROM 130。在这种情况下,计算机(准确地说是客户计算机)包括某种类型的网络通信接口,比如LAN适配器110、调制解调器122等。又例如,客户机100可以是一个可引导的独立系统,而不依赖于某种网络通信接口,也不管客户机100是否包括某种类型的网络通信接口。又例如,客户机100可以是个人数字助理(PDA),其被配置为具有ROM和/或快闪ROM,以提供用以存储操作系统文件和/或用户产生的数据的非易失性存储器。图1图示的例子和上述其它例子不是要对本发明进行结构上的限制。
本发明的处理由处理器102使用计算机实现的指令来执行。所述指令可以位于存储器比如主存储器104、存储器124中,或者位于一个或者多个外围设备126-130中。
现在看图2,其中图示了根据本发明的一个优选实施例,用于处理信息的处理器系统的框图。处理器210可以被实现为图1所示的处理器102。
在优选实施例中,处理器210是单集成电路超标量微处理器。因此,如下面所要描述的,处理器210包括各种单元、寄存器、缓冲器、存储器以及其它部分,它们都是由集成电路形成的。另外,在优选实施例中,处理器210按照精简指令集计算机(RISC)技术工作。如图2所示,系统总线211连接到处理器210的总线接口单元(BIU)212。BIU212控制处理器210和系统总线211之间的信息传输。
BIU212连接到处理器210的指令高速缓存214和数据高速缓存216。指令高速缓存214将指令输出到定序器单元218。响应于来自指令高速缓存214的指令,定序器单元218选择性地将指令输出到处理器210的其它执行电路。
在优选实施例中,除了定序器单元218之外,处理器210的执行电路包括用来执行指令的许多处理器单元。这些处理器单元也称为执行单元。这些执行单元例如包括分支单元220、定点单元A(FXUA)222、定点单元B(FXUB)224、复定点(complex fixedpoint)单元(CFXU)226、装入/存储单元(LSU)228以及浮点单元(FPU)230。FXUA222,FXUB 224,CFXU 226和LSU 228从通用结构寄存器(general-purposearchitectural register)(GPR)232和定点改名缓冲器(fixed-pointrename buffer)234输入它们的源操作数信息。另外,FXUA222和FXUB224从进位位(CA)寄存器242输入“进位位(carry bit)”。FXUA 222,FXUB 224,CFXU 226和LSU 228输出它们的运算结果(目的操作数信息),用于存储到定点改名缓冲器234的选定条目中。另外,CFXU 226向专用寄存器处理单元(SPX单元)240输入输出源操作数信息和目的操作数信息。
FPU 230从浮点结构寄存器(floating-point architecturalregister)(FPR)236和浮点改名缓冲器238输入其源操作数信息。FPU230输出其运算结果(目标操作数信息),用于存储到浮点改名缓冲器238中的选定条目。
响应于装入(Load)指令,LSU 228从数据高速缓存216输入信息,并将这样的信息拷贝到改名缓冲器234和238中选定的一个。如果这样的信息未被存储在数据高速缓存216中,则数据高速缓存216通过BIU212和系统总线211从连接到系统总线211的系统存储器260输入这样的信息。另外,数据高速缓存216能够通过BIU 212和系统总线211把信息从数据高速缓存216输出到连接到系统总线211的系统存储器260。响应于存储(Store)指令,LSU 228从GPR232和FPR236中选定的一个输入信息,并将这样的信息拷贝到数据高速缓存216。
定序器单元218向GPR232和FPR输入输出信息。分支单元220从定序器单元218输入指令和表示处理器210当前状态的信号。响应于这样的指令和信号,分支单元220向定序器单元218输出信号,所述信号指示存储由处理器210执行的指令序列的合适的存储器地址。响应于来自分支单元220的这种信号,定序器单元218从指令高速缓存214输入所指示的指令序列。如果一个或者多个指令序列未被存储在指令高速缓存214中,则指令高速缓存214通过BIU212和系统总线211,从连接到系统总线211的系统存储器260输入这样的指令。
响应于从指令高速缓存214输入的指令,定序器单元218将指令选择性地分派给执行单元220、222、224、226、228和230中选定的单元。每一个执行单元执行特定种类指令的一个或者多个指令。例如,FXUA 222和FXUB 224对源操作数执行第一类定点数学运算,比如加法、减法、与、或以及异或。CFXU 226对源操作数执行第二类定点运算,比如定点乘法和除法。FPU 230对源操作数执行浮点运算,比如浮点乘法和除法。
当信息存储在选定的一个改名缓冲器234中时,这样的信息与所选定的改名缓冲器分配的指令所指定的存储位置(例如GPR232或者CA寄存器242中的一个)相关联。响应于来自定序器单元218的信号,存储在选定的一个改名缓冲器234中的信息被拷贝到其相关的一个GPR232(或者CA寄存器242)。定序器单元218响应于产生所述信息的指令的完成,指导(控制)存储在选定的改名缓冲器234中的信息的上述拷贝。这种拷贝称为“写回”。
当信息存储在选定的改名缓冲器238中时,这样的信息与FPR236之一相关联。响应于来自定序器单元218的信号,存储在选定的改名缓冲器238中的信息被拷贝到其相关的一个FPR 236。定序器单元218响应于产生所述信息的指令的完成,指导(控制)存储在选定改名缓冲器238中的信息的上述拷贝。
处理器210通过在各个执行单元220、222、224、226、228和230同时处理多个指令来实现高性能。因此,每一个执行作为一系列阶段被处理,每一个阶段可与其它指令的各阶段并行执行。这种技术称为“流水线技术”(pipelining)。在该说明性实施例的一个重要方面,指令一般作为六个阶段被处理,那就是,取数,解码,分配(调度),执行,完成和写回。
在取数阶段,定序器单元218选择性地(从指令高速缓存214)从存储上面结合分支单元220和定序器单元218讨论的指令序列的一个或者多个存储器地址输入一个或者多个指令。在解码阶段,定序器单元218对多达四个取出的指令解码。
在分配(调度)阶段,在为分配的指令的结果(目标操作数信息)保留改名缓冲器条目之后,定序器单元218将多达四个被解码的指令选择性地分配给(响应于解码阶段的解码)选定的执行单元220,222,224,226,228和230。在分配阶段,操作数信息被提供给用于分配的指令的选定执行单元。处理器210按照指令的编程顺序分配指令。
在执行阶段,执行单元执行其分配的指令,并将其运算结果(目标操作数信息)输出以存储到上述改名缓冲器234和改名缓冲器238中的选定条目。这样,处理器210能够按照不同于指令的编程顺序的顺序执行指令。
在完成阶段,定序器单元218指出指令已“完成”。处理器210按照指令的编程顺序“完成”指令。
在写回阶段,定序器218控制从改名缓冲器234和238分别向GPR 232和FRP 236拷贝信息。定序器单元218控制存储在选定的改名缓冲器的信息的这种拷贝。类似地,在特定指令的写回阶段,处理器210响应特定指令更新其结构状态(architectural state)。处理器210按照指令的编程顺序处理指令的各“写回”阶段。处理器210最好在规定条件下合并指令的完成阶段和写回阶段。
在图示的实施例中,每一个指令需要一个机器周期以完成指令处理的每一个阶段。尽管如此,某些指令(例如CFXU 226执行的复定点指令)可能需要多于一个的机器周期。因此,响应完成在前指令所需的时间的变化,在特定指令的执行和完成阶段之间可以发生可变的延迟。
在定序器218内设置完成缓冲器248,用以跟踪在执行单元内执行的多个指令的完成。在指示已经成功地完成了一个指令或者一组指令时,按照应用特定的顺序,完成缓冲器248可以用来启动把那些已完成的指令的结果传送给相关的通用寄存器。
另外,处理器210还包括处理器监视单元240,后者连接到指令高速缓存214以及处理器210中的其它单元。处理器210的操作可以使用性能监视单元240来监视,性能监视单元在此说明性实施例中是一个软件可访问的机制,其能够提供描述指令执行资源的使用和存储控制的详细信息。尽管在图2中没有图示,性能监视单元240事实上耦接到处理器210的每一个功能单元,以允许监视处理器210的操作的所有方面,包括,例如,重建事件之间的关系,识别错误触发,识别性能瓶颈,监视流水线故障(pipeline stall),监视空闲处理器周期,确定分配效率,确定分支效率,确定未对准数据访问的性能损失,识别串行化指令的执行的频率,识别被禁止的中断,确定性能效率。
性能监视单元240包括数量与实现相关(例如2-8)的计数器241-242,被标记为PMC1和PMC2,它们用来对选定的事件的发生次数进行计数。性能监视单元240还包括至少一个监视器模式控制寄存器(monitor mode control register(MMCR))。在此例子中,存在两个控制寄存器MMCR243和244,规定计数器241-242的功能。计数器241-242和MMCR 243-244最好被实现为SPR,可通过可由CFXU 26执行MFSPR(move from SPR从SPR移出)和MTSPR(move to SPR移到SPR)指令被访问以进行读或者写。但是,在一个备选实施例中,计数器241、242和MMCR 243-244可以简单地被实现为I/O空间中的地址。在另一个实施例中,控制寄存器和计数器可以通过索引寄存器间接地被访问。本实施例在来自因特尔公司的处理器中的IA-64架构中实现。
另外,处理器210还包括中断单元250,该中断单元被连接到指令高速缓存214。另外,尽管图2没有图示,中断单元250被连接到处理器210内的其它处理器单元。中断单元250可以从其它处理器单元接收信号,启动动作,比如开始错误处理或者软中断处理(trapprocess)。在这些例子中,中断单元250被用来产生在程序执行中可能发生的中断和异常。
本发明提供了监视特定指令的执行,以及在执行程序时,对特定存储单元的访问的能力。这种确定也被称为代码覆盖。具体地,可以使用一个备用字段来保存一个指示符,该指示符与特定指令或者存储单元相关联。可以响应指令的执行或者对存储单元的访问设置该指示符。可以使用对这些指示符的检查来判断已经执行了什么代码,什么代码还没有执行。对于执行代码期间什么存储单元已经被访问,什么存储单元没有被访问,可以进行类似的识别。或者,可以在另一个与指令或者存储单元相关的另一位置存储所述指示符。
在将指示符置于所述指令中的情况下,一般使用一个备用字段。但是在某些情况下,可以将指令扩展为包括所述指示符所需的空间。在这种情况下,处理器的架构需要改变。例如,64位架构可能要改变为65位架构,以容纳所述指示符。对于数据的访问,指示符可以与数据或者数据所处的存储单元相关联。
在这些说明性的例子中,这些指示符也被称为访问指示符。数据访问指示符与存储单元相关联,而指令访问指示符与指令相关联。在执行程序之前,这些指示符一般被初始化为未被设置。
当处理器执行一个指令时,设定与该指令相关的指令访问指示符。对一个存储单元的访问导致与该存储单元相关的指示符被设定。通过检查已经被设定和未被设定的指示符,可以标识代码覆盖。此检查可以使用在被设计为测试代码覆盖的软件工具中实现的过程进行。这样,对于指令和对存储单元的数据访问,可以实现代码覆盖(codecoverage)而无需要求对代码进行统计分析或者改编(instrumentation)。
现在看图3,其中图示了根据本发明的一个优选实施例,在处理与指示符相关的指令时使用的部件。指令高速缓存300接收指令束(bundle)302。指令高速缓存300是图2的指令高速缓存214的一个例子。一个指令束是一个指令组(grouping of instructions)。这种指令组一般存在于可从因特尔公司获得的IA-64处理器中。指令高速缓存300处理指令以用于执行。
作为该指令的处理的一部分,指令高速缓存300将指令分配给不同的执行单元用以执行。当发生了指令的执行时,从完成缓冲器306接收信号304。完成缓冲器306是完成缓冲器比如图2所示完成缓冲器248的一个例子。信号304标识已经完成了执行的指令。这个标识可以采用不同的形式。例如,可以用对应于完成缓冲器306中的条目的条目号来标识已经完成了执行的指令。用这种方法,指令高速缓存300知道给定的指令位于其高速缓存的什么地方。取决于处理器的实现方式,可以用其它指示符来标识那些指令已完成,比如在高速缓存300中的位置。
当收到信号304时,指令高速缓存300设置与已经被执行的指令相关的指令访问指示符。响应于对信号304的接收,指令高速缓存标记或者设置与已完成执行的指令相关的指令访问指示符308。取决于具体实现方式,该指示符可以在各种位置。例如,指令访问指示符308可以位于指令中的备用位或者字段中,或者位于影子存储器中,或者位于页表中。
对于存储单元中的数据的访问,由数据高速缓存比如图2中的数据高速缓存216,而不是指令高速缓存处理数据和指示符。或者,处理器可以具有组合的数据和指令高速缓存,在这种情况下,适当地设置所述指示符。
尽管图示的例子是由完成缓冲器306产生表示指令执行的完成的信号,但是取决于具体的处理器架构和配置,该信号也可以由其它处理器单元生成。例如,该处理器单元可以是实际处理该指令的处理单元。另外,如果硬件不支持乱序操作(out-of-order operation),则向处理器单元分配一个指令用于执行可以是指明该指令已被执行的一个可接受的时间点。换句话说,如果一个指令不被投机性地(speculatively)执行,则处理器中的一个分配器(dispatcher)可以将该指令标记为已被执行。
现在看图4,其中图示了根据本发明的一个优选实施例,用来设置标识已被访问的存储单元的指示符的信号的数据流。当一个指令已被执行时,数据高速缓存400从完成缓冲器404接收信号402。信号402也包括被执行的的指令已经访问了某个存储单元的数据的指示。
响应收到信号402,设置数据访问指示符406。该数据访问指示符与已完成的指令所访问的存储单元相关。在数据访问指示符不被包括在存储单元本身中时,使用元数据来将指示符的关联映射到存储单元。高速缓存单元中指令/数据的位置标识指令/数据的物理存储器中的位置。所有当前可用的高速缓存单元都具有这个能力。该高速缓存单元还知道更新访问指示符的位置。
现在看图5,其中图示了根据本发明的一个优选实施例,将访问指示符与指令或者存储单元相关联的一种机制。处理器500从高速缓存502接收指令。在这个例子中,指示符不与指令一起存储或者不被存储在找到数据的存储单元中。相反,指示符被存储在单独的存储器区域,访问指示符影子高速缓存504中。所述存储器可以是任何存储设备,比如系统存储器、快闪存储器、高速缓存或者磁盘。
当处理器500从高速缓存502接收然后执行指令时,对应于来自高速缓存502的指令,处理器500在访问指示符影子高速缓存504中设置指令访问指示符。对于包含数据的存储单元的访问,执行类似的处理。在一个实施例中,对每一个不影响实际数据段的对应字,提供一个完全影子字(full shadow word)。换句话说,处理器500允许高速缓存502的架构或者配置保持不变。在这些例子中,所描述的映射是字到字。但是,也可以使用其它类型的映射,比如每数据字一个影子位(shadow bit),其中,访问指示符影子高速缓存504中的一个比特位对应于数据的一个字。
对于这种类型的架构,编译器使用这种特征在与数据区本身相分离的工作区中以类似于调试符号(debug symbol)的方式调试信息。当装入一个模块时,由装入器准备附加信息(extra information)访问指示符,使得在将指令装入高速缓存502时,其能够合并到访问指示符影子高速缓存504中。这些高速缓存区可以被混合,以及按这样被标记,或者由操作模式加以理解。当发生相关数据访问和指令执行时,处理器500设置访问指示符。在这些例子中,所述处理由调试器或者分析程序编程,以知道在该过程执行指令时是否使用影子信息。
现在看图6,其中图示了根据本发明的一个优选实施例的一个指令束。指令束600包含指令片(slot)602、指令片604和指令片606,以及模板608。如图所示,指令束600包含128个比特。每一个指令片包含41个比特,模板(template)608包含5个比特。模板608用来标识当前数据束内的停止,以及将指令片内的指令映射到不同类型的执行单元。
指令束600内的备用位(备用比特)用来保存本发明的指示符。例如,指示符610、612和614分别位于指令片602、604和606内。取决于特定的实现,这些指示符可以采用各种形式和各种大小。指示符可以使用单个比特或者使用多个比特。在这些说明性的例子中,可以使用单个比特来表示指令已被执行。可以类似地将字段用于标记数据或者存储单元的指示符。当执行过程总是开始于指令束中的第一指令时(象在IA-64架构中那样),则可以用两个比特来表示所执行的最后一个指令。这只对具有分支指令的模板是需要的。如果正在标记基本模块,则只需要标记分支指令以及一个分支之后的指令。
现在看图7,图示了根据本发明的一个优选实施例,用于产生元数据和访问指示符的部件。编译器支持嵌在源中的表示要产生的元数据的指令(directive)。所述元数据用来指示要执行什么操作,比如标识哪些指令或者存储单元要与特定访问指示符相关联。换句话说,元数据定义访问指示符到个体指令、指令组和存储单元的映射。对于存储单元来说,取决于具体的实现,元数据可以将访问指示符映射到个体存储单元或者具有不同大小的不同存储单元组。处理器中的硬件部件使用这些访问指示符,来反映出当一个存储单元被访问或者当一个指令被执行时这些部件所做的更新。
编译器700可以产生用于执行的指令702和用于监视代码覆盖的元数据和访问指示符704。当指令或者数据高速缓存页被装入存储器时,操作系统程序装入器/程序链接器和/或性能监视程序读出编译器700产生的元数据和访问指示符704,将元数据和访问指示符704装入存储器。处理器708可以按照编译器700生成的格式接受元数据和访问指示符704,并用元数据和访问指示符704填充影子存储器705。
在一个备选实施例中,不是编译器而是性能监视程序生成所述元数据和访问指示符。
在一个实施例中,所述格式简单地具有元数据和/或其每一个块或者区段基准的访问指示符影子高速缓存条目,并将元数据和访问指示符704移动到其相应的影子条目。高速缓存可以不具有影子高速缓存,相反,高速缓存本身的内部格式可以被修改为包含元数据和访问指示符704。在修改指令流本身以包含所述元数据的实施例中,或者是装入器更新指令流以包含合适的元数据和/或访问指示符和工作区,或者是编译器700产生了所述代码以包含元数据和访问指示符704。无论在哪种情况下,在装入代码之后,处理器接受元数据和访问指示符704。
另外,可以将元数据和访问指示符704置入与指令702相关的影子存储器705中。编译器700产生表或者调试数据部分中的信息。所述性能监视程序将所述信息装入影子存储器705中的影子数据区。或者,所述调试区可以由操作系统,或者由一起工作的性能监视程序和处理器自动填充。
指令702然后可以由处理器708来执行。编译器700可以设置处理器708中的一个寄存器比如模式寄存器(mode register)710。当设置该寄存器时,处理器708在执行指令702时查看影子存储器705中的元数据和访问指示符704,以确定元数据和访问指示符704是否与正在指令702中执行的指令相关联。
如果没有设置模式寄存器710,则当执行指令702时忽略元数据和访问指示符704。在这些说明性的实施例中,使用模式寄存器710来打开或者关闭标记对指令的访问的功能。
除了定义要与访问指示符相关联的指令或者指令组之外,元数据和访问指示符704内的元数据可以用来设置模式寄存器710。当一个访问指示符按照指令级(on an instruction level basis)相关联时,每一个与访问指示符相关联的指令在该指令被执行时使其关联的访问指示符被设置。当一个访问指示符与一个指令集相关联时,在这些说明性的例子中,当该指令集中的任何指令被执行时,该访问指示符就被设置。
对于存储单元712中的数据,可以执行类似的处理。取决于具体的实现,可以在指令内或者数据内,而不是影子储存器705内,设置元数据和访问指示符704。但是,通过在影子存储器705中设置元数据和访问指示符704,当在影子存储器705中设置元数据和访问指示符704时,可以动态生成元数据和访问指示符704。
这个特征允许选择和标识用于代码覆盖监视的指令,而无需修改程序。换句话说,编译器700可以在指令702已被编译以由处理器708执行后,生成元数据和访问指示符704。设置模式寄存器710使处理器708在性能改编影子存储器(performance instrumentation shadowmemory)705中查找元数据和访问指示符704,而无需修改指令702。在这些例子中,当执行指令702中的指令和/或访问存储单元712中的存储单元的数据时,与指令或者存储单元相关联的访问指示符的存在使处理器708设置访问指示符。
图8图解了根据本发明的一个举例的实施方式中的数据流的举例的框图,其中,使用页表来将程序指定的存储器地址转换为物理地址。如图8所示,程序地址810(用于数据或者指令)通过地址空间寄存器被转换为虚拟地址,所述寄存器使用规定有效地址空间的各种手段中的一种。得到的虚拟地址由处理器用来在页表830中搜索与该虚拟地址匹配的页描述符。匹配的页描述符的内容一般包含与该虚拟页相关的物理地址和属性。这些内容被用来将该虚拟地址转换为物理地址,以及确定页的属性(例如访问权)。
在本发明的另一个实施例中,将所述页表扩展为包括另外的字段,用于存储访问指示符比如指令访问指示符和数据访问指示符的每一个条目。当一个过程访问该页表以执行虚拟-物理页面地址映射时,可以查询这些另外的字段,取出这些字段的值,并根据导致对页表的访问的特定事件来更新这些字段中的值。
或者,为了避免性能的退化,这些字段中的访问指示符信息可以被高速缓存在类似于翻译后援缓冲器(Translation Look-aside Buffer(TLB))或者有效-真实地址转换缓冲器(Effective to Real AddressTranslation Buffer(ERAT))的处理器资源中。例如,可以提供一个性能指示符后援缓冲器(Performance Indicator Look-Aside Buffer(PILAB)),其中可以高速缓存虚拟-真实地址转换信息和在页表的上述字段中提供的性能指示符信息。当接收到一个指令或者数据地址访问请求时,可以在PILAB中进行程序或者虚拟地址的查找,以获得地址转换信息和访问指示符信息。如果在PILAB中不存在程序或者虚拟地址,则可以询问页表以获得该信息。
图9图解了根据本发明的一个例证实施方式的例证页表条目。如图9所示,该页表条目900包括用于存储虚拟页地址的字段910、用于存储物理页地址的字段920、用于存储与代码覆盖相关的数据的代码覆盖字段930-950。这些字段由测试或者性能监视应用程序用来确定被测试的计算机应用程序的代码覆盖。这些代码覆盖字段可以包括,例如,指令访问指示符、数据访问指示符或者预取信息。这些额外字段930-950的值可以由处理器中的不同部件根据测试或者性能监视应用程序提供给这些单元的信息来设置。
例如,以类似于上面所述的将访问指示符与指令和/或部分数据相关联的方式,可以将访问指示符与页表中的这些指令和/或数据部分相关联。这样,当判断一个指令或者数据部分是否具有相关联的访问指示符时,可以用该指令或者数据部分的虚拟地址来标识页表中的一个条目,可以检查在额外字段930和940中存储的值来看一个访问指示符是否与物理页面或者物理页面的一部分相关联。也就是,如果与虚拟地址相关联的偏移落入存储有访问指示符的字段930中所标识的偏移范围内,则对应于该虚拟地址的指令具有相关联的访问指示符。该指示符在该指令被执行的情况下被设置。
访问类型字段940用来对于对存储单元的访问,标识已经发生的访问的类型。预取信息字段950可以包括诸如指针、偏移量和地址等信息。这样,例如,当必须从物理存储器取出指令或者部分数据时,就咨询该页表,以识别所述指令或者部分数据的物理存储位置。同时,可以查询字段930-950,并可以将访问字段930中的指示符设置为表示该页面已经从物理存储器被取出并被装入存储器或者高速缓存。
应当理解,尽管图9只图示了一个用于存储访问指示符的字段、一个用于标识访问类型的字段和一个用于存储预取信息的字段,但是本发明不限于此。相反,可以使用与物理页面相关联的任意数量的用于存储多个访问指示符等的字段而不偏离本发明的实质范围。
现在看图10,其中图示了根据本发明的一个优选实施例,用于标记对指令的访问的处理的流程图。示于图10的处理可以被实现到一个指令高速缓存中,比如图2中的指令高速缓存214。
该过程开始于接收一个指令束(步骤1000)。接下来,识别该指令束中用于执行的指令(步骤1002)。接下来,执行该指令(步骤1004)。在这些说明性的例子中,步骤1004中对所述指令的执行的一部分包括执行该指令。然后,设置一个与该指令相关联的指示符来指示该指令的执行(步骤1006)。然后,判断该指令束中是否还有未被处理的指令(步骤1008)。
如果该指令束中还存在未被处理的指令,则所述过程前进到上述的步骤1002。如果在该指令束中不再存在另外的未被处理的指令,则该过程结束。在一个备选实施例中,如果该指令束没有分支则设置一个比特,该比特指出当采用一个分支时执行的最后一个指令。
在此例中,指令高速缓存包含所有的信息,对包含要被更新以反映执行指令时的变化的指令访问指示符的区域有直接访问权。由完成缓冲器或者访问该完成缓冲器的处理器单元提供有关完成的执行的信息。
现在看图11,其中图示了根据本发明的一个优选实施例,由指令高速缓存遵循的设置指令访问指示符的处理的流程图。图11所示的过程可以被实现到一个指令高速缓存中,比如图2中的指令高速缓存214。
该过程开始于接收表示指令的执行已完成的信号(步骤1100)。在这些例子中,从完成缓冲器比如图2中的完成缓冲器248接收一个信号。该完成缓冲器包括标识已完成了执行的执令的信息。接下来,保存存储器中的更新信息(步骤1102),之后过程结束。响应收到该信号,可以将指令高速缓存中的一个条目保存到存储器中。使用从完成缓冲器接收到的信号中的信息来标识所述条目。例如,所述信号可以指出对应于第7项的指令已经完成执行。用于该指令的信息可以位于在该指令高速缓存中创建的一个寄存器中,以提供执行操作的最快路径。在所述高速缓存中保存信息时,该信息可以被置于另一个位置中,该位置比如是页表或者影子存储器。该更新也包括对指令访问指示符的设置,如果有这样一个指示符与该指令相关联的话。
这样,通过处理器中的硬件部件的辅助,可以针对指令标识代码覆盖。这种硬件辅助允许借助于在执行指令时设置的指令访问指示符来标识已被执行的指令。上面所描述的例子提供了其中每一个被执行的指令都被标记的细粒度。如果希望有较粗的粒度,则可以对部分代码(比如代码段或者子例程)应用该过程。
现在看图12,其中图示了根据本发明的一个优选实施例,标记对子例程的访问的处理的流程图。图12所示的过程可以被实现到一个指令高速缓存比如图2的指令高速缓存214中。
该过程开始于识别被执行的指令(步骤1200)。接下来,判断该指令是否位于被选定来监视的子例程的开始地址(步骤1202)。如果该指令不是子例程的开始,则判断是否对子例程的开始地址处的指令预先设置了指令访问指示符(步骤1204)。如果判定对开始地址的指令预先设置了指令访问指示符,则判断所识别的指令是否是用于子例程的返回地址的指令(步骤1206)。如果该指令是用于返回地址的指令,则在与该子例程相关的元数据中设置用于该返回指令的指令访问指示符(步骤1208),之后结束处理。
现在回头再看上述步骤1206和1204。如果判断结果为否,则过程返回步骤1200。在步骤1202,如果所识别的指令是子例程开始的指令,则过程前进到上述步骤1208。
现在看图13,其中图示了根据本发明的一个优选实施例,用于识别对代码段的访问的过程的流程图。图13所示的处理可以被实现到一个指令高速缓存比如图2中的指令高速缓存214中。
该过程开始于识别要被执行的指令(步骤1300)。接下来,判断所识别的指令是否是分支指令(步骤1302)。如果该指令是分支指令,则设置与该指令相关的指令访问指示符(步骤1304),之后结束处理。如上所述,该指示符可以以多种方式实现。例如,该指示符可以位于该指令的附加字段(extra field)或者未使用字段中,或者位于影子存储器中,或者位于页表中。
现在回头看步骤1302。如果该指令不是分支指令,则判断前一指令是否是分支指令(步骤1306)。如果前一指令是分支指令,则过程前进到步骤1304,如上所述标记指令访问指示符。在步骤1306,如果前一指令不是分支指令,则过程结束。本质上,步骤1306和步骤1304一起标记当确实有分支时,在分支指令之后的指令。
这样,本发明的机制提供了用于标记已被执行的代码段的硬件辅助。通过检查已被标记的指令访问指示符,可以在确定代码覆盖时识别代码段的执行。
现在看图14,其中图示了根据本发明的一个优选实施例,用来分析代码覆盖数据的部件的框图。使用本发明的硬件辅助机制所产生的代码覆盖信息,可以使用软件工具来产生报告或者图形表达,与已被执行的代码区域相对比识别尚未执行的代码区域。这种代码覆盖信息还可以包括在执行代码时对存储器位置的访问。使用该信息,可以启动对代码的新测试,以产生更新的报告或者表达,来显示出代码覆盖的变化。
在此说明性的例子中,代码覆盖应用程序1400获得代码1404的执行所产生的访问指示符数据1402。该代码可以是,例如,程序,应用,或者程序或应用的一部分的代码。访问指示符数据包括指令访问指示符和/或数据访问指示符。
当开始代码1404的执行时,这些指示符最初是未被设置的。当指令被执行时,或者当执行指令期间访问存储单元中的数据时,设置所述指示符。指令的执行可导致关于某一存储单元的指令访问指示符和数据访问指示符被设置。在执行代码1404之后,可以设置一部分或者全部指示符。
代码覆盖应用程序1400分析访问指示符数据1402以识别在代码1404执行期间已经被覆盖的指令路径和未被覆盖的指令路径。使用图形接口(GUI)1406来显示该执行数据。执行数据的显示可以包括高亮显示或者使用不同的颜色或者图形符号,来标识已经被执行的指令,并标识数据已经被访问的存储单元。GUI1406也可以由用户用来设置供测试代码1404之用的新参数。当再次测试代码1404时,分析新的访问或者覆盖信息,并显示在GUI1406上,以允许用户看到代码覆盖发生了什么样的变化。
在说明性的例子中,代码覆盖应用程序1400可以是定期运行以对覆盖进行采样并提供更新的报告或者呈示的后台监督程序(daemon)。用户可以改变各种参数,或者可以定义一组可供执行代码1404之用的场景。
可以收集代码覆盖数据并提供给用户以供分析。现在看图15,其中图示了根据本发明的一个优选实施例,已执行和未执行的指令的表达。在此说明性的例子中,代码1500是使用硬件辅助对处理器实际执行的指令标记指令访问指示符时已执行的源代码的一个例子。
在此例子中,代码部分1502、1504和1506已被执行,而代码部分1508、1510、1512和1514是尚未被执行的指令。可以这样显示代码1500,使得用一种颜色比如绿色显示已执行的指令,而用另一种颜色比如红色显示尚未执行的指令。这样,用户就容易识别已执行的和尚未执行的指令。在另一个实施例中,只显示已执行的或者未执行的指令。另外,对于已执行的指令,可以设置图形符号与之相关,或者将图形符号设置在其后面。可以使用许多不同的显示技术来显示代码覆盖信息。例如,图形用户界面可以使用高亮显示、不同字体或者只在显示器上显示已执行的指令。用户可以使用任何类型的显示系统来识别已执行的和尚未执行的多行代码。
现在看图16,其中图示了用于收集代码覆盖数据、显示程序内被覆盖和未被覆盖的路径的过程的流程图。图16所示的过程可以被实现在代码覆盖或者测试应用程序中。图16所示的处理的目标在于就指令的执行而论的代码覆盖数据的收集。
该过程开始于接收由程序使用的测试参数(步骤1600)。下面是可以输入的命令行的一个例子Test-code-data Application。在此例子中,Test是测试程序,Application是要被测试的应用程序,-code表示代码覆盖,-data表示数据覆盖。接下来,执行该程序(步骤1602)。步骤1602的程序的执行导致产生访问指示符形式的代码覆盖数据,所述访问指示符比如是指令访问指示符,在处理器执行所述程序的指令时被设置。
然后,判断是否完成了使用硬件辅助执行指令对代码覆盖数据的收集(步骤1604)。如果代码覆盖数据的收集没有完成,则过程返回步骤1602,继续执行程序。否则,识别被执行的指令(步骤1606)。在这些说明性的例子中,通过用已经设置的指令访问指示符来识别指令,从而实现步骤1606。接下来,识别未被执行的指令(步骤1608)。在这些说明性的例子中,通过用还没有设置的指令访问指示符来识别指令,从而实现步骤1608。然后,显示标识被覆盖的执行路径和未被覆盖的执行路径的执行数据(步骤1610)。在这些例子中,在GUI中进行显示,其中,图形化地把被覆盖的执行路径和未被覆盖的执行路径呈示给用户以便分析。
接下来,判断是否存在新参数供执行程序之用(步骤1612)。如果没有新参数则处理结束。如果有新参数,那么过程前进到如上所述的步骤1600。
在此说明性的例子中,在执行程序后显示覆盖数据的呈现图像。取决于实现方式,在程序的执行过程中,数据的显示可以定期进行,可以允许用户在执行期间改变参数以查看代码覆盖是如何改变的。
本发明还提供一种以数据访问的形式确定覆盖的机制。指示符可以与元数据一起存储,其中,元数据选择特定数据用以改编(instrumentation)。关于数据是否已被访问的指示可以被存储在许多不同的地方。例如,可以用附加位扩展一个字,可以提供一个影子高速缓存区,以及可以设计一个页表来包括此信息。
在支持数据访问覆盖时,更新编译器以支持产生一个元数据调试部分(类似于符号部分(symbols section)),操作系统与链接程序/装入程序以及性能监视或者测试覆盖设备驱动程序一起允许专门的操作模式。这些技术模拟每存储器字一个附加位或者附加字。使用不同的机制,当执行指定的应用时,设置一个比特来指示指定的数据区已被执行。存在多种方式来指示这种支持。例如,可以对每一个数据字节提供一个比特,或者对每一个数据字提供一个比特。编译器产生的元数据可以对要使用的硬件提供该映射。该映射可以具有数据类型相关性。当访问一个数据字段时,设置用于数据访问指示符的合适比特。取决于所述映射,可以对不同数据访问设置同一个比特。
现在看图17,其中图示了根据本发明的一个优选实施例,标记对包含数据的存储单元的访问的处理的流程图。在这些说明性的例子中,每当发生数据访问时就启动该处理过程。图17所示的过程可以实现在一个数据高速缓存比如图2中的数据高速缓存216中。
该过程始于检测对存储单元中的数据的访问(步骤1700)。在这些例子中,通过完成缓冲器生成的,表示在执行指令时数据已被访问的信号,由数据高速缓存标识所述数据访问。在一个实施例中,标识所执行的指令,指令高速缓存单元知晓该指令的数据操作数,该指令高速缓存单元从所述完成缓冲器接收一个信号,并发送一个信号给所述数据高速缓存单元,指出所述指令的数据操作数已被访问。或者,所述完成缓冲器能够直接向数据高速缓存发送正被访问的数据的指示。这种方法会要求完成缓冲器知道所述数据信息。
接下来,设定与包含数据的存储单元相关的指示访问的数据访问指示符(步骤1702)。在这些说明性的例子中,数据访问指示符可以位于影子存储器或者页表中。当处理器处在选定或者特殊模式下时发生所述指示符的设定,以使得对具有某个长度,比如一个字节、一个字或者一个双字的数据,设置一个比特。然后,处理存储单元访问(步骤1704),之后处理结束。
确定测试覆盖是一个困难的问题,其中,理解数据访问和数据用途可能有所帮助。换句话说,如果知道是否使用了一个分配的阵列,或者是否运用了一个静态数据,就会有所帮助。另外,测试数据边界对于测试覆盖来说也是很重要的。例如,判断是否对一个阵列分配了足够的空间是有用的。可以通过判断是否发生了阵列外的访问来进行所述判断。
本发明的机制提出了构建和维护可以由用在动态数据区覆盖中的执行程序访问的调用流树。当请求分配数据比如malloc(MemoryAllocator,存储空间分配函数)时,调用一个例程以建立树。确定调用栈的一种方法是走查(walk)所述栈来确定malloc时的调用顺序。另一种方法是使用通过设定数据访问指示符生成的硬件信息。还有类似于美国专利申请“Method Determining Computer Program andApparatus for Flows Autonomically Using Hardware Assisted ThreadStack Tracking and Cataloged Symbolic Data”(申请序列号10/803663,代理人案卷号AUS920030548US1,申请日2004年3月18日)的技术,该申请在此全文引为参考。该技术用来识别调用序列,下面称为调用栈。该树被维持在存储器中,可以通过调用(比如对读出当前线程的调用栈信息的设备驱动器的应用编程接口(applicationprogramming interface(API)调用)被访问。用于维护硬件线程维护的调用栈,并将地址转换为符号名的处理也在下述美国专利申请中有描述″Method and Apparatus for Determining Computer ProgramFlows Autonomically Using Hardware Assisted Thread StackTracking and Cataloged Symbolic Data″,申请序列号10/803663,代理人案卷号AUS920030548US1,申请日2004年3月18日。从设备驱动器取出的调用栈被送往弧流(arcflow)程序,弧流程序使栈走进(walk into)其面向线程的树。该处理在下述美国专利申请中有描述″Method and System for Merging Event-Based Data and SampledData Into Postprocessed Trace Output″,申请序列号09/343,438,代理人案卷号AT9-98-850,申请日1999年6月30日。一种方法涉及指示开始区域、结束区域以及超过结束区域的一个用于标记的字节。另外,其它的统计数据也可以被保存在该存储区中。可以维护涉及使用其它硬件辅助能力的其它统计数据的例子、访问次数、高速缓存未命中、周期等等。
现在看图18,其中图示了根据本发明的一个优选实施例,数据高速缓存所遵循的处理的流程图。图18所图示的处理可以被实现在一个数据高速缓存比如图2所示的数据高速缓存216中。
该处理开始于接收表示访问存储单元中的数据的指令执行已完成的信号(步骤1800)。该信号一般是从完成缓冲器接收的。在存储器中保存更新信息(步骤1802),之后结束处理。在数据高速缓存中保存在寄存器中存储的信息。该信息可以被保存在页表中,也可以在另一个存储器中(比如影子高速缓存中)设置数据访问指示符。保存在页表中的信息一般包含指令所访问的数据作出的任何变化。而在其它存储器中保存的信息涉及设置一个数据访问指示符,来指示已经访问过存储单元。
现在看图19,其中图示了根据本发明的一个优选实施例,当在运行时间内发生动态存储器分配时,用于获取调用栈信息的处理的流程图。图19所示的处理可以被实现为软件。该处理开始于检测动态存储器分配(步骤1900)。当一个指令要求分配存储器时,在运行时间内请求动态存储器分配。接下来,获取调用栈信息(步骤1902)。然后,识别被分配的存储器(步骤1904)。接下来,标记用于报告的存储器(步骤1906),之后结束处理。标记存储器以用于报告,以使硬件比如数据高速缓存知道何时标记对所分配存储器中的数据的访问。存储器分配可以是这样的存储器分配例程分配比规定的要多的存储器,以允许查错。例如,存储器分配例程可以分配一个额外的字节,标记开始地址、结束地址和超过结束地址的一个字节。换句话说,如果发生了对这些被标记地址的访问,则这些被标记的部分会使数据访问指示符被设置。在这些例子中,标记超过结束地址的一个字节,使得对该存储器位置的访问导致数据访问指示符被设置。这样,判断是否已分配了足够的存储器供使用。如果在程序执行期间设置了该数据访问指示符,那么,由于在所分配的存储区外发生了访问,已分配的存储器可能不够。
现在看图20,其中图示了根据本发明的一个优选实施例,当存储器被解除分配时,发送有关在程序执行期间发生的数据访问的信息的处理的流程图。图20所示的处理可以被实现为软件。
该处理开始于检测到存储器解除分配(步骤2000),比如释放请求。接下来,收集标识对被分配存储器中的数据的访问的信息(步骤2002)。然后,发送访问数据和调用栈信息以供处理(步骤2004),之后结束处理。该数据被发送给软件工具用于处理。步骤2004可以涉及将数据置于可由该软件工具访问的位置。
在这些例子中,当存储器被解除分配时,数据被实时发送。可以收集信息并发送以供处理的其它时间包括由监视过程执行的采样。在其它情况下,可以在程序已完成执行之后发送所述信息。标识对数据的访问的信息可以包括不同于存储单元的标识的信息。例如,该信息还可以包括对请求分配存储器的代码的标识,以及被分配的存储器的大小。另外,可以使用在本申请所引用的申请中描述的硬件辅助机制来记录对存储单元的访问次数。
现在看图21,其中图示了根据本发明的一个优选实施例,产生一个调用流树以标识未被初始化或者访问的区域的处理的流程图。可用标识代码覆盖的软件工具来实现图21所示的处理。该处理使用在图19和图20中收集的信息来产生调用流树,以标识没有被初始化或者访问的区域。该调用流树还包括有关已被访问的存储单元的信息,以及没有被访问的存储单元的信息。
当接收到访问数据和调用栈信息时开始该处理(步骤2100)。接下来,处理接收到的数据和调用栈信息(步骤2102)。然后,产生标识调用方和分配存储器的代码的调用流树(步骤2104)。接下来,生成包含数据访问信息的叶节点ID数据(步骤2106),之后该处理结束。将数据区的访问信息置入与分配了其中的数据被访问的存储器的节点相关联的叶节点中。
使用有关对数据区的访问的覆盖,本发明的机制提供有关没有被初始化、没有被访问或者已被访问的数据区的信息。在识别这些数据区时,可以按照一定的方式标记或显示初始源代码,以指示哪些数据区已被访问,哪些数据区尚未被访问。对于数据的动态分配,发生了动态存储器分配的源代码部分可以被标记,使得当在执行期间分配的存储器区域中发生访问时,这些存储器区域使数据访问指示符被标记。另外,可以标记代码中的指令,使得硬件在静态数据结构被访问时设置指示符。
现在看图22,其中图示了根据本发明的一个优选实施例,标识数据区的覆盖的图形报告。在此例子中,报告2200表示了区域2202中的数据访问覆盖。该区域表示出了静态数据区域。区域2202中的部分2204、2206和2208是其中发生了数据访问的存储单元。通过定位在代码执行期间设定的数据访问指示符来标识这些部分。
调用流树2210是调用流树的一个例子,其中,节点D代表如区域2212中所示的动态分配存储器的代码部分。区域2212中的该信息是位于与调用流树2210中的节点D相关联的叶节点中的信息。区域2212中的部分2214表示了被访问过的区域2212的部分。
现在看图23,其中图示了根据本发明的一个优选实施例,产生显示信息的过程的流程图。图示于图23的过程可以被实现为用于确定数据访问的覆盖的软件工具。
该过程开始于获取静态和动态数据的数据访问信息(步骤2300)。该信息包括获取分配的用于代码的执行的数据访问指示符。所获取的其它信息包括如上所述在存储器的动态分配期间产生的调用流树。
接下来,生成用于对静态和动态数据的访问的覆盖映像图(coverage map)(步骤2302)。然后,显示该覆盖映像图(步骤2304),之后结束处理。该覆盖映像图类似于图22中的报告2200。报告程序可以支持在报告结构中使用偏移量。例如,可以使用c\programfiles\appl.exe(func1100)来表示在func1中从位置100发出了malloc。
处理器总线速度和存储器访问明显慢于处理器速度。更多的情况是数据处理系统的性能受到处理器访问的约束或者限制,而不是处理器速度的约束或限制。这种现象的结果是多级高速缓存(multi-levelcaching)的使用,以及试图将数据预先取入这些高速缓存,以更快地访问数据。但是,预取的努力通常是代码或者跨步驱动的,不能较好地处理与数据相关的动态访问。大多数现有的方法要求编译器或者编程者在代码流中建立预取提示。一旦生成目标代码,则这些提示给出允许预取的信息。但是,这种系统几乎没有提供改变代码的机会。例子有Java对象中的用于碎片收集(garbage collection)或者指针跟踪(pointer chasing)的跟踪基准(chasing references)。
本发明的机制通过使用硬件辅助改进了预取处理。使用元数据,预取指示符可以与数据相关。例如,预取指示符数据可以指明将该数据当作一个要预取出的指针处理。预取指示符本身可以是一个指向数据结构的指针。当将该数据装入高速缓存时,处理器检测指针预取条件,并预取出该数据所指向的高速缓存行。
现在看图24,其中图示了使用元数据将数据预取入高速缓存的处理的流程图。在这些例子中,图24所示的处理可以被实现到一个装入/存储单元中。在这些例子中,被预取的数据是指针。
该过程开始于装入一个指令(步骤2400)。接下来,判断用于预取的元数据是否与指令关联(步骤2402)。在这些例子中,元数据是一个与一个指令相关联的预取指示符。
如果用于预取的元数据与指令相连,则判断硬件是否决定预取数据(步骤2404)。在一个优选实施例中,指令高速缓存判断指令高速缓存何时以及是否投机性地(speculatively)预取。例如,该指令高速缓存可以判断其没有待完成的高速缓存未命中(cache miss),并具有已经相当长时间没有被使用的可以被替换的高速缓存条目。在这种情况下,指令高速缓存投机性地预取。但是,如果指令高速缓存具有待完成的未命中,和/或没有方便的高速缓存行进行替换,它就不可以进行投机性地预取。可以对高速缓存未命中的数量和/或可替换的高速缓存行的数量设置一个阈值,以判断在存在预取指示符时,指令高速缓存是否要预取数据。例如,如果待完成的高速缓存未命中少于选定的阈值,则进行预取。在这些说明性的例子中,如果希望替换高速缓存行并且如果选择来替换的高速缓存行的数量大于选定的阈值,也可以进行预取。所述装入存储单元可以发出向高速缓存单元进行投机性装入的请求,但是由高速缓存单元判断是否实际进行预取。
或者,取决于硬件的实现,装入存储单元可以判断是否向高速缓存单元进行投机性装入。如果硬件决定预取数据,则使用与指令相关的元数据将数据预取入高速缓存(步骤2406)。在这些例子中,数据是指针。该指针是指向数据结构或者数据块的指针。接下来,将指令发往一个单元进行处理(步骤2408),之后结束该过程。
回头看步骤2404。如果硬件决定不预取数据则过程返回如上所述的步骤2408。在步骤2302,如果用于预取的元数据不与指令相关联,则过程前进到如上所述的步骤2408。在这些例子中,在硬件发出关于应当预取的指示之前、同时或者之后,硬件可以将指令发送给用于处理的单元。
除了预取指向数据结构或者数据块的指针之外,本发明的机制提供了从数据结构内的存储单元预取数据的能力。与指针相结合的跨距(stride)或者偏移量可以用来标识要预取的数据。或者,可以用地址来标识所需的数据的位置。
现在来看图25,其中根据本发明的一个优选实施例,描述了图示包括对要从开始点预取出什么数据的标识的元数据的处理的流程图。图示于图25的过程可以被实现到一个装入存储单元比如图2中的装入存储单元228中。
该过程开始于检测表示预取的元数据(步骤2500)。该元数据可以包括对于要从指针所标识的数据结构中预取什么数据的标识。该元数据可以包括指针形式的预取指示符。该元数据还可以包括使用偏移量或者地址对数据本身的标识。根据高速缓存单元的状态来判断是否应进行预取(步骤2502)。这些例子中的预取操作是投机性的,根据高速缓存单元的状态选择性地执行所述处理。例如,如果发生了超过一定数量的高速缓存未命中,则不进行预取,过程结束。
在步骤2502,如果发生了预取操作,则转入存储器中用于预取的选定点(步骤2504)。可以在元数据中用指针和偏移量或者跨距,或者存储器地址,来标识该选定点存储器。接下来,从存储器中的选定点将数据预取到高速缓存中(步骤2506),之后过程结束。见步骤2502,如果没有发生预取操作,则过程结束。
这样,本发明提供了一种改进的方法、设备和计算机指令,用于对代码覆盖提供硬件辅助。本发明的机制允许监视指令的执行和在执行程序时对存储单元的访问。提供访问指示符来指示指令的执行或者对存储单元中的数据的访问。这些指示符的设定由硬件比如处理器中的不同部件来执行。这样,软件工具可以在获得和分析覆盖数据时有更佳的覆盖率,并避免改变被测试的代码。
另外,对于在确定程序执行中的覆盖方面提供辅助的硬件来说,上述流程图所示的步骤提供了可由硬件中的不同部件执行的处理的逻辑流程。具体地,这些步骤可以被实现为处理器中的微代码或者硬件逻辑。在这些例子中,微代码是直接控制处理器的最低层指令。单个机器语言指令一般转换为几个微代码指令。微代码可以是硬件形式或者软件形式。在许多现代处理器中,微代码被硬连线到处理器。
重要的是要注意到,尽管对本发明的描述是在全功能数据处理系统的上下文中进行的,本领域的普通技术人员知道,本发明的处理过程能够以指令的计算机可读介质的形式以及多种形式分布,无论实际用于进行所述分布的信号承载介质的具体类型如何,本发明都同样适用。计算机可读介质的例子包括可记录类型的介质,比如软盘、硬盘驱动器、RAM、CD-ROM、DVD-ROM,以及传输类型的介质,比如数字和模拟通信链路,使用诸如射频和光波传输等传输形式的有线或者无线通信链路。计算机可读介质可以采用编码格式的形式,所述编码格式被解码以实际用于具体的数据处理系统。
上面对本发明的说明是为了解释和说明的目的,不是要穷尽本发明或者将本发明限于所公开的形式。对于本领域普通技术人员,许多修改和变化都是显而易见的。例如,重要的是注意到,不同的处理器架构可以将本申请中所说明的功能以各种用来在个单元之间传输信息的机制分布到不同的单元中。另外,尽管描述了具体的处理器单元作为对本发明的功能的实现,但是这些不同的功能可以被结合到硬件中的其它处理器单元中。另外,附图中所描述的步骤既可以被实现为硬件电路,又可以被实现为处理器内的不同处理器单元专用的指令,比如由执行单元使用的微代码。
上述实施例的选择和描述是为了更好地解释本发明的原理和其实际应用,并使本领域的普通技术人员能够理解本发明的针对所能想到的具体用途进行了各种适当的修改的各种实施例。
权利要求
1.数据处理系统中用于提供代码的覆盖数据的方法,包括获得包含与该代码相关的指令访问指示符的覆盖数据;识别由数据处理系统中的处理器响应处理器对该代码的执行而设置的特定指令访问指示符,以形成设定指令访问指示符,其中,每一个设定指令访问指示符与所述代码的一部分相关联;以及产生该覆盖数据的一个表达,其中,在该表达中标识所述设定指令访问指示符。
2.如权利要求1所述的方法,还包括识别在处理器执行代码时仍然未设定的未设定指令访问指示符,其中,在所述表达中标识所述未设定指令访问指示符。
3.如权利要求2所述的方法,其中,使用第一颜色在所述表达中标识所述设定指令访问指示符,使用第二颜色在所述表达中标识所述未设定指令访问指示符。
4.如权利要求2所述的方法,其中,使用图形符号来在所述表达中标识所述设定指令访问指示符,使用图形符号在所述表达中标识所述未设定指令访问指示符。
5.如权利要求2所述的方法,其中,响应一个事件执行所述产生步骤。
6.如权利要求5所述的方法,其中,所述事件是下述事件中的至少一个代码执行的完成,时间届满,代码中选定类型的指令的执行。
7.如权利要求1所述的方法,其中,所述代码部分是代码中的单个指令,其中,代码中的每一个指令与一个不同的指令访问指示符相关联。
8.如权利要求1所述的方法,其中,所述代码部分是代码中的子例程。
9.如权利要求1所述的方法,其中,所述代码部分是代码中的分支指令。
10.用于提供代码的覆盖数据的数据处理系统,包括获取装置,用于获得包含与该代码相关的指令访问指示符的覆盖数据;识别装置,用于识别由数据处理系统中的处理器响应处理器对该代码的执行而设置的特定指令访问指示符,以形成设定指令访问指示符,其中,每一个设定指令访问指示符与所述代码的一部分相关联;以及产生装置,用于产生该覆盖数据的一个表达,其中,在该表达中标识所述设定指令访问指示符。
11.如权利要求10所述的数据处理系统,其中所述识别装置是第一识别装置,还包括第二识别装置,用于识别在处理器执行代码时仍然未设定的未设定指令访问指示符,其中,在所述表达中标识所述未设定指令访问指示符。
12.如权利要求11所述的数据处理系统,其中,使用第一颜色在所述表达中标识所述设定指令访问指示符,使用第二颜色在所述表达中标识所述未设定指令访问指示符。
13.如权利要求11所述的数据处理系统,其中,使用图形符号来在所述表达中标识所述设定指令访问指示符,使用图形符号在所述表达中标识所述未设定指令访问指示符。
14.如权利要求11所述的数据处理系统,其中,响应一个事件执行所述产生装置。
15.如权利要求14所述的数据处理系统,其中,所述事件是下述事件中的至少一个代码执行的完成,时间届满,代码中选定类型的指令的执行。
16.如权利要求11所述的数据处理系统,其中,所述代码部分是代码中的单个指令,其中,代码中的每一个指令与一个不同的指令访问指示符相关联。
17.如权利要求11所述的数据处理系统,其中,所述代码部分是代码中的子例程。
18.如权利要求11所述的数据处理系统,其中,所述代码部分是代码中的分支指令。
19.计算机可读介质中的用于提供代码的覆盖数据的计算机程序产品,包括第一指令,用于获得包含与该代码相关的指令访问指示符的覆盖数据;第二指令,用于识别由数据处理系统中的处理器响应处理器对该代码的执行而设置的特定指令访问指示符,以形成设定指令访问指示符,其中,每一个设定指令访问指示符与所述代码的一部分相关联;以及第三指令,用于产生该覆盖数据的一个表达,其中,在该表达中标识所述设定指令访问指示符。
20.如权利要求19所述的计算机程序产品,还包括第四指令,用于识别在处理器执行代码时仍然未设定的未设定指令访问指示符,其中,在所述表达中标识所述未设定指令访问指示符。
21.如权利要求20所述的计算机程序产品,其中,使用第一颜色在所述表达中标识所述设定指令访问指示符,使用第二颜色在所述表达中标识所述未设定指令访问指示符。
22.如权利要求20所述的计算机程序产品,其中,使用图形符号来在所述表达中标识所述设定指令访问指示符,使用图形符号在所述表达中标识所述未设定指令访问指示符。
23.如权利要求20所述的计算机程序产品,其中,响应一个事件执行所述第三指令。
24.如权利要求23所述的计算机程序产品,其中,所述事件是下述事件中的至少一个代码执行的完成,时间届满,代码中选定类型的指令的执行。
全文摘要
本发明涉及对代码覆盖使用硬件辅助的自主测试条件反馈方法和设备。具体地,本发明提供了一种用于提供代码的覆盖数据的方法、设备和计算机指令。获得包含与代码相关的指令访问指示符的覆盖数据。识别由数据处理系统中的处理器响应处理器对代码的执行而设置的特定指令访问指示符,以形成设定指令访问指示符。将每一个设定指令访问指示符与所述代码的一部分相关联。产生该覆盖数据的一个表达。在该表达中标识所述设定指令访问指示符。该表达例如可以是图形表达。
文档编号G06F11/36GK1677364SQ200510054289
公开日2005年10月5日 申请日期2005年3月21日 优先权日2004年3月22日
发明者罗伯特·托德·迪姆普西, 弗兰克·埃里奥特·莱维尼, 罗伯特·约翰·乌尔克哈特 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1