经由高速缓存的有效断点检测的制作方法

文档序号:18516511发布日期:2019-08-24 09:29阅读:165来源:国知局
经由高速缓存的有效断点检测的制作方法

当在软件应用的开发期间编写代码时,开发人员通常花费大量时间“调试”代码以找到代码中的运行时错误。在这样做时,开发人员可以采取若干方法来对源代码错误进行再现和本地化,诸如基于不同输入来观察程序的行为,插入调试代码(例如,打印变量值、追踪执行分支等),暂时删除代码部分等。追踪运行时错误以查明代码错误可能会占用应用开发时间的很大一部分。

已经开发了许多类型的调试应用(“调试器”)以便协助开发人员进行代码调试过程。这些工具使开发人员能够跟踪、可视化和改变计算机代码的执行。例如,调试器可以将代码指令的执行可视化,可以在代码执行期间的不同时间呈现变量值,可以使开发人员能够改变代码执行路径,和/或可以使开发人员能够在感兴趣的代码元素上设置“断点”和/或“观察点”(在执行期间到达时,其导致代码的执行被暂停)等等。

一种新兴形式的调试应用启用了“时间旅行”、“反向”或“历史”调试,其中程序的执行由跟踪应用记录/跟踪到一个或多个跟踪文件中,然后所述一个或多个跟踪文件可以被用来稍后重放程序的执行,以用于进行前向和后向分析。例如,“时间旅行”调试器可以使开发人员设置前向断点/观察点(像传统调试器那样)以及反向断点/观察点。

在实现“时间旅行”调试器中的一个挑战涉及如何在以灵活且高效的方式重放跟踪文件期间检测何时遇到感兴趣点(例如,断点/观察点)。已经探索的一种在重放期间用于追踪兴趣点的机制是使用处理器实现的硬件断点。虽然高性能,但是硬件断点的使用具有严重限制可以同时监视的断点数量(例如,intel处理器中的四个)的缺点,并且固有地将调试器实现绑定到特定支持的硬件。

已经探索的另一种机制是使用软件断点,在其中,访问存储器的每个跟踪操作(例如,对存储数据的存储器的读取或写入,或者从存储程序代码的存储器执行的读取/提取)都附带有附加代码指令,其检查访问是否会导致遇到断点。然而,附带具有严重的缺点,即无论该存储器访问是否实际遇到断点,在每次存储器访问时都会检查是否出现断点。在许多环境中,附带的代码指令的执行导致针对每次存储器访问都使用数十到数百个附加的处理器周期,这对人类用户可感知的重放性能具有显著的不利影响。



技术实现要素:

本文描述的至少一些实施例涉及使用高速缓存(例如,硬件或仿真处理器的高速缓存或者一些其他高速缓存存储器结构)来检测何时发生对正被监视或监测的存储器地址的访问(例如,用于读取、写入或取出/执行)。换句话说,本文的实施例通过高速缓存的使用提供有效的断点检测,极大地限制了需要执行断点检查的存储器访问操作的数量。如本文所述,实施例使得能够在发生高速缓存未命中时执行断点检查。因此,本文的实施例不是对每个存储器访问都执行断点检查,而是将断点检查限制为仅导致发生高速缓存未命中的存储器访问。与现有解决方案相比,本文的实施例可以在跟踪重放期间检测断点时极大地减少由调试器引起的开销(例如,检查断点发生的额外处理器周期)。

在一些实施例中,通过使用高速缓存来监测存储器位置包括标识要被监测的存储器地址,并且至少基于标识所述存储器地址,将所述存储器地址存储在监测列表中并确定与所述存储器地址重叠的(多个)任何高速缓存行是否已经存在于高速缓存中。如果高速缓存中确实存在(多个)任何这样的高速缓存行,则将它们从所述高速缓存中逐出。当检测到基于存储器访问操作发生高速缓存未命中时,该实施例包括确定基于所述高速缓存未命中导入到所述高速缓存中的另一高速缓存行的一部分是否与存储在所述监测列表中的所述存储器地址重叠。当导入的高速缓存行的所述部分确实与所述存储器地址重叠时,将处理对所述存储器地址的一个或多个监测操作,并从所述高速缓存中逐出所述导入的高速缓存行。

提供本发明内容是为了以简化的形式介绍一些概念,这些概念将在下面的具体实施方式中进一步描述。本发明内容不旨在标识所要求保护的主题的关键特征或必要特征,也不旨在用于帮助确定所要求保护的主题的范围。

附图说明

为了描述可以获得本发明的上述和其他优点和特征的方式,将通过参考附图中所图示的具体实施例来呈现上面简要描述的本发明的更具体的描述。应理解,这些附图仅描绘了本发明的典型实施例,因此不应被认为是对其范围的限制,本发明将通过使用附图利用附加特征和细节进行描述和解释,其中:

图1图示出了助于高速缓存促进有效断点检测的示例计算环境;

图2图示出了使用与执行存储器操作有关的高速缓存的重放组件的示例实施例;

图3图示出了重放组件的示例实施例;

图4图示出了在发生高速缓存未命中时执行断点检查的示例流程图;以及

图5图示出了通过高速缓存的使用来监测存储器位置的方法的示例流程图。

具体实施方式

本文描述的至少一些实施例涉及高速缓存的使用(例如,硬件或仿真处理器的高速缓存或者一些其他高速缓存存储器结构)来检测何时发生对正被监视或监测的存储器地址的访问(例如,用于读取、写入或提取/执行)。换句话说,本文的实施例通过使用高速缓存提供有效的断点检测,极大地限制了需要执行断点检查的存储器访问操作的数目。如本文所述,实施例确保仅在发生高速缓存未命中时才需要执行断点检查。因此,本文的实施例不是对每个存储器访问都执行断点检查,而是将断点检查限制为仅导致发生高速缓存未命中的存储器访问。因此,与现有解决方案相比,本文的实施例可以在跟踪重放期间检测断点时极大地减少由调试器引起的开销(例如,检查断点发生的额外处理器周期)。

具体地,本文的实施例操作来确保从高速缓存中逐出与被监测的(多个)存储器地址相对应的(多个)任何高速缓存行。例如,根据本文的实施例,当定义新断点时,将基于断点要被监测的存储器地址添加到监测列表。另外,如果在定义断点的时刻高速缓存中存在与存储器地址重叠的(多个)任何高速缓存行,则将它们从高速缓存中逐出。当基于对存储器地址的访问而发生高速缓存未命中时,执行断点检查。具体地,将基于高速缓存未命中而导入到高速缓存中的高速缓存行与监测列表中的存储器地址列表进行比较,以确定是否存在重叠。如果没有重叠,那么正常遵循高速缓存未命中,并且允许高速缓存行保留在高速缓存中。然而,如果存在重叠,那么执行一个或多个监测操作(例如,确定是否实际遇到断点,并在遇到断点时处理断点的发生)。此外,如果存在重叠,则从高速缓存中逐出高速缓存行,以便将发生另一个高速缓存未命中——并且将执行另一个断点检查——如果稍后再次访问存储器地址的话。通过这种方式,仅需要对导致发生高速缓存未命中的存储器访问操作执行断点检查,而不是对每个存储器访问操作都执行断点检查。

如在本说明书和权利要求中所使用的,术语“断点”和“观察点”可互换使用,以指代在被遇到时导致重放以中断/暂停可执行代码的重放的感兴趣点。特别地,断点/观察点可以指代与可执行代码的特定部分相对应的存储器位置(例如,代码行、变量定义、函数定义等)和/或与由可执行代码存储的数据相对应的存储器位置(例如,存储该值变量、常量、数据结构等的存储器位置)。因此,断点/观察点可以指代存储的可执行代码的存储器地址和/或由执行代码使用的运行时存储器的存储器地址。

此外,当指代针对断点/观察点而被监测的“存储器地址”时,本文的实施例不限于监测该单个地址处的字节。相反,实施例监测对从该地址开始的任何给定数量的连续字节的访问。因此,本文对监测“地址”或“存储器地址”的任何引用也指代监测从该地址开始的指定数量的字节的范围。

为了实现前述内容,图1图示出了助于高速缓存促进有效的断点检测的示例计算环境100。如所描绘的,实施例可以包括或利用包括计算机硬件的专用或通用计算机系统101,计算机硬件诸如例如一个或多个处理器102、系统存储器103、一个或多个数据存储104、和/或输入/输出硬件105(例如,诸如所描绘的键盘/鼠标硬件105a、联网硬件105b和显示设备105c)。在一些实施例中,计算机系统101及其中的组件可以包括虚拟化环境。

本发明范围内的实施例包括用于承载或存储计算机可执行指令和/或数据结构的物理和其他计算机可读介质。这样的计算机可读介质可以是可由计算机系统101访问的任何可用介质。存储计算机可执行指令和/或数据结构的计算机可读介质是计算机储存设备。承载计算机可执行指令和/或数据结构的计算机可读介质是传输介质。因此,作为示例而非限制,本发明的实施例可以包括至少两种截然不同的计算机可读介质:计算机储存设备和传输介质。

计算机储存设备是存储计算机可执行指令和/或数据结构的物理硬件设备。计算机储存设备包括各种计算机硬件,诸如ram、rom、eeprom、固态驱动器(“ssd”)、闪存、相变存储器(“pcm”)、光盘储存器、磁盘储存器或其他磁储存设备、或者可以被用来以计算机可执行指令或数据结构的形式存储程序代码并且可以由计算机系统101访问和执行以实现本发明所公开的功能性的(一个或多个)任何其他硬件设备。因此,例如,计算机储存设备可以包括所描绘的系统存储器103、可以存储计算机可执行指令和/或数据结构的所描绘的数据存储104、或者诸如处理器内储存器之类的其他储存器,如稍后所讨论的。

传输介质可以包括网络和/或数据链路,其可以被用来承载计算机可执行指令或数据结构形式的程序代码,并且可以由计算机系统101访问。“网络”被定义为能够在计算机系统和/或模块和/或其他电子设备之间传送电子数据的一个或多个数据链路。当通过网络或另一通信连接(硬连线、无线或硬连线或无线的组合)向计算机系统传送或提供信息时,计算机系统可以将该连接视为传输介质。上述的组合也应被包括在计算机可读介质的范围内。例如,输入/输出硬件105可以包括联网硬件105b(例如,硬连线或无线网络接口模块),其连接可以被用来承载计算机可执行指令或数据结构形式的程序代码的网络和/或数据链路。

此外,在到达各种计算机系统组件时,计算机可执行指令或数据结构形式的程序代码可以被自动地从传输介质传送到计算机储存设备(反之亦然)。例如,通过网络或数据链路接收的计算机可执行指令或数据结构可以被缓冲在网络硬件105b内的ram中,然后最终被传送到系统存储器103和/或计算机系统101处的较不易失性的计算机储存设备(例如,数据存储104)中。因此,应该理解,可以将计算机储存设备包括在也(或甚至主要)利用传输介质的计算机系统组件中。

计算机可执行指令包括例如指令和数据,当在(多个)处理器102处被执行时,所述指令和数据使计算机系统101执行特定功能或功能组。计算机可执行指令可以是例如二进制文件、诸如汇编语言之类的中间格式指令、或者甚至是源代码。

本领域技术人员将理解,可以在具有许多类型的计算机系统配置的网络计算环境中实践本发明,包括个人计算机、台式计算机、膝上型计算机、消息处理器、手持设备、多处理器系统、基于微处理器或可编程消费电子产品、网络pc、小型计算机、大型计算机、移动电话、pda、平板电脑、寻呼机、路由器、交换机等。还可以在分布式系统环境中实践本发明,其中通过网络链接(通过硬连线数据链路、无线数据链路或通过硬连线和无线数据链路的组合)的本地和远程计算机系统都执行任务。如此,在分布式系统环境中,计算机系统可以包括多个组成计算机系统。在分布式系统环境中,程序模块可以位于本地和远程存储器储存设备中。

如所图示,数据存储104可以存储表示应用代码的计算机可执行指令和/或数据结构,诸如例如跟踪记录组件106a、跟踪重放组件106b、操作系统107和应用108(包括应用108的可执行代码108a的部分)。数据存储104还可以存储其他类型的数据,诸如一个或多个跟踪文件109。当应用代码正在执行(例如,使用(多个)处理器102)时,系统存储器103可以存储对应的运行时数据,诸如运行时数据结构、计算机可执行指令等。因此,图1将系统存储器103图示为包括运行时记录/重放数据106'(包括重放数据结构106c)、运行时操作系统数据107'和运行时应用数据108'(包括应用108在执行时的运行时变量、数据结构等,以及作为代码部分108a的存储器内副本的运行时代码部分108a')。

跟踪记录组件106a可用于跟踪应用的执行,诸如包括其可执行代码部分108a的应用108,以及将跟踪数据存储在(多个)跟踪文件109中。在一些实施例中,跟踪记录组件106a是独立应用,而在其他实施例中,它被集成到诸如操作系统107、管理程序、调试套件等等之类的另一软件组件中。跟踪记录组件106a也可以存在于完全不同的计算机系统中。因此,跟踪记录组件106a可以跟踪代码在另一计算机系统处的执行。然后,由该跟踪产生的(多个)跟踪文件109可以被传送(例如,使用联网硬件105b)到计算机系统101以用于由跟踪重放组件106b重放。虽然(多个)跟踪文件109被描绘为存储在数据存储104中,但是它们也可以被排他地或临时地记录在系统存储器103中或者在一些其他储存设备处。

图1还包括(多个)处理器102的内部硬件组件的简化表示。如所图示,每个处理器102包括多个处理单元102a。每个处理单元可以是物理的(即,物理处理器核心)和/或逻辑的(即,由支持超线程的物理核心所呈现的逻辑核心,其中在物理核心处执行一个以上应用线程)。因此,例如,即使处理器102在一些实施例中可以仅包括单个物理处理单元(核心),它也可以包括由该单个物理处理单元所呈现的两个或更多处理单元102a。

每个处理单元102a执行由应用(例如,跟踪记录组件106a、跟踪重放组件106b、操作系统107、应用代码部分108a等)所定义的处理器指令,以及从预定义的处理器指令集架构中选择哪些指令。每个处理器102的特定指令集架构基于处理器制造商和处理器模型而变化。通用指令集架构包括来自intel公司的ia-64和ia-32架构、来自先进微型设备公司的amd64架构、以及来自arm控股有限公司的各种高级risc机器(“arm”)架构,但是存在许多其他指令集架构并且可以由本发明使用。通常,“指令”是可由处理器执行的最小外部可见(即,处理器外部)的代码单元。

每个处理单元102a从共享处理器高速缓存102b(即,由处理单元102a共享)获得处理器指令,并基于共享高速缓存102b中的数据、基于寄存器102c中的数据、和/或在没有输入数据的情况下执行处理器指令。通常,共享高速缓存102b是存储系统存储器103的部分的处理器内副本的少量(即,相对于典型量的系统存储器103而言少量)的随机存取存储器。例如,当执行应用108的可执行代码部分108a时,共享高速缓存102b将运行时代码部分108b'的子集存储在共享高速缓存102b的代码高速缓存部分中,并将其他运行时应用数据108'(例如,变量、数据结构等)存储在共享高速缓存102b的数据高速缓存部分中。如果(多个)处理单元102a需要尚未存储在共享高速缓存102b中的数据,那么发生“高速缓存未命中”,并且从系统存储器103提取该数据(可能从共享高速缓存102b中逐出一些其他数据)。寄存器102c是基于硬件的储存位置,其基于(多个)处理器102的指令集架构而被定义。

跟踪重放组件106b通过在(多个)处理器102处执行(多个)跟踪文件109所基于的可执行实体的代码来重放一个或多个跟踪文件109,同时在适当的时间向该代码供应来自(多个)跟踪文件109的跟踪数据(例如,寄存器值、存储器值等)。因此,例如,跟踪记录组件106a可以在(多个)处理器102处记录应用108的一个或多个代码部分108a的执行,同时将跟踪数据(例如,由代码指令读取的存储器值、寄存器值供应的代码指令)存储在(多个)跟踪文件109中。然后,跟踪重放组件106b可以在(多个)处理器102处重新执行(多个)代码部分108a,同时向该代码供应来自(多个)跟踪文件109的跟踪数据,使得代码以与它在跟踪时间相同的方式被执行。

跟踪重放组件106b还通过执行与高速缓存未命中有关的断点检查来在重放期间检测代码中的断点。例如,跟踪重放组件106b可以在处理器处使用高速缓存102b,或者可以使用一些其他高速缓存,诸如存储在系统存储器103中的高速缓存作为重放数据结构106c。

图2图示出了使用与执行存储器操作有关的高速缓存的重放组件的示例实施例200。特别地,图2的实施例200图示出了在存储器202上执行读取201a和/或写入201b操作的重放组件201(例如,诸如图1的跟踪重放组件106b)。存储器202可以包括图1的系统存储器103的一部分。在一些实施例中,存储器202包括由重放组件201维持的数据结构(例如,诸如重放数据结构106c),该数据结构再现在跟踪期间实际观察到的存储器读取和/或写入。因此,例如,存储器202可以包括重放数据结构106c,其包括可由被跟踪的可执行实体寻址的整个存储器副本、再现被跟踪的实体看到的读取的高速缓存数据结构等。

存储器202包括存储可执行实体的代码的存储器(例如,代码部分108a')以及由可执行实体的代码使用的操作存储器。因此,读取201a操作可以包括从存储器202获得可执行指令的代码读取,和/或获得存储在存储器202中的运行时数据(例如,变量或其他数据结构)的数据读取。写入201b操作可以包括将运行时数据存储在存储器202中的数据写入。虽然图2描绘了读取201a和写入201b操作,但是应当理解,当存储器访问操作正在访问代码数据时,处理器可以将操作视为“执行”或“提取”操作。如在本说明书和权利要求书中所使用的,读取201a操作应被解释为包括在适当情况下的“执行”和/或“提取”存储器访问操作,诸如当操作正在访问代码数据时。

如图2中所描绘的,重放组件201通过高速缓存203执行读取201a和写入201b操作。通常,高速缓存203以与处理器高速缓存(例如,图1的高速缓存102b)类似的方式操作。因此,通常,高速缓存203存储多个高速缓存行,每个高速缓存行可以与(例如,在系统存储器103中的)存储器地址相关联,并且存储从该存储器地址开始并且可能跨越若干存储器地址(取决于高速缓存行的大小)的存储器的一部分的高速缓存副本。因此,每个高速缓存行可以包含存储在多个存储器地址中的数据。

除了以常规方式使用高速缓存203之外,重放组件201还以促进仅在发生高速缓存未命中时执行断点检查的方式使用高速缓存203。具体地,重放组件201确保包括与存储在监视或监测列表中的存储器地址重叠的数据的任何高速缓存行(例如,重放数据结构106c)保持从高速缓存中被逐出。因此,重放组件201在该断点首次被添加到监测列表时逐出与作为断点的主题的存储器地址重叠的(多个)任何高速缓存行,并且还逐出当它与监测列表中的任何存储器地址重叠时由于高速缓存未命中而导入的任何高速缓存行。这将结合图3进行描述,图3图示出了重放组件300的示例实施例(例如,对应于图1的跟踪重放组件106b或图2的重放组件201)。

值得注意的是,虽然为了便于描述,描述了通过高速缓存的使用来监测存储器位置的实施例,但是在重放(即,跟踪重放组件106b/重放组件300)的上下文中,将理解,这些实施例也适用于记录(即,跟踪记录组件106a)的上下文中。例如,在记录时,调试应用也可以监测存储器位置以标识遇到断点/观察点。因此,结合跟踪重放组件106b/重放组件300描述的组件和动作同样适用于跟踪记录组件106a。

如图3中所描绘的,重放组件300可以包括多个子组件,诸如例如,存储器访问组件301、断点组件302、监测列表组件303和/或高速缓存管理组件304。所描绘的子组件302-304的标识和布置仅仅是作为描述辅助的一个示例,并且本领域普通技术人员将认识到重放组件300的子组件的特定标识和数量可以基于实现而有很大变化。

存储器访问组件301通过高速缓存203对存储器202执行存储器操作,诸如读取201a和/或写入201b,以便基于跟踪文件109进行重放。例如,基于代码(例如,代码部分108a)被重放和/或基于(多个)跟踪文件109中的数据,存储器访问组件301可以执行存储器读取201a和/或写入201b到存储器202。

断点组件302管理诸如正被重放的代码部分108a上的用户定义的断点/观察点之类的在调试应用(例如,包含重放组件300的应用)中定义的断点,或存储由代码部分108a定义的数据结构或变量的存储器地址。因此,当断点/观察点被定义时,断点组件302标识存储器202中感兴趣的对应存储器地址。在标识感兴趣的存储器地址之后,断点组件302使用监测列表组件303将该地址存储在监测列表中。如上所提及,术语“存储器地址”还指代从该存储器地址开始的连续字节范围。如此,断点组件302可以在监测列表中存储要监测的基地址,以及从该地址开始的要监测的字节数量。断点组件302还请求在不再需要存储器地址时——诸如当移除用户定义的断点/监测点时——从监测列表中移除存储器地址。

如结合图4和高速缓存管理组件304的描述更详细地讨论的,断点组件302还使用监测列表在发生高速缓存未命中之后执行断点检查,确定是否可能遇到过断点/观察点。当可能遇到过断点/观察点时,断点组件302还可以执行一个或多个监测操作,包括确定是否实际上遇到断点以及从高速缓存中移除被导入的高速缓存行的操作。

监测列表组件303从断点组件302接收一个或多个感兴趣的存储器地址,并将那些地址中的每一个(以及可能的从每个地址开始要监测的字节数量)存储在监测列表中,诸如由跟踪重放组件106b将重放数据结构106c存储在系统存储器103中。监测列表组件303还根据来自断点组件302的请求从监测列表中移除感兴趣的存储器地址。监测列表中的地址可以以促进诸如快速搜索、高效的存储器使用、添加/删除地址的速度等之类的实现目标的任何适当的数据结构进行存储,诸如数组、链表、分层结构等。

在存储器访问组件301的操作期间,高速缓存管理组件304将存储器202的部分导入到高速缓存203中,并在适当时从高速缓存203中逐出存储器202的部分。如上所述,高速缓存203通常以类似于处理器高速缓存的方式操作。因此,高速缓存管理组件304管理高速缓存203,使得它将最近访问的存储器202的部分存储在高速缓存203中的可寻址数据行中。如此,当存储器访问组件301访问(例如,执行读取201a或写入201b操作)存储器202中尚未存在于高速缓存203中的存储器地址时,发生“高速缓存未命中”,并且从该存储器地址开始(并且可能跨越多个存储器地址)的数据的一部分被导入到高速缓存203的一行中。然后,由存储器访问组件301对高速缓存203中的该行数据执行对该存储器地址的后续操作。如果在高速缓存203中的所有行都是满的时发生高速缓存未命中,那么将(例如,最近最少被访问的)一行“逐出”回到存储器202,使得可以将新数据导入到高速缓存203中。

然而,除了执行这些标准高速缓存功能之外,高速缓存管理组件304还结合断点组件302和监测列表组件303进行操作,以确保从高速缓存203中逐出与作为断点/观察点的主题的存储器地址(包括从该存储器地址开始的指定数量的连续字节)重叠的被导入到高速缓存203中的(多个)任何高速缓存行(无论是否实际上遇到了断点/观察点)。如前所指示,实施例操作来确保包括与存储在监测列表中的存储器地址重叠的数据的任何高速缓存行保持从高速缓存中被逐出。

因此,结合断点组件302标识新的断点/观察点,并且监测列表组件303将与该断点/观察点相对应的感兴趣的存储器地址添加到监测列表,如果与该存储器地址重叠的(多个)任何高速缓存行存在于高速缓存203中的话,高速缓存管理组件304从高速缓存203中逐出与该存储器地址重叠的(多个)任何高速缓存行。这确保了在下次与存储器地址重叠的高速缓存行稍后被导入到高速缓存203中时将发生高速缓存未命中。注意,当它被添加到监测列表时,存储器地址(包括从该地址开始的字节数量)可以与高速缓存中已有的单个高速缓存行、或者高速缓存中已有的多个高速缓存行重叠,并且因此可以逐出多个高速缓存行。例如,在一个地址处监测的字节数量、高速缓存行大小和/或高速缓存行中感兴趣的存储器地址(包括字节范围)开始,与感兴趣的单个地址相关的数据可以跨越两个(或更多)高速缓存行。

另外,在检测到发生高速缓存未命中之后,高速缓存管理组件304向断点组件302通知高速缓存未命中(使得断点组件302可以确定是否存在重叠并且可能执行一个或多个监测操作)。然后,基于从断点组件302接收的指令,当该高速缓存行与监测列表中的地址重叠时,高速缓存管理组件304逐出与高速缓存未命中有关的被导入到高速缓存203中的高速缓存行。

例如,图4图示出了在发生高速缓存未命中之后执行断点检查的示例流程图400。流程图400在框401处开始并且前进到检测到高速缓存未命中的框402。例如,框402可以在存储器访问组件301对尚未高速缓存在高速缓存203中的存储器地址执行存储器访问操作(例如,读取201a和/或写入201b)时发生。因此,发生高速缓存未命中,并且在框403处,高速缓存管理组件304将高速缓存行导入到高速缓存203中,该高速缓存行包含来自存储器202中与存储器访问操作相对应的数据。

基于框402和/或403的出现,高速缓存管理组件304还向断点组件302通知高速缓存未命中。因此,在判定框404处,断点组件302然后执行重叠检查以确定是否已经遇到断点(即,来自判定框404的“是”)或尚未遇到断点(即,来自判定框404的“否”)。重叠检查包括断点组件302将监测列表中的地址与在框403中被存储在被导入的高速缓存行中的存储器地址进行比较。如果存在重叠,那么可能已经遇到断点。如果没有重叠,则尚未遇到断点。

重叠检查可以包括对与高速缓存行相关联的高速缓存行地址的检查,和/或对存储在高速缓存行中的数据也覆盖的任何附加地址的分析(例如,在存储器中也将在高速缓存行中的高速缓存行地址之后的那些地址)。因此,当确定监测列表中的被监测地址是否与导入的高速缓存行重叠时,重叠检查可以包括确定导入的高速缓存行的高速缓存行地址是否对应于先前在被监测地址被添加到监测列表时从高速缓存中逐出的高速缓存行的高速缓存行地址,和/或确定被监测地址是否是高速缓存行所覆盖的地址——即使它不是高速缓存行地址。

如所描绘的,如果断点组件302确定断点不与高速缓存行重叠(即,因为监测列表中的地址与导入的高速缓存行中的地址不重叠),则流程图400在405处结束。在这种情况下,由于导入的高速缓存行保留在高速缓存203中,因此正常遵循高速缓存未命中。因此,例如,断点组件302可以通知高速缓存管理组件304将导入的高速缓存行留在高速缓存203中,所以管理组件304将导入的高速缓存行留在高速缓存203中。

然而,如果断点组件302确定可能已经遇到断点(即,因为监测列表中的地址与导入的高速缓存行中的地址重叠),则流程图400前进到执行(多个)监测操作的框406和逐出高速缓存行的框407,然后在框408处结束。注意,即使被导入到高速缓存中的高速缓存行可能包括与位于监测列表中的特定存储器地址重叠的存储器地址,正在重放的代码实际上也可能无法从高速缓存行访问该特定存储器地址(并且因此实际上可能不会遇到断点)。这是因为,如前所讨论的,高速缓存行可以包含与多个存储器地址相对应的数据,包括特定存储器地址。因此,由于对除特定存储器地址之外的存储器地址的存储器访问操作,正被监视的特定存储器地址可能已被导入到高速缓存行中。

在框406中,断点组件302执行一个或多个监测操作。(多个)这些操作可以包括确定是否实际遇到作为断点/观察点的主题的被监测存储器地址,报告该遭遇(例如,在调试应用中的用户界面处)和/或导致由框407逐出该高速缓存行。被执行的(多个)特定操作可以基于导致高速缓存未命中的存储器访问操作(读取201a或写入201b)的性质而变化。

例如,如果导致高速缓存未命中的操作是从数据读取或写入数据,则(多个)操作可以1)将(多个)处理器102置于详细模式中,一个处理器指令使(多个)处理器102单步操作(single-stepping),2)检查指令的执行日志(由于(多个)处理器被置于详细模式而产生)以确定是否遇到断点(即,确定被监测存储器地址是否是读取或写入),以及3)将高速缓存行逐出(框407)。(多个)操作还可以报告结果(例如,在调试应用的用户界面处)。因此,这些操作将导致在读取或写入发生之后发生对数据进行读取或写入的断点检查。然而,这些操作可以改变,以使相反的情况成立(即,使断点检查在读取或写入之前发生)。

在一些情形中,框406的“监测操作”可以确定遇到断点而没有实际进行任何监测。例如,当从主题存储器地址开始的被监测的字节范围覆盖整个导入的高速缓存行时,监测操作可以确定遇到断点并且执行适当类型的操作(例如,被监测存储器地址正被监测以进行读取,并发生读取)。因此,尽管在本说明书中被称为“监测操作”,但是框406中的操作可以包括用于确定是否遇到断点的(多个)任何操作——即使没有执行实际监测。

在框406中执行(多个)监测操作之后,在框407中,高速缓存管理组件304在从断点组件302通知这样做时逐出高速缓存203中的导入的高速缓存行。值得注意的是,导入的高速缓存行从高速缓存203中移除——无论是否实际遇到断点(如框406中的(多个)监测操作所确定的)。这是因为重放组件300确保从高速缓存中逐出与任何被监视的存储器地址重叠的任何高速缓存行,从而每当存在与被监视的存储器地址重叠的高速缓存未命中时执行针对每个被监视存储器地址的断点检查。

一些实施例可以实现一些高速缓存优化以通过使用高速缓存来进一步提高监测存储器位置的性能,和/或减少高速缓存使用。例如,一些实施例可以将高速缓存行导入到指定用于监测的存储器中,而不是导入到正常高速缓存中。因此,“逐出”可以包括取消引用指定存储器中的高速缓存行的位置或以其他方式使其无效,而不是执行实际的高速缓存逐出操作。其他实施例可以将高速缓存行导入到高速缓存中,但是然后将其移动到另一个临时存储器位置以进行监测,并从该临时存储器位置逐出它。因此,术语“逐出”应该被解释为将使高速缓存行无效的任何操作,无论该逐出是否实际上对高速缓存执行逐出操作。

一些实施例还合并高速缓存未命中。例如,如果频繁访问高速缓存行(例如,作为循环、功能等的一部分),则一些实施例可以避免在这些频繁访问期间逐出高速缓存行,在高速缓存行存在于高速缓存时对高速缓存行执行监测操作,然后在频繁访问停止后逐出它。可以使用不同的启发法来确定是否应将高速缓存行视为频繁访问。例如,在线程堆栈上的针对数据断点的高速缓存行可以在执行拥有该堆栈帧的函数时被保留,在函数内的针对断点的高速缓存行可以在执行该函数的代码时被保留,等等。

鉴于前述,图5图示出了用于通过使用高速缓存来监测存储器位置的方法500的示例流程图。与结合图1-图4描述的组件和数据相结合来描述图5。虽然方法500被图示为一系列动作,但方法500中的动作的特定顺序不限于所示出的排序。

如所图示,方法500包括标识要被监测的存储器地址的动作501。例如,动作501可以包括断点组件302标识断点/观察点已被定义(例如,通过在调试软件应用处的用户输入)。结合所定义的观察点,断点组件302可以标识作为断点/观察点的结果而要被监测的存储器地址。存储器地址可以包括与正被重放的存储代码(例如,运行时代码部分108a')相对应的存储器地址或者与由代码所使用的运行时存储器(例如,运行时应用数据108')相对应的存储器地址。

方法500还包括将存储器地址存储在监测列表中的动作502。动作502可以包括,至少基于标识存储器地址,将存储器地址存储在监测列表中。例如,基于断点组件302标识作为断点/观察点的结果而要被监测的存储器地址,监测列表组件303可以将该存储器地址存储在监测列表中(包括在该地址处开始的要监测的字节数量),诸如重放数据结构106c。取决于实现,可以使用阵列、链表、分层结构等来存储该监测列表。

方法500还包括逐出与存储器地址重叠的(多个)高速缓存行(如果它们存在的话)的动作503。动作503可以包括,至少基于标识存储器地址,确定与存储器地址重叠的一个或多个高速缓存行是否已经存在于高速缓存中,并且当一个或多个高速缓存行存在时,从高速缓存中逐出一个或多个高速缓存行。例如,结合断点组件302标识作为断点/观察点的结果而要被监测的存储器地址,并且监测列表组件303将该存储器地址存储在监测列表中,高速缓存管理组件304从高速缓存203逐出与该存储器地址(包括从该地址开始的指定字节范围)重叠的任何高速缓存行——如果它们存在于高速缓存203中的话。在一些实施例中,这是在断点组件302对高速缓存管理组件304发出指令的情况下完成的。这样做确保当对所标识的存储器地址的存储器访问操作发生时将存在高速缓存未命中。

方法500还包括检测发生高速缓存未命中的动作504。动作504可以包括基于存储器访问操作来检测高速缓存未命中的发生。例如,基于存储器访问组件301访问尚未在高速缓存203中的存储器202的部分的存储器访问操作,高速缓存管理组件304可以在高速缓存203上注册高速缓存未命中,并将存储器202的该部分导入到高速缓存203中的高速缓存行中。

方法500还包括确定基于高速缓存未命中所导入的高速缓存行是否与存储器地址重叠的动作505。动作505可以包括,至少基于高速缓存未命中的发生,确定基于高速缓存未命中所导入到高速缓存中的高速缓存行的一部分是否与存储在监测列表中的存储器地址重叠。例如,在动作504中发生高速缓存未命中时,高速缓存管理组件304可以向断点组件302通知高速缓存未命中。断点组件302继而可以将基于高速缓存未命中所导入的高速缓存行与监测列表进行比较,以确定监测列表中的任何地址(包括它们的指定范围)是否与高速缓存行重叠。

如所图示,动作504包括处理对存储器地址的监测操作的动作505a。动作505a可以包括,当导入的高速缓存行的一部分与存储器地址重叠时,处理对存储器地址的一个或多个监测操作。例如,如果断点组件302在动作505中确定基于高速缓存未命中导入到高速缓存中的高速缓存行确实与存储在监测列表中的存储器地址重叠,则断点组件302可以处理一个或多个监测操作,诸如确定将(多个)处理器102置于详细模式中,使(多个)处理器102单步操作、报告结果等。如所讨论的,即使实际上没有访问被监视的存储器地址,也可能发生重叠。因此,在这些情形中,处理对存储器地址的一个或多个监测操作可以包括确定当存储器访问操作没有写入或读取存储器地址时没有遇到断点。可替代地,如果遇到断点,则一个或多个监测操作可以包括在用户界面处报告断点检查的结果(例如,以指示遇到断点)。

动作504还包括逐出导入的高速缓存行的动作505b。动作505b可以包括,当导入的高速缓存行的一部分确实与存储器地址重叠时,从高速缓存中逐出第二高速缓存行。可替代地,当导入的高速缓存行的所述部分不与存储器地址重叠时,第二高速缓存行保留在高速缓存中。例如,如果断点组件302在动作505中确定基于高速缓存未命中导入到高速缓存中的高速缓存行确实与存储在监测列表中的存储器地址重叠,则断点组件302可以指示高速缓存管理组件304从高速缓存中逐出那一行。值得注意的是,无论是否实际遇到断点(例如,如动作505a中所确定的),都从高速缓存中移除高速缓存行。这是因为重放组件300确保从高速缓存中逐出与任何被监视的存储器地址重叠的任何高速缓存行,从而每当存在涉及被监视的存储器地址的高速缓存未命中时就执行对每个被监视的存储器地址的断点检查。

因此,本文描述的实施例确保从高速缓存中逐出与正被监测的(多个)存储器地址相对应的任何(多个)高速缓存行,从而仅对高速缓存未命中执行断点检查。因此,当定义新断点时,将基于断点要被监测的存储器地址添加到监测列表,并且如果在定义断点时高速缓存中存在与存储器地址重叠的(多个)任何高速缓存行,则将它们从高速缓存中逐出。然后,当基于对存储器地址的访问而发生高速缓存未命中时,执行断点检查。具体地,将基于高速缓存未命中导入到高速缓存中的高速缓存行与监测列表中的存储器地址列表进行比较,以确定是否存在重叠。如果不存在重叠,那么正常遵循高速缓存未命中,并且允许高速缓存行保留在高速缓存中。然而,如果存在重叠,那么执行一个或多个监测操作。此外,每当存在重叠时,从高速缓存中逐出高速缓存行,以便将发生另一个高速缓存未命中——并且将执行另一个断点检查——如果稍后再次访问存储器地址的话。通过这种方式,仅需要对导致高速缓存未命中的存储器访问操作执行断点检查,而不是对每个存储器访问操作都执行断点检查。

尽管用结构特征和/或方法动作专用的语言描述了本主题,但应理解,所附权利要求书中定义的主题不必限于上述所描述的特征或动作,或者上述动作的顺序。而是,所描述的特征和动作作为实现权利要求的示例形式而被公开。

本发明的实施例可以包括或利用包括诸如例如一个或多个处理器和系统存储器之类的计算机硬件的专用或通用计算机系统,如下面更详细地讨论的。本发明范围内的实施例还包括用于承载或存储计算机可执行指令和/或数据结构的物理和其他计算机可读介质。这种计算机可读介质可以是可由通用或专用计算机系统访问的任何可用介质。存储计算机可执行指令和/或数据结构的计算机可读介质是计算机储存介质。承载计算机可执行指令和/或数据结构的计算机可读介质是传输介质。因此,作为示例而非限制,本发明的实施例可以包括至少两种截然不同的计算机可读介质:计算机储存介质和传输介质。

计算机储存介质是存储计算机可执行指令和/或数据结构的物理储存介质。物理储存介质包括计算机硬件,诸如ram、rom、eeprom、固态驱动器(“ssd”)、闪存、相变存储器(“pcm”)、光盘储存器、磁盘储存器或其他磁储存设备、或者可以被用来以计算机可执行指令或数据结构的形式存储程序代码并且可以由通用或专用计算机系统访问和执行以实现本发明所公开的功能性的(多个)任何其他硬件储存设备。

传输介质可以包括网络和/或数据链路,其可以被用来承载计算机可执行指令或数据结构形式的程序代码,并且可以由通用或专用计算机系统访问。“网络”被定义为能够在计算机系统和/或模块和/或其他电子设备之间传送电子数据的一个或多个数据链路。当通过网络或另一通信连接(硬连线、无线或硬连线或无线的组合)向计算机系统传送或提供信息时,计算机系统可以将该连接视为传输介质。上述的组合也应被包括在计算机可读介质的范围内。

此外,在到达各种计算机系统组件时,可以将计算机可执行指令或数据结构形式的程序代码自动地从传输介质传送到计算机储存介质(反之亦然)。例如,可以将通过网络或数据链路接收的计算机可执行指令或数据结构缓冲在网络接口模块(例如,“nic”)内的ram中,然后最终将其传送到计算机系统ram和/或计算机系统处的较不易失性的计算机储存介质中。因此,应该理解,可以将计算机储存介质包括在也(或甚至主要)利用传输介质的计算机系统组件中。

计算机可执行指令包括例如指令和数据,当在一个或多个处理器处执行时,所述指令和数据使得通用计算机系统、专用计算机系统或专用处理设备执行特定功能或功能组。计算机可执行指令可以是例如二进制文件、诸如汇编语言之类的中间格式指令、或者甚至是源代码。

本领域技术人员将理解,可以在具有许多类型的计算机系统配置的网络计算环境中实践本发明,包括个人计算机、台式计算机、膝上型计算机、消息处理器、手持设备、多处理器系统、基于微处理器或可编程消费电子产品、网络pc、小型计算机、大型计算机、移动电话、pda、平板电脑、寻呼机、路由器、交换机等。还可以在分布式系统环境中实践本发明,其中通过网络链接(通过硬连线数据链路、无线数据链路或通过硬连线和无线数据链路的组合)的本地和远程计算机系统都执行任务。这样,在分布式系统环境中,计算机系统可以包括多个组成计算机系统。在分布式系统环境中,程序模块可以位于本地和远程存储器储存设备中。

本领域技术人员还将理解,可以在云计算环境中实践本发明。可以分发云计算环境,但这不是必需的。在被分发时,云计算环境可以在组织内进行国际分发和/或具有跨多个组织所拥有的组件。在本说明书和以下权利要求中,“云计算”被定义为用于实现对可配置计算资源(例如,网络、服务器、储存器、应用和服务)的共享池的按需网络访问的模型。“云计算”的定义不限于在适当部署时可从这种模型获得的任何其他众多优点。

云计算模型可以由各种特性组成,诸如按需自助服务、广泛网络访问、资源池、快速弹性、测量服务等。云计算模型还可以以各种服务模型的形式出现,诸如例如软件即服务(“saas”)、平台即服务(“paas”)和基础设施即服务(“iaas”)。还可以使用不同的部署模型来部署云计算模型,诸如私有云、社区云、公共云、混合云等。

诸如云计算环境之类的一些实施例可以包括系统,该系统包括一个或多个主机,每个主机能够运行一个或多个虚拟机。在操作期间,虚拟机模拟操作计算系统,支持操作系统以及可能还支持一个或多个其他应用。在一些实施例中,每个主机包括管理程序,该管理程序使用从虚拟机的视图中抽象出的物理资源来模拟用于虚拟机的虚拟资源。管理程序还在虚拟机之间提供适当的隔离。因此,从任何给定虚拟机的角度来看,管理程序提供虚拟机与物理资源进行接口的假象——即使虚拟机仅与物理资源的外观(例如,虚拟资源)接口。物理资源的示例包括处理容量、储存器、磁盘空间、网络带宽、介质驱动器等。

在不脱离本发明的精神或基本特性的情况下,本发明可以以其他特定形式来体现。所描述的实施例在所有方面都应被视为仅是说明性的而非限制性的。因此,本发明的范围由所附权利要求而不是前面的描述来指示。在权利要求的含义和等同范围内的所有变化都包含在其范围内。

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