CN114490292A - 用于记录可重放跟踪的计算机系统、方法、硬件存储设备 - Google Patents
用于记录可重放跟踪的计算机系统、方法、硬件存储设备 Download PDFInfo
- Publication number
- CN114490292A CN114490292A CN202210093599.2A CN202210093599A CN114490292A CN 114490292 A CN114490292 A CN 114490292A CN 202210093599 A CN202210093599 A CN 202210093599A CN 114490292 A CN114490292 A CN 114490292A
- Authority
- CN
- China
- Prior art keywords
- recording
- thread
- memory
- trace
- threads
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3636—Software debugging by tracing the execution of the program
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/34—Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment
- G06F11/3466—Performance evaluation by tracing or monitoring
- G06F11/3476—Data logging
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3664—Environments for testing or debugging software
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本公开的实施例涉及用于记录可重放跟踪的计算机系统、方法、硬件存储设备。记录多线程进程的执行的可重放跟踪包括标识跟踪存储器模型,其限定将要跨多线程进程的多个线程被排序的一个或多个可排序事件。跨一个或多个处理器的一个或多个处理单元同时执行多个线程。在多个线程的执行期间,针对每个线程独立地记录单独的可重放跟踪。记录包括针对每个线程:记录针对线程的初始状态;记录由至少一个处理器指令执行的至少一个存储器读取,由线程执行的至少一个处理器指令将存储器作为输入;以及利用单调增加的数字记录由线程执行的至少一个可排序事件,单调增加的数字将事件在跨多个线程的其他可排序事件间进行排序。
Description
本申请是国际申请日为2017年8月23日、国际申请号PCT/US2017/048094、于2019年2月27日进入中国国家阶段、中国国家申请号201780053059.9、发明名称为“用于记录可重放跟踪的计算机系统、方法、硬件存储设备”的发明专利申请的分案申请。
技术领域
本公开的实施例涉及计算机领域,具体涉及记录多线程进程的执行的可重放跟踪。
背景技术
当在软件应用的开发期间写源代码时,开发者通常花费大量时间“调试”源代码以找到代码中的运行时错误。例如,开发者可以采取若干方法来再现和定位源代码缺陷,诸如基于不同输入来观察程序的行为、插入调试代码(例如,以打印变量值,追踪执行的分支等)、暂时移除代码部分等。追踪运行时错误以查明代码缺陷占用应用开发时间的重大部分。
调试应用(“调试器”)已经被开发以便辅助代码调试过程。许多这样的工具提供跟踪、可视化和更改计算机代码的执行的能力。例如,调试器可以可视化代码指令(例如,源代码、汇编代码等)的执行和变量值,并且使得用户能够更改代码执行的方面。通常,调试器使得用户能够在源代码(例如,源代码中的特定指令或语句)中设置“断点”,其在执行期间被到达时使程序的执行被挂起。当源代码执行被挂起时,用户可以被呈现变量值并且被给予选择如何前进的选项(例如,通过终止执行,通过继续照常执行,通过步进到语句/函数调用中、步进通过语句/函数调用、或者从语句/函数调用步进出来,等等)。然而,经典调试器仅仅使得代码执行能够在单个方向(前向)上被观察/更改。例如,经典调试器不会使得用户能够选择返回到先前断点。
新兴的调试形式是“时间旅行(time travel)”调试,其中程序的执行被记录到跟踪中,跟踪可以之后在前向和后向两者上被重放并分析。
发明内容
本文中的实施例涉及记录并重放用于时间旅行调试的跟踪的新实现,其可以产生超过先前尝试几个数量级的性能改进,其实现对线程自由地跨多个处理单元同时运行的多线程程序的记录,并且其可以产生具有比先前尝试的跟踪文件减少几个数量级大小的跟踪文件。
在一些实施例中,一种用于记录多线程进程的执行的可重放跟踪的方法包括标识跟踪存储器模型,其限定将要跨多线程进程的多个线程被排序的一个或多个可排序事件。方法还包括跨一个或多个处理器的一个或多个处理单元同时执行多个线程,以及在多个线程的执行期间,独立地记录针对每个线程的单独的可重放跟踪。记录针对每个线程的单独的可重放跟踪包括记录针对该线程的初始状态。记录针对每个线程的单独的可重放跟踪还包括:记录由至少一个处理器指令执行的至少一个存储器读取,由线程执行的至少一个处理器指令将存储器作为输入。记录针对每个线程的单独的可重放跟踪还包括利用单调增加的数字记录由线程执行的至少一个可排序事件,单调增加的数字将事件在跨多个线程的其他可排序事件间进行排序。
提供本发明内容从而以简化的形式介绍下面在具体实施方式中进一步描述的一系列概念。本发明内容不旨在标识要求保护的技术方案的关键特征或必要特征,也不旨在用作确定要求保护的技术方案的范围的辅助。
附图说明
为了描述能够获得本发明的以上所述的优点和特征以及其他优点和特征的方式,将通过参考在附图中图示的其具体实施例来呈现以上简单描述的本发明的更具体描述。在理解这些附图仅描绘本发明的典型实施例并且因此不被认为是对其范围的限制的情况下,利用在对附图的使用中的附加特异性和细节来描述并解释本发明,在附图中:
图1图示了时间旅行调试的实施例可以操作于其中的示例计算机架构;
图2图示了用于记录多线程进程的执行的可重放跟踪的示例方法的流程图;
图3是跨同时执行的线程的排序事件的示例;
图4图示了对影子副本的使用的一个示例;
图5图示了环形缓冲区的一个示例;
图6图示了用于基于处理器高速缓存的跟踪的示例计算机架构;以及
图7图示了用于使用高速缓存数据来记录可执行实体的执行的可重放跟踪的示例方法的流程图。
具体实施方式
本文中的实施例涉及记录和重放用于时间旅行调试的跟踪的新实现,其可以产生超过先前尝试几个数量级的性能改进,其实现对线程自由地跨多个处理单元同时运行的多线程程序的记录,并且其可以产生具有比先前尝试的跟踪文件减少几个数量级大小的跟踪文件。
一般地,时间旅行调试的目标是在跟踪中捕获可执行实体(例如,用户模式线程、内核线程、超级管理程序等)执行哪些处理器指令,使得无论需要什么粒度,这些指令都可以在稍后的时间以绝对的精确度根据跟踪来重放。能够重放作为应用代码的部分被执行的每个指令实现在稍后对应用的后向重放的错觉。例如,为了命中在后向方向上的断点,跟踪从断点之前的时间被重放,并且重放停止于断点命中的上次时间(其在调试器正在分析代码流的地方之前)处。
提供时间旅行调试的先前尝试已经遭受导致有限利用的若干缺点。例如,先前尝试对代码执行应用重大约束,诸如要求跟踪包括执行的所有指令的严格排序(即,完全顺序一致的记录模型)。这例如通过要求非同时地在单个核上执行多线程程序或者通过要求在多个核上步调一致地非同时地执行程序指令(例如,在一个处理器核上执行N个指令,然后在另一处理器核上执行N个指令,以此类推)来完成。这些鉴于当今的高度多线程代码和高度并行多核和超线程处理器是重大限制。另外,先前尝试造成重大程序性能下降,并且通常产生异常大的跟踪文件(特别是当模拟多个核时),这至少部分地因为它们确定地记录每一个指令的执行,并且在程序执行期间创建完全存储器状态的全面记录。前述中的每一个已经使在时间旅行调试方面的先前尝试既异常慢又对于在生产环境的使用中并且对于程序执行的长期跟踪(特别是对于具有同时运行的许多线程的应用)不切实际。
操作环境
首先,图1图示了根据本发明的时间旅行调试的实施例可以操作于其中的示例计算环境100。本发明的实施例可以包括或利用专用或通用计算机系统101,其包括计算机硬件,例如一个或多个处理器102、系统存储器103、一个或多个数据存储库104、和/或输入/输出硬件105。
在本发明的范围内的实施例包括用于承载或存储计算机可执行指令和/或数据结构的物理介质和其他计算机可读介质。这样的计算机可读介质可以是可以由计算机系统101访问的任何可用介质。存储计算机可执行指令和/或数据结构的计算机可读介质是计算机存储设备。承载计算机可执行指令和/或数据结构的计算机可读介质是传输介质。因此,通过举例而非限制性的方式,本发明的实施例可以包括至少两种截然不同种类的计算机可读介质:计算机存储设备和传输介质。
计算机存储设备是存储计算机可执行指令和/或数据结构的物理硬件设备。计算机存储设备包括各种计算机硬件,诸如RAM、ROM、EEPROM、固态驱动器(“SSD”)、闪存、相变存储器(“PCM”)、光盘存储、磁盘存储或其他磁存储设备,或者可以用于存储以计算机可执行指令或数据结构的形式的程序代码并且可以由计算机系统101访问和执行以实现本发明的所公开的功能的任何其他(一个或多个)硬件设备。因此,例如,计算机存储设备可以包括所描绘的系统存储器103和/或所描绘的数据存储库104,其可以存储计算机可执行指令和/或数据结构。
传输介质可以包括可以用于承载以计算机可执行指令或数据结构的形式的程序代码并且可以由计算机系统101访问的网络和/或数据链路。“网络”被限定为支持电子数据在计算机系统和/或模块和/或其他电子设备之间的传送的一个或多个数据链路。当通过网络或另外的通信连接(硬接线的、无线的或硬接线或无线的组合)将信息传递或提供给计算机系统时,计算机系统可以将连接视为传输介质。以上的组合还应当被包含在计算机可读介质的范围内。例如,输入/输出硬件105可以包括连接可以用于执行以计算机可执行指令或数据结构形式的程序代码的网络和/或数据链接的硬件(例如,网络接口模块(例如,“NIC”)。
另外,在到达各种计算机系统组件时,以计算机可执行指令或数据结构形式的程序代码可以自动地从传输介质被传递到计算机存储设备(或者反之亦然)。例如,通过网络或数据链路而接收到的计算机可执行指令或数据结构可以被缓冲在NIC(例如,输入/输出硬件105)内的RAM中,并且然后最终被传递到系统存储器103和/或被传递到在计算机系统101处的非易失性计算机存储设备(例如,数据存储库104)。因此,应当理解,计算机存储设备可以被包括在也(或甚至主要)利用传输介质的计算机系统组件中。
计算机可执行指令包括例如当在一个或多个处理器102处被执行时使计算机系统101执行特定功能或功能的组的指令和数据。计算机可执行指令可以例如为二进制、诸如汇编语言的中间格式指令或甚至源代码。
本领域技术人员将认识到可以在具有许多类型的计算机系统配置的网络计算环境中实践本发明,许多类型的计算机系统配置包括个人计算机、台式计算机、膝上型计算机、消息处理器、手持设备、多处理器系统、基于微处理器的或可编程的消费电子设备、网络PC、微型计算机、大型计算机、移动电话、PDA、平板计算机、寻呼机、路由器、交换机等。还可以在分布式系统环境中实践本发明,在分布式系统环境中通过网络(通过硬接线数据链路、无线数据链路、或者通过硬接线数据链路和无线数据链路的组合)而链接的本地计算机系统和远程计算机系统两者都执行任务。因此,在分布式系统环境中,计算机系统可以包括多个组成计算机系统。在分布式系统环境中,程序模块可以被定位在本地存储器存储设备和远程存储器存储设备两者中。
如所图示的,数据存储库104可以存储表示时间旅行调试器106和应用代码107的计算机可执行指令和/或数据结构,应用代码107是由时间旅行调试器106进行的跟踪/调试的对象。当这些程序(例如,使用(一个或多个)处理器102)正在执行时,系统存储器103可以存储对应的运行时数据,诸如运行时数据结构、计算机可执行指令等。因此,图1将系统存储器103图示为包括时间旅行调试器运行时数据106’和应用代码运行时数据107’。
如所描绘的,时间旅行调试器106包括一个或多个组件或模块,诸如记录组件106a和重放组件106b。在合适的时间,这些组件还可以包括系统存储器103中的对应的运行时数据(被图示为记录运行时数据106a’和重放运行时数据106b’)。在执行期间,记录模块106a/记录运行时数据106a’记录文档化在(一个或多个)处理器102处对应用代码107的执行的一个或多个跟踪文件108。稍后,重放模块106b/重放运行时数据106b’可以结合应用代码107使用(一个或多个)跟踪文件108,以在前向和后向两者上重放应用代码107的执行。尽管(一个或多个)跟踪文件108被描绘为被存储于数据存储库104中,但是这些(一个或多个)跟踪文件108还可以至少暂时地被记录在系统存储器103中或在某个其他存储设备处。应指出的是,记录组件106a可以存在于一个计算机系统处,并且重放组件106b可以存在于另一个计算机系统处。因此,程序的执行可以在一个系统上被跟踪/记录,并且在另一系统上被重放。
图1包括(一个或多个)处理器102的内部硬件组件的大体表示。如所图示的,(一个或多个)处理器102包括一个或多个处理单元102a(即,核)。每个处理单元102a包括执行由应用定义的处理器指令的硬件逻辑,并且这些指令是从预定义的处理器指令集架构之中选择的。(一个或多个)处理器102的具体指令集架构基于处理器制造商和处理器模型而变化。常见的指令集架构包括来自英特尔公司的IA-64和IA-32架构、来自ADVANCED MICRODEVICES公司的AMD64架构、以及来自ARM HOLDINGS,PLC的各种高级RISC机器(“ARM”),但是大量其他指令集架构存在并且可以由本发明使用。一般地,“指令”是可由处理器执行的最小外部可见(即,在处理器外部的)代码单元。
处理单元102a从高速缓存102b获得处理器指令,并且基于高速缓存102b中的数据、基于寄存器102c中的数据和/或在没有输入数据的情况下执行处理器指令。一般地,高速缓存102b是存储系统存储器103的部分的处理器上副本的小量(即,相对于系统存储器103的常见量而言小的)的随机存取存储器。例如,当执行应用代码107时,高速缓存102b包含应用代码运行时数据107’的部分。如果(一个或多个)处理单元102a需要尚未存储于高速缓存102b中的数据,则“高速缓存未命中”发生,并且该数据从系统存储器103中取得(通常从高速缓存102b逐出某个其他数据)。高速缓存102b一般被划分成至少代码高速缓存和数据高速缓存。例如,当执行应用代码107时,代码高速缓存存储在应用代码运行时数据107’中存储的处理器指令的至少一部分,并且数据高速缓存存储应用代码运行时数据107’的数据结构的至少一部分。一般地,高速缓存102b被划分成单独的层级/级别(例如,层1、层2、以及层3),其中一些层级(例如,层3)可能与处理器102分离存在。寄存器102c是基于(一个或多个)处理器102的指令集架构而限定的基于硬件的存储位置。
尽管未明确描绘,但是(一个或多个)处理单元102中的每个处理器通常包括多个处理单元102a。因此,计算机系统可以包括多个不同的处理器102,其各自包括多个处理核。在这些情况下,处理器的高速缓存102b可以包括多个截然不同的高速缓存部分,其各自对应于不同的处理单元,并且寄存器可以包括截然不同的寄存器的集合,其各自对应于不同的处理器单元。计算机系统101可以因此同时在不同的处理器102处和/或在每个处理器内的不同处理单元102a处执行多个“线程”。
时间旅行调试
如先前所提到的,在时间旅行调试方面的先前调试将在单个处理器核上非同时地执行进程的多个线程,或者在不同处理器和/或处理器核上非同时地执行多个线程,使得每个指令以精确的确定顺序被执行和记录。附加地,先前尝试将以确定的方式详尽地记录对进程的存储器状态的改变,使得每个存储器值在任何给定时间是已知的。然而,本文中的实施例能够同时地执行和跟踪多个线程,从而去除了每个指令以精确的顺序来执行和记录的要求,并且能够在记录比指令执行和存储器状态的完全记录少得多的同时重放。
在概念层面上,本文中的实施例记录在一个或多个处理器上单独地对进程的一个或多个线程的执行的跟踪,并且在(一个或多个)跟踪文件108中记录这些(一个或多个)跟踪,其可以用于再现作为每个线程的部分被执行的每个处理器指令的输入和输出(而不必记录被执行的每个指令)、其包括跨不同线程的指令执行的顺序的近似、并且其存储足够的信息以预测相关的存储器值,而不需要详尽地记录对存储器状态的完全改变。要指出,尽管本文中的实施例可以跟踪进程的所有线程,但是它们也可以仅跟踪进程的线程的子集。此外,要指出,本文中的实施例可以跟踪在(一个或多个)物理处理器上、在(一个或多个)虚拟处理器(诸如通过软件模拟的处理器)上、和/或甚至在虚拟机环境(例如,来自微软公司的.NET、来自甲骨文公司的JAVA等)中对应用代码107的执行。作为在虚拟机环境内跟踪的一个示例,记录JAVA程序可以包括记录JAVA虚拟机的“虚拟处理器”执行了什么操作和存储器读取。备选地,记录JAVA程序可以包括JAVA程序和JAVA虚拟机两者(例如,通过记录“及时”编译JAVA代码、执行垃圾收集器等的本地代码的执行)。在后一情况下,时间旅行调试器106可以被配置为分离不同层(即,应用代码对比JAVA虚拟机代码)的重放。
本文中的实施例建立在发明人的如下认识上:处理器指令(包括虚拟机“虚拟处理器”指令)可以大体落入三种类别之一:(1)由于不产生可预测的输出而被标识为“非确定性”的指令,因为它们的输出不完全由一般寄存器或存储器中的数据确定,(2)其输入不取决于存储器值的确定性指令(例如,它们仅取决于处理器寄存器值,或者在代码本身中限定的值),以及(3)其输入取决于从存储器中读取的值的确定性指令。因此,在一些实施例中,重建指令的执行可以利用对以下三种对应的挑战的解决方案来完成:(1)如何记录产生不完全由它们的输入确定的输出的非确定性指令,(2)如何再现针对取决于寄存器的指令的输入寄存器的值,以及(3)如何再现针对取决于存储器读取的指令的输入存储器的值。
作为对如何记录由线程执行的不产生完全可预测的输出的“非确定性”指令(因为它们的输出不完全由一般寄存器或存储器中的数据确定)的第一挑战的解决方案,实施例包括在线程的跟踪中存储这样的指令的执行的副作用。如本文中所使用的,“非确定性”指令包括不太常见的指令,其:(i)在它们每次被执行时产生非确定性输出(即,英特尔处理器上的RDTSC,其写入处理器周期的数目,因为上个处理器重置到寄存器中),(ii)可以产生确定性输出,但是取决于不是由记录组件106a追踪的输入(例如,调试寄存器、计时器等),和/或(iii)产生处理器特定信息(例如,英特尔处理器上的CPUID,其将处理器特定数据写入寄存器中)。存储这样的指令的执行的副作用可以包括例如存储由指令的执行而改变的寄存器值和/或存储器值。在诸如来自英特尔的一些架构中,处理器特征(诸如在虚拟机扩展(VMX)中发现的那些)可以用于捕获指令以用于将它们的副作用记录在(一个或多个)跟踪文件108中。
作为对再现针对由线程执行的确定性指令(例如,其输入仅仅取决于处理器寄存器值)的输入寄存器器的值的第二挑战的解决方案是直接的,因为它们是对线程中的(一个或多个)先前指令的执行的输出。在线程的跟踪中记录整个系列的处理器指令的执行可以因此被精简为再现在系列的开始处的寄存器值;(一个或多个)跟踪文件108不需要存储哪些具体指令在系列中被执行的记录、或者中间寄存器值。这是因为实际指令可在应用代码107本身中获得,并且其可在重放时可用。这些指令可以因此在重放期间被提供记录的输入(即,记录的寄存器值的初始集合),从而以与它们在线程的跟踪期间执行的相同方式执行。
作为对再现针对其输入取决于存储器值的由线程执行的确定性指令的输入存储器的值的第三挑战的解决方案,实施例包括在线程的跟踪中记录线程中的指令消耗的存储器值(即,其读取),而不管指令所读取的值如何被写入存储器。换言之,一些实施例包括仅记录存储器读取,而不记录存储器写入。例如,尽管值可以由当前线程、由另一线程(包括内核,例如,作为处理中断的部分)、或由硬件设备(例如,输入/输出硬件105)写入到存储器,但是正是线程的指令所读取的值需要用于对执行读取的线程的指令的完全重放。这是因为是由线程读取的值(而不必是写入存储器的所有值)指示线程是如何被执行的。尽管在一些实施例中,读取的每个存储器值的值可以被存储于(一个或多个)跟踪文件108中,但是其他的一些实施例包括优化,诸如尝试预测合适的值而不必记录每个读取的预测技术。例如,在一些实现中,如果预测的值是实际从存储器中读取的值,则不需要在(一个或多个)跟踪文件108中记录任何内容;然而,如果预测的值不与实际读取的值相匹配,则读取的值被记录在(一个或多个)跟踪文件108中。一个这样的预测技术是预测由线程读取的下一存储器值将与由线程先前读取的值相同,如下面说明的。另一预测技术是总是预测下一存储器读取将具有零值。其他示例预测技术也在稍后进行讨论。
附加地,由于线程中的每个线程独立于彼此被记录,所以(一个或多个)跟踪文件108不需要记录跨所有线程执行的每一个指令的严格排序(例如,使用完全顺序一致的记录模型,如以上所讨论的)。然而,记录指令被执行的顺序的近似对于稍后调试可以是有用的。因此,为了记录跨线程执行指令的顺序的近似,实施例代替地限定或标识已经限定了“可排序”和“不可排序”事件的“跟踪存储器模型”。然后,记录组件106a记录在线程执行期间发生的“可排序”事件的执行序列。例如,实施例可以使用确保不会重复的单调递增数字(“MIN”)来记录可排序事件跨线程发生的顺序。一般地,跟踪存储器模型应当限定线程可以如何通过共享存储器而交互,以及它们对存储器中的数据的共享使用。使用的跟踪存储器模型可以是由用于编译应用代码107的编程语言(例如,C++14)限定的存储器模型,或者是为了跟踪目的而限定的某个其他存储器模型(诸如由时间旅行调试器106限定的存储器模型)。
作为一个示例,第一跟踪存储器模型可以仅将(来自用户模式的)内核调用、陷阱、以及异常处置为可排序的。该跟踪存储器模型将具有低开销,因为这些操作各自本身相对“代价高”,它们可能以任何方式被跟踪并且提供对排序的非常粗粒度的概览。
第二示例跟踪存储器模型可以将完全栅栏(fence)(即,具有获取和释放语义两者的操作)处置为可排序的。这样的操作的示例可以包括英特尔的“锁定”指令、内核调用、异常以及陷阱。该存储器模型将提供针对当代码使用“互锁”类型的基元跨线程通信时(其在诸如来自微软公司的WINDOWS的操作中是常见的)在进程中发生的几乎所有跨线程通信的足够的排序。
第三示例跟踪存储器模型可以将所有获取和释放处置为可排序的。该存储器模型可以适合于基于处理器的ARM指令集,因为ARM不会将大多数加载和存储处置为获取或释放。在例如来自英特尔的其他架构(其中大多数存储器存取是获取或释放)上,这将等同于对几乎所有存储器存取进行排序。
第四示例跟踪存储器模型可以将所有存储器加载处置为可排序的。这将提供强排序但是可能导致相较于其他示例存储器模型下降的性能。
前述存储器模型已经仅作为示例被呈现,并且本领域普通技术人员将意识到,鉴于本文中的公开内容,可以选择各种各样的存储器模型。
鉴于前述,图2图示了用于记录多线程进程的执行的可重放跟踪的方法200的示例流程图。如所描绘的,方法200包括标识存储器模型的动作201。动作201可以包括标识跟踪存储器模型,跟踪存储器模型限定将要跨多线程进程的多个线程被排序的一个或多个可排序事件。例如,动作201可以包括记录组件106a标识或限定存储器模型,诸如仅仅作为示例:将内核调用、陷阱、以及异常处置为可排序的;将完全栅栏处置为可排序的;将所有获取和释放处置为可排序的;将所有存储器加载处置为可排序的;等等,如以上所讨论的。
图2还描绘了方法200包括同时执行多个线程的动作202。动作202可以包括跨一个或多个处理器的一个或多个处理单元同时执行多个线程,同时利用记录组件106a观察它们的执行。例如,动作202可以包括在处理器的第一处理单元102a上执行进程的第一线程,同时在相同处理器的第二处理单元102a上执行进程的第二线程。作为另一示例,动作202可以包括在支持超线程的处理器的相同处理单元102a上执行进程的两个线程。作为另一示例,动作202可以包括在不同处理器的不同处理器单元102a上执行进程的两个线程。前述的组合也是可能的。
图2还描绘了方法200包括独立地记录针对每个线程的跟踪的动作203。动作203可以包括:在多个线程的执行期间,独立地记录针对每个线程的单独的可重放跟踪。如鉴于后文中的示例将清楚的,针对每个线程的所记录的跟踪彼此独立,除了它们可以包括由MIN跨线程标识的可排序事件。如所图示的,当它们执行时,动作203可以包括由记录组件106a针对每个线程执行的子动作。
图2还描绘了动作203包括针对每个线程记录初始线程状态的动作204。例如,动作204可以包括记录组件106a存储初始处理器寄存器值。其他初始线程状态可以包括针对进程的第一线程的线程环境块(TEB)和/或进程环境块(PEB)。记录TEB和/或PEB可以稍后提供有用的调试信息(例如,线程本地存储数据)。其他初始线程状态可以包括线程的执行栈,特别是在记录组件106a正在开始对已经执行的线程的记录的情况下。
图2还描绘了动作203可以包括记录非确定性指令的副作用的动作205。动作205可以包括记录由线程执行的至少一个非确定性处理器指令的副作用。例如,记录组件106a可以通过记录由指令对寄存器值做出的任何改变来记录非确定性指令的副作用。
图2还描绘了动作203包括针对每个线程记录存储器读取的动作206。动作206可以包括记录由至少一个处理器指令执行的至少一个存储器读取,由线程执行的该至少一个处理器指令将存储器作为输入。例如,记录组件106a可以记录可以用于在重放时间期间再现从存储器读取的值的(一个或多个)跟踪文件108。这可以包括记录每个读取,或者应用一个或多个算法来预测读取以减少需要被记录在(一个或多个)跟踪文件108中的读取条目的数目。
图2还描绘了动作203包括针对每个线程记录可排序事件的动作207。动作207可以包括利用单调增加的数字来记录由线程执行的至少一个可排序事件,单调增加的数字将事件在跨所述多个线程的其他可排序事件间进行排序。例如,记录组件106a可以记录能够由跟踪存储器模型使用跨线程应用的MIN进行排序的事件的执行序列。如此,重放组件106b可以确保这些事件在重放期间跨线程被定序。一个示例可排序事件是跟踪的开始。其他结合下面的表1和表2的示例给出。
如由动作205、206和207之间的双箭头图示的,这些动作可以以任何顺序发生,并且可以在线程的跟踪期间发生多次,如结合以下示例将变得清楚的。
当记录跟踪时,记录组件106a可以采用压缩技术来减小(一个或多个)跟踪文件108的大小。例如,记录组件106a可以在将跟踪数据写入存储设备(无论是在系统存储器103中还是在数据存储104中)之前动态地压缩跟踪数据。备选地,记录组件106a可以在记录的完结处压缩(一个或多个)跟踪文件108。
表1-表5图示了使用方法200来跟踪进程的执行的具体示例。具体地,表1-表5图示了用于记录多线程进程的单个线程的执行的示例技术。尽管为简单且清楚仅一个线程在该示例中被记录,但是不管存在修改程序状态的多少个线程,记录技术都不需要改变。附加地,即使存在修改共享存储器的外部实体(例如,内核、硬件),记录也将不需要改变。这是因为这些记录技术记录在执行线程时处理单元102a实际上所看见(读取)和做出的,而不是集中于约束执行以产生执行的指令的完全可预测序列。
首先,表1图示了要由处理单元102a作为线程的部分而执行的(例如,来自应用代码107的)处理器指令的示例列表。
表1:处理器指令列表
在表1中,“地址”列是指其中发现“指令”列中指定的指令(例如,高速缓存102b的指令部分中的)的存储器地址。在该示例中,这些地址被简化为两位数。在指令中,R1-R7是指处理器寄存器102c,并且包含于方括号(“[]”)中的数据是指(例如,高速缓存102b的数据部分中的)存储器位置。
表2图示了针对线程的指令执行的序列,包括寄存器状态,以及可能可以被记录在(一个或多个)跟踪文件108中以支持对线程的执行的重放的样本数据。
表2:指令执行序列
在表2中,“ID#”列是指指令执行的具体序列,并且“地址”列指示在ID#处执行的指令的指令地址(参见表1)。尽管不必记录在(一个或多个)跟踪文件108中,但是列“R1”-“R7”被包括以图示对一些处理器寄存器的状态改变,作为理解程序执行的辅助。“跟踪”列指示可以结合指令执行被记录的数据的类型。
根据方法200,记录组件106a将标识限定“可排序”和“不可排序”指令/事件的跟踪存储器模型(动作201)。这使得记录组件106a能够根据MIN跨线程记录定序(可排序)事件。稍后,在重放期间,这使得重放组件106b能够确保这些可排序指令跨线程以相对于彼此的恰当顺序被重放,并且还使得重放组件106b能够在重放线程内和跨线程的不可排序指令中具有灵活性。
为了说明,图3提供了跨同时执行线程(线程A和B)对事件排序的示例300。具体地,图3图示了线程A的执行的时间线301以及线程B的执行的同时时间线302。这些时间线301、302示出了七个可排序事件的相对执行顺序。具体地,时间线301示出了线程A执行可排序事件3和5,并且时间线302示出了线程B执行可排序事件1、2、4、6和7。在重放期间,重放组件106b确保这些可排序事件在它们相应的线程内以恰当顺序被重放,并且跨两个线程以它们的恰当顺序被重放(即,B1=>B2=>A3=>B4=>A5=>B6=B7)。
不可排序指令相对于这些可排序指令被重放。例如,重放组件106b将在重放线程B的时间块304中的任何不可排序事件之前重放线程B的时间块303中的任何不可排序事件。附加地,重放组件106b将在重放线程A的时间块305中的任何不可排序事件之前重放线程B的时间块303中的不可排序事件。另外,重放组件106b将在重放线程B的时间块306中的任何不可排序事件之前重放线程A的时间块305中的不可排序事件。然而,重放组件106b不可以强制线程B的时间块305中的不可排序事件的重放与线程B的时间块304中的不可排序事件的重放之间的任何具体排序,因为该排序不能单独基于可排序事件来确定。然而,重放组件106b可以在这些指令都要访问共享存储器的情况下强制这些指令之间的某种排序,因为它们的排序可以至少部分地基于它们如何以及何时访问共享存储器(包括访问的值)来确定。
继续参考图2,方法200将前进以记录针对每个线程的个体跟踪(动作203)。在执行针对给定线程的任何指令之前,记录组件106a记录初始状态/上下文(动作204),诸如处理器寄存器102c的初始值(即,在该示例中,对于R1-R7中的每一个全部为1(0xff))。
记录组件106a然后前进以监测和记录线程的执行,当发生时在(一个或多个)跟踪文件108中记录合适的指令/事件,诸如非确定性指令的执行的副作用(动作205),存储器读取(动作206),以及可排序事件(动作207)。
例如,在ID#0处,记录组件106a记录对地址10处的指令的执行(即,根据表1“MoveR1<-{Timer}(移动R1<-{计时器})”)。该指令读取计时器,并且将值放置于寄存器(R1)中。在该示例中,假设所选择的跟踪存储器模型(动作201)将获得计时器限定为应当利用MIN记录的“可排序”指令。因此,记录组件106a在(一个或多个)跟踪文件108中记录定序(可排序)事件“X”(动作207)。在该示例中,这在“跟踪”列中被标记为“Instr:0<Orderable event,X>(Instr:0<可排序事件,X>)”,意味着自写入到跟踪的上个数据起的零个指令记录由MIN X标识的定序(可排序)事件。
注意,用于记录定序(可排序)事件的具体符号(MIN)可以是任何符号(因此使用通用“X”),只要其是确保不会在相同记录内重复并且单调递增的值(例如,A、B、C等;1、2、3等;10、20、30等)。一个可能的选项是使用处理器提供的计时器值,诸如由英特尔处理器上的RDTSC指令返回的值。因此,晚于“X”发生的操作将具有严格大于“X”的序列标识符,不管那些操作发生在哪个线程上。
附加地,指令10是第一类别的非确定性指令,其产生不仅依赖于输入的结果(例如,不存在输入,并且在指令每次被执行时返回的计时器值将是不同的)。因此,记录组件106a在跟踪中记录其执行的副作用(动作205)。在该示例中,这在“跟踪”列中被标记为“Instr:0<Side effects,R1=T1,PC=11>(Instr:0<副作用,R1=T1,PC=11>)”,意味着自写入到跟踪的上个数据起的零个指令(其是“Instr:0<Seq.event,X>(Instr:0<定序事件,X>0”)记录R1的新值(其是时间T1),并且递增和记录程序计数器(PC,未示出)寄存器(即,到在地址11处的下一指令)。
尽管该示例将对PC的更新记录为副作用,但是一些实施例可以省略这么做,因为重放组件106b将能够基于对执行的指令的分析确定PC应当被递增多远。然而,记录PC允许“跳转”指令被记录为副作用,其提供机会来利用到(一个或多个)跟踪文件108的单个条目来记录若干指令的执行。
在此时,(一个或多个)跟踪文件108具有足够的信息使得重放组件106b可以建立初始线程状态(例如,将R1-R7的值设置为0xff),可以重放指令10(通过再现其副作用),并且可以将指令10相对于该线程内或者在记录组件106a跟踪同时执行的线程的排序的其他线程内的任何其他指令进行排序。
接下来,在ID#1处,指令11执行读取(读取存储器位置A的地址,并且将值放置于R2中,参见表1)。由于该指令读取存储器,所以记录组件106a以如下方式将此记录到(一个或多个)跟踪文件108(动作206)使得:在重放时重放组件106b可以再现或预测被读取的值。如先前所讨论的,这可以包括记录组件106a记录每个读取的值,但是存在各种优化来减少需要写入的数据量。一种方法是预测由当前指令读取的值是由线程上次读取(并且被记录在(一个或多个)跟踪文件108中)的值。在这种情况下,(一个或多个)跟踪文件108不包含针对该线程的先前读取,因此该读取需要被记录。在示例中,这被标记为“Instr:1<Read valueptrA>(Instr:1<读取值ptrA>)”,意味着自写入到跟踪的上个数据起(即,“Instr:0<Sideeffects,R1=T1,PC=11>(Instr:0<副作用,R1=T1,PC=11>)”)的一个指令读取存储器位置A的地址。如所指示的,该地址(ptrA)将由指令放置到R2中。
在ID#2和ID#3处执行的指令(指令12和13)也需要被记录,因为它们也是读取(动作206)。由记录组件106a记录在(一个或多个)跟踪文件108中的数据类似于针对指令11记录的数据。对于ID#2(指令12),标记“Instr:1<Read value ptrB>(Instr:1<读取值ptrB>)”意味着自写入到跟踪的上个数据起的一个指令,读取存储器位置B的地址。对于ID#3(指令13),标记“Instr:1<Read value 5>(Instr:1<读取值5>)”意味着自写入到跟踪的上个数据起的一个指令读取值5。注意,根据示例预测算法,这些中的两者将需要被写入(一个或多个)跟踪文件108,因为每个读取产生与先前读取不同的值。如所指示的,针对位置B的地址(ptrB)将由指令12放置到R2中,并且值5将由指令13放置到R4中。
对于ID#4和ID#5,指令14和15是确定性的,其中没有从存储器的读取,因此记录组件106a不需要在(一个或多个)跟踪文件108中记录任何内容。类似地,对于ID#6,指令16是确定性的并且仅取决于R5和R4的值。(一个或多个)跟踪文件108中的记录不是必要的,因为这些值将由重放组件106b基于指令13和14的重放与针对在ID#3处的指令的跟踪数据一起再现。
对于ID#7,指令17也不要求任何跟踪数据被记录,因为其行为(不采取跳转,因为R5的值不小于R4的值)完全由已经记录(或暗含)在(一个或多个)跟踪文件108中的数据确定。例如,在重放时,针对ID#3的跟踪数据将使重放组件106b将值5放置到R4中,并且值零将已经基于重放在ID#4处的指令14而被写入到R5。
对于ID#8,指令18是从存储器的读取(由[R2+R5]标识的存储器位置),并且因此应当被考虑为记录(动作206)。假设值5由记录组件106a观察为在执行期间已经被读取(如列“R7”中所指示的)。尽管记录组件106a可以将该读取记录在(一个或多个)跟踪文件108中(例如,“Instr:5<Read value 5>(Instr:5<读取值5>)”),但是其可以通过应用以上讨论的读取预测算法来避免这么做:如果读取的值与来自由线程执行的上次读取操作的值相同,则不记录。在这种情况下,上次读取值是5(ID#3),因此对于ID#8,记录组件106a不需要将任何内容记录在(一个或多个)跟踪文件108中。
对于ID#9-ID#11,记录组件106a也不需要记录能够重放指令19-21的任何内容,因为执行这些指令需要的每个内容已经是已知的。对于ID#12(指令21),记录组件106a也不需要记录任何内容,因为该指令的输入仅是寄存器,并且因为到存储器的写入(即,由[R3+R6]标识的位置)不需要被记录(如先前所讨论的),所以尽管从存储器的读取影响指令如何执行以及哪些指令执行,但是写入不影响。对于ID#12-ID#16(指令23、24、Loop:16(循环:16)、17),记录组件106a也不需要记录任何内容,因为执行这些指令需要的每个内容已经是已知的。
对于ID#17,第二次遇到指令18(从存储器的读取),(如列“R7”中指示的)值0被读取。该值不是将由记录组件106a使用样本预测算法而预测的值(因为其不同于被读取的上个值5),因此记录组件106a根据动作206将其添加到(一个或多个)跟踪文件108(例如,“Instr:14<Read value 0>(Instr:14<读取值0>)”,其指示在登入的上个数据之后的第十四个指令,读取值零)。
对于ID#18-ID#22(指令18、20、21、Loop:16(循环:16)、以及17),记录组件106a不需要将任何内容添加到(一个或多个)跟踪文件108。如之前一样,重放引擎106b将已经具有足够的信息来再现记录组件106a观察到的相同结果。在重放时,重放组件106b将相同值进行比较,采取相同跳转,等等。
ID#23是第三次遇到指令18(从存储器的读取),并且(如列“R7”中指示的)另一0被读取。尽管记录组件106a需要考虑将其添加到(一个或多个)跟踪文件108(动作206),但是该值由预测算法预测(在ID#17处的上次读取也是0),因此记录组件106a不将任何内容记录到(一个或多个)跟踪文件108中。
对于ID#24-ID#28(指令19、20、21、Loop:16(循环:16)、以及17),记录组件106a也不需要将任何内容添加到(一个或多个)跟踪文件108,因为重放组件106b将已经具有足够的信息来再现相同结果。
对于ID#29,第四次遇到指令18(从存储器的读取),(如列“R7”中指示的)值2被读取。该值不是预测的值(其不同于读取的上个值,其为0),因此记录组件106a根据动作206将其添加到(一个或多个)跟踪文件108(自上个条目起的十二个指令,读取值2)。
对于ID#30-ID#37(指令19、20、21、22、23、24、Loop:16(循环:16)、以及17),记录组件106a也不需要将任何内容添加到(一个或多个)跟踪文件108。再次地,重放组件106b已经具有足够的信息来再现相同结果。
ID#38(指令18)是另一存储器读取(从位置[R2+R5])。如R7中所指示的,值2被读取,其与在ID#29处的上次读取相同。尽管记录组件106a需要考虑将其写入到(一个或多个)跟踪文件108(动作206),但是根据预测算法其不需要这么做。
对于ID#39-ID#46(指令19、20、21、22、23、24、Loop:16(循环:16)、以及17),记录组件106a也不需要将任何内容添加到(一个或多个)跟踪文件108。再次地,重放组件106b已经具有足够的信息来再现记录组件106a所观察到的相同结果。
在ID#9处,记录组件106a观察在指令26处读取的另一计时器。由于根据(如结合ID#0讨论的)存储器模型这是“可排序”事件,所以记录组件106a利用根据动作207的递增标识符(例如,陈述在上次登入的数据之后的第十八个指令的数据,发生的定序事件X+N)来记录操作的序列/顺序。此外,由于这是非确定性指令,所以记录组件106a根据动作205记录其副作用(例如,陈述在上次日志记录的数据之后的零个指令的数据,记录效果:R2=T2且PC=26)。
对于ID#48,不存在读取并且指令是确定性的,因此记录组件不在(一个或多个)跟踪文件108中登入任何内容。
表3概述了记录组件106a可能已经在(一个或多个)跟踪文件108中记录作为跟踪该线程的执行的部分的跟踪数据的示例。
表3:具有预测的示例跟踪
<Initial context(e.g.,registers)>(<初始上下文(例如,寄存器)>) |
Instr:0<Orderable event,Id X>(Instr:0<可排序事件,Id X>) |
Instr:0<Side effects,R1=T1,PC=11>(Instr:0<副作用,R1=T1,PC=11>) |
Instr:1<Read value ptrA>(Instr:1<读取值ptrA>) |
Instr:1<Read value ptrB>(Instr:1<读取值ptrB>) |
Instr:1<Read value 5>(Instr:1<读取值5>) |
Instr:14<Read value 0>(Instr:14<读取值0>) |
Instr:12<Read value 2>(Instr:12<读取值2>) |
Instr:18<Orderable event,Id:X+N>(Instr:18<可排序事件,Id:X+N>) |
Instr:0<Side effects,R2=T2,PC=26>(Instr:0<副作用,R2=T2,PC=26>) |
重放组件106b可以稍后使用该跟踪数据来建立初始上下文(例如,寄存器状态)并且然后通过再现非确定性指令的副作用并在需要时提供存储器值(使用在记录期间所使用的预测算法的知识)来与线程的代码(例如,表1)一起以它们在记录时被执行的相同方式执行相同的指令。附加地,定序事件(X和X+N)使得在ID#0和47处的指令能够以相对于其他线程中的定序事件如它们在记录期间被执行那样的相同顺序被执行。因此,跟踪机制支持对个体执行线程和多个同时执行线程的跟踪和重放,同时记录少量跟踪数据,并且比在执行的指令中的完全确定性记录和完全存储器状态少得多。特别地,在前述示例中,记录组件106a不跟踪或记录何时、为什么或谁(即,该进程中的另一线程,相同线程早前,另一进程,内核,硬件,等等)写入由表1中的代码读取和消耗的值。然而,重放组件106a仍然由跟踪表3启用从而以其被观察到的确切方式重放执行。
如本领域技术人员将意识到,鉴于本文中的公开内容,存在对跟踪数据可以被记录的具体方式的许多变型。例如,尽管示例跟踪基于相对于自到跟踪中的先前条目被执行的指令的数目的指令计数来追踪事件何时发生,但是绝对指令计数(例如,在跟踪的开始处开始的计数)也可以被使用。可以用于独特地标识所执行的每个指令的其他示例可以基于执行的多个CPU周期的计数(相对于先前条目,或者作为绝对值)、做出的多个存储器访问的计数、和/或采取的跳转计数与处理器的程序计数器(其可以相对于上次执行不连续或内核调用,或者是距限定的时间是绝对的)一起。当使用前述技术中的一个多个时,当记录某些类型的指令(诸如“repeat(重复)”指令(例如,英特尔架构上的REP))时可能需要小心。具体地,在一些处理器上,重复指令可以实际上在每次迭代上利用相同程序计数器执行,并且因此在这些处理器上,具有多次迭代的重复指令可以仅计数为一个指令。在这些情况下,跟踪应当包括可以用于区分每次迭代的信息。
附加地,存在用于记录和预测读取的值的各种机制。作为一个简单示例,实施例可以完全消除预测算法。尽管这将产生更长的跟踪,但是其还将去除重放组件106b被配置有与记录组件106a相同的预测算法的限制。表4图示了在不使用预测算法的情况下跟踪可以看起来是什么样,并且其中每个存储器读取被记录。如所示出的,在没有预测算法的情况下,跟踪将包括三个新条目(强调示出),而其他条目(即,在每个新条目之后的那些条目)各自具有关于指令计数的更新,其反映出来自在其前面的新条目的计数。
表4:没有预测的示例跟踪
<Initial execution context(e.g.,registers)>(<初始执行上下文(例如,寄存器)>) |
Instr:0<Orderable event,Id X>(Instr:0<可排序事件,Id X>) |
Instr:0<Side effects,R1=T1,PC=11>(Instr:0<副作用,R1=T1,PC=11>) |
Instr:1<Read value ptrA>(Instr:1<读取值ptrA>) |
Instr:1<Read value ptrB>(Instr:1<读取值ptrB>) |
Instr:1<Read value 5>(Instr:1<读取值5>) |
Instr:5<Read value 5>(Instr:5<读取值5>) |
Instr:9<Read value 0>(Instr:9<读取值0>) |
Instr:6<Read value 0>(Instr:6<读取值0>) |
Instr:6<Read value 2>(Instr:6<读取值2>) |
Instr:9<Read value 2>(Instr:9<读取值2>) |
Instr:9<Orderable event,Id:X+N>(Instr:9<可排序事件,Id:X+N>) |
Instr:0<Side effects,R2=T2,PC=26>(Instr:0<副作用,R2=T2,PC=26>) |
注意,(一个或多个)跟踪文件108不需要记录所读取的值的存储器地址,如果其可以基于哪个指令消耗它们来映射它们的话。因此,产生多于一个读取的指令可能需要标识哪个读取是(一个或多个)跟踪文件108中的读取(即,当针对该指令仅存在一个读取时)或者哪个读取是哪个(即,在(一个或多个)跟踪文件108中存在若干读取的情况下)的手段。备选地,(一个或多个)跟踪文件108可以包含针对这些读取或针对所有读取的存储器地址。(一个或多个)跟踪文件108仅需要包括重放组件106b能够读取记录组件106a观察到的相同值、并将它们匹配到相同参数使得其可以产生相同结果的足够信息。
附加地,在代码流中不可发现的事件(即,代码执行中的不连续)可以发生,诸如访问违例、陷阱、中断、到内核的调用等。记录组件106a还需要记录这些事件,使得它们可以被重放。例如,表5图示了在ID#33(指令22)已经生成了访问违例的情况下可以被记录在(一个或多个)跟踪文件108中的示例跟踪。
表5:具有异常的示例跟踪
具体地,跟踪包含:“Instr:4<Exception record>(Instr:4<异常记录>)”,其指示异常发生并且在到跟踪中的上个条目之后的4个指令异常发生;以及“Instr:0<Exceptioncontext>(Instr:0<异常上下文>)”,其结合在异常之后重启执行并记录任何合适的状态将指令计数重置为零。尽管为清楚起见表5示出了用于指示异常的发生和用于记录异常上下文的单独记录,但是它们可以处于相同条目中。将指令计数设置为零向重放组件106b指示两个条目应用于相同指令。现在,由于(一个或多个)跟踪文件108包含针对异常的条目,所以跟踪具有针对这样的异常的精确位置。这使得重放组件106b能够在记录时观察到异常的相同执行点处提出异常。这是重要的,因为异常不可通过查看代码流来推测(因为它们的发生常常基于未存在于代码流中的数据)。
如以上所提到的,用于跟踪所读取的值的各种机制可以由记录组件106a采用,诸如预测将被读取的值等于上次读取的值,并且在值不同的情况下将该读取记录在(一个或多个)跟踪文件108中。一个备选方法使用高速缓存来扩展该预测算法,使得记录组件106a预测要从特定地址读取的最可能值是从该地址读取或写入到该地址的上个值。因此,该方法需要维护进程的存储器范围的高速缓存,并且使用高速缓存来追踪存储器读取和写入。
为了避免该方法的开销(即,保持追踪放置于程序的整个存储器范围中的上个值的高速缓存),一种改进是记录组件106a创建比寻址的完全存储器小得多的量的存储器的“影子副本”(如下面讨论的)。然后,对于观察到的每个读取,记录组件106a将指令读取的值与在影子副本处的匹配位置的值进行比较。如果值相同,则无需使记录组件106a将读取的记录保存在(一个或多个)跟踪文件108中。如果值不同,则记录组件106a将值记录到(一个或多个)跟踪文件108中。记录组件106a可以在读取上和/或写入上更新影子副本以增加在下次读取存储器位置时正确预测值的可能性。
在一些实施例中,影子副本的大小可以被限定为2^N地址。然后,为了将地址与其影子副本匹配,记录组件106a获取存储器地址的低N位(即,其中N是2的幂,其确定影子副本的大小)。例如,在值为N=16的情况下,影子副本将是64k(2^16)个地址,并且记录组件106a获取每个存储器地址的低16位,并且将它们与影子副本中的该偏移进行比较。在一些实施例中,影子副本利用所有零被初始化。零可以被选择因为其是无歧义值,并且因为零相当频繁地从存储器读取。然而,初始值的其他选择可以备选地取决于实现而被使用。
图4图示了根据一些实施例的使用影子副本的示例400。图4表示进程的可寻址的存储器401。为图示的简单起见,示例400中的进程仅可以寻址2^4(十六)个存储器位置,其仅是常见进程将能够在同时代的计算机上寻址的位置(其将通常大约为2^32、2^64或更多的存储器位置)的一部分。在可寻址的存储器401的表示中,地址列指定每个存储器位置的二进制地址(即,二进制地址0000-1111),并且值列表示针对要存储于每个存储器位置处的数据的位置。根据以上描述的影子副本,图4还表示可以由记录组件106a在线程的跟踪期间保持的可寻址的存储器401的对应的影子副本402。在示例中,值N等于二,因此影子副本402存储2^2(四)个存储器位置(即,二进制地址00-11)。
无论何时记录组件106a检测到来自可寻址的存储器401的读取,记录组件106a都将从可寻址的存储器401读取的值与影子副本402中的对应位置进行比较。例如,当存储器位置401a、401b、401c或401d中的任何(即,二进制地址0000、0100、1000或1100)被读取时,记录组件106a将从该位置读取的值与影子副本的位置402a(即,二进制地址00,因为前述存储器地址中的每一个的最后N个数字是00)中的值进行比较。如果值匹配,则读取不需要被记录在(一个或多个)跟踪文件108中。如果值不匹配,则记录组件106a将读取记录在(一个或多个)跟踪文件108中,并利用新值来更新影子副本。
即使影子副本402中的每个位置表示可寻址的存储器402中的多个位置(在这种情况下为四个),则要指出的是,大多数程序可能执行从可寻址的存储器402中的相同位置的多次读取和/或到可寻址的存储器402中的相同位置的多次写入(例如,以读取或更新变量值),因此可能存在由影子副本402预测的大量读取。在一些实施例中,记录组件106a还可以当写入发生时更新影子副本402,这可以进一步增大正确预测的可能性。
在一些实施例中,不是在存储器地址的细粒度层面跟踪存储器读取,而是记录组件106a可以在存储器页层面(例如,基于页表)跨多个线程跟踪读取。该实施例建立在如下认识上:存储器页是受限制的,使得存储器的每个页面可以(i)由一个线程写入,而没有其他线程具有对该页面的读取或写入访问;或者(ii)由所需要的一样多的线程读取,但是没有线程能够对其写入。实施例可以因此将线程分组成族,使得在记录时期间,一个族内的线程总是彼此之间非同时地执行(即,相同族的两个线程不能同时执行)。然后,以上提到的限制跨线程族被应用,使得除了同时的页面访问,不同线程族的线程可以相对于彼此同时运行。如果线程族“拥有”用于写入的页面,则没有其他线程族可以具有对其的访问;然而,一个或多个线程族可以共享用于读取的页面。
当线程族访问用于读取或写入的页面时,需要知道页面的整体内容。如果页面由线程族中已经被记录的线程产生/写入,则记录组件106a已经清楚页面的内容。因此,在一些实施例中,记录组件106a仅将标识记录中的写入线程释放页面的点的信息放置于跟踪上。对于已经由外部实体(例如,内核、未被跟踪的线程、硬件组件等)产生/写入的页面,用于记录页面使得其在重放时可用的策略可以包括记录组件106a记录整个页面或者记录组件106a记录页面的压缩版本。如果页面先前已经被记录,则另一策略包括记录组件106a仅存储页面的当前版本与先前记录之间的页面值的差异。
如先前指示的,当调试由记录组件106a跟踪的代码时,在“后向”方向上的断点由重放组件106b从断点之前的时间直到到达断点(例如,断点命中的上次时间在调试器当前分析代码流之前)来重新放置(一个或多个)跟踪文件108到达。使用以上描述的跟踪,这将意味着从(一个或多个)跟踪文件108的开始重放跟踪。尽管这对于较小的跟踪是可接受的,但是其对于较大的跟踪可能是耗时且低效的。为了改进重放的性能,在一些实施例中,记录组件106a将多个“关键帧”记录在跟踪文件108中。然后,关键帧由重放组件106b使用以更粒度化地在断点上“调整归零(zero in)”。例如,在一些实现中,重放组件106b可以迭代地“倒回”增大编号的关键帧(例如,每次迭代使关键帧的编号加倍)直到到达选择的断点。为了说明,重放组件可以倒回一个关键帧并且试图命中断点,如果失败则其可以倒回两个关键帧并且试图命中断点,如果失败则其可以倒回四个关键帧并且试图命中断点,等等。
一般地,关键帧包括重放组件106b可以重放在关键帧处开始的执行的足够信息,一般不关心跟踪中在关键帧之前出现什么。记录关键帧的确切定时以及收集的数据可以基于实现而变化。例如,以周期性的间隔(例如,基于执行的指令的数目,基于处理器周期,基于经过的时钟时间,基于根据跟踪存储器模型的“可排序”事件的出现,等等),记录组件106a可以在(一个或多个)跟踪文件108中针对每个线程记录关键帧的足够信息以从关键帧开始每个线程的跟踪的重放。该信息可以包括在获取关键帧时硬件寄存器的状态。该信息还可以包括将存储器预测策略放置于已知状态所需要的任何信息,使得其可以再现在关键帧处开始的读取(例如,通过记录(一个或多个)存储器快照、(一个或多个)影子副本、(一个或多个)上次读取的值等)。在一些实施例中,关键帧可用于支持跟踪中的间隙。例如,如果跟踪出于任何原因被停止,则这可以被标记在(一个或多个)跟踪文件108中(例如,通过插入跟踪被停止的注释和适当地形成的关键帧),并且然后跟踪可以在稍后从(一个或多个)跟踪文件108中的该点被重新开始。
在一些实施例中,一些关键帧可以包括可能不是支持在关键帧处的重放的严格必要的信息,但是其证明在调试期间有用(例如,以帮助时间旅行调试器106消耗在重放期间生成的数据,并且以有用的形式将其呈现)。该信息可以包括例如线程的堆栈的一个或多个部分的副本、存储器的一个或多个部分的副本、线程的TEB、进程的PEB、加载的模块的标识及其头部等。在一些实施例中,包括该附加信息的关键帧(例如,“完整”关键帧)可以比常规关键帧(例如,“轻量级”关键帧)不那么频繁地被生成和存储。轻量级关键帧和/或完整关键帧的汇集的频率以及在每一个中收集的具体数据可以是在记录时用户可配置的。
在一些实施例中,记录“完整”关键帧还可以有用于诸如可重复使用的环形缓冲区的特征,其在下面结合图5进行讨论。记录“轻量级”关键帧还使得重放组件106b能够并行重放;在关键帧之后的每个线程跟踪可以独立于其他线程并且因此并行地被重放。附加地,关键帧可以使得重放组件106b能够并行地重放相同线程跟踪的不同段。例如,这么做可以有用于使用时间旅行调试器106来更快命中断点。在一些实施例中,“完整”关键帧的记录跨线程被协同(即,记录组件106a在大致相同的时间记录针对进程的每个线程的完整关键帧),而“轻量级”关键帧针对每个线程独立于其他线程被记录(即,记录组件106a记录针对每个线程的轻量级关键帧,其对于该线程而言是方便的或以其他方式有意义)。调节用于记录不同类型的关键帧的条件提供用于平衡跟踪大小、可重放能力、记录性能和重放性能的灵活性。
一些实施例可以包括“快照”的使用,“快照”包括进程的相关存储器的完整副本。例如,记录组件106a可以在开始该进程的跟踪时获取进程的存储器的初始快照。这使得重放组件106b能够向时间旅行调试器106的用户提供由进程使用的所有存储器位置的值,而不仅是被观察到在记录期间被访问的那些值。
在一些实施例中,(一个或多个)跟踪文件包括可由重放组件106b用于验证在重放时程序的状态与在记录期间存在的程序状态确实相匹配的信息。例如,记录组件106a可以在(一个或多个)跟踪文件108中包括周期性信息,诸如复制的寄存器数据和/或寄存器数据的计算的散列。该信息可以被包括于关键帧中,可以被周期性地与标准跟踪条目一起被包括,和/或可以基于执行的指令的编号而被包括(例如,每X个指令被放置于跟踪中)等。在重放期间,重放组件106b可以将在执行中的对应点处的记录的寄存器数据(和/或计算的散列)与在重放期间生成的状态数据进行比较以确保执行状态相同(即,如果在重放期间的寄存器数据和/或该数据的计算的散列匹配,则执行状态可能相同;如果它们不匹配,则执行状态已经有偏差)。
如前所述,一些实施例包括记录包括有限容量的“环形缓冲区”的(一个或多个)跟踪文件。具体地,环形缓冲区仅记录程序执行的尾部部分(例如,执行的最后N分钟、小时、天等)。在概念上,环形缓冲区将新跟踪数据添加到跟踪的前部/顶部,并且从跟踪的后部/底部移除旧跟踪数据。例如,一些应用可以在程序缺陷表现出来之前运行数天、周、或甚至月。在这样的情况下,跟踪程序执行的完整历史可能是不切实际(即,在使用的磁盘空间量方面)且不必要的,即使在具有由所公开的实施例记录的跟踪文件的紧凑性的情况下。附加地,环形缓冲区的使用可能潜在地允许(一个或多个)整体跟踪文件108被存储于RAM中,这可以大大减少磁盘I/O并改进性能(在记录和重放两者期间)。
当实现环形缓冲区时,实施例可以跟踪“永久”跟踪信息和“暂时”跟踪信息,其中“暂时”信息被存储于环形缓冲区中。“永久”跟踪信息的示例可以包括一般信息,诸如加载的模块的标识、被记录的进程的标识等。
图5图示了根据一个或多个实施例的可重复使用的环形缓冲区501的示例500。在示例中,环形缓冲区501中的每个空白矩形表示环形缓冲区501中的标准跟踪条目(例如,诸如以上表3的条目)。每个带阴影的矩形(例如,504a、504b、504c、504d、504e)表示关键帧。关键帧的频率以及关键帧之间的条目的数目将基于实现而变化。如由箭头502及其覆盖的虚线条目所指示的,新条目(标准条目和关键帧两者)被添加到缓冲区的一端。如由箭头503及其覆盖的虚线条目所指示的,最老的现有条目(标准条目和关键帧两者)从缓冲区的另一端被移除。条目可以在一对一的基础上或者成块(例如,基于经过的时间、条目的数目、关键帧的出现等)被添加/移除。缓冲区的总体大小可基于程序执行的尾部时段的期望长度来配置。为了从环形缓冲区501重放,重放组件106b使用期望的关键帧来初始化状态数据,并且然后从其重放程序执行。
如前所述,环形缓冲区501的关键帧可以包括“完全”关键帧,其不仅使得重放组件106b能够从每个关键帧开始重放(例如,使用存储于关键帧中的寄存器值),而且从每个关键帧开始使用附加的调试特征(例如,使用附加的信息,诸如线程的TEB、数据高速缓存等)。然而,排他地或除了“完全”关键帧,环形缓冲区501的关键帧还可以包括“轻量级”关键帧。
在记录期间使用的环形缓冲区的数目可以变化。例如,一些实施例可以按线程使用单独的环形缓冲区(即,每个线程被分配以用于记录跟踪数据的多个存储器页面),而其他的一些实施例可以使用单个环形缓冲区来记录多个线程。当使用单个环形缓冲区时,每个线程的跟踪仍然被单独记录,但是线程记录到存储器页面的共享池。
在(使用单个环形缓冲区来跟踪多个线程的)第二实施例中,每个线程可以从分配给环形缓冲区的页面的池中获得一个页面,并且开始用跟踪数据来填充它。一旦线程的页面满,则线程可以分配来自池的另一页面。当添加关键帧时,一些实施例尝试针对线程中的每个线程在大致相同的时间添加它们。关键帧可以然后用于将“代(generation)”指派给记录。例如,在第一关键帧之前记录的数据可以是“第一代”记录,并且在第一关键帧与第二关键帧之间记录的数据可以是“第二代”记录。当池中的页面已经被耗尽时,与最老一代的记录(例如,第1代)相关联的页面可以被释放以重新用于未来记录。
尽管前述公开内容已经主要集中于将可用于重放代码的执行的信息记录到(一个或多个)跟踪文件108,但是存在可以有助于记录组件106a写入到(一个或多个)跟踪文件中的许多其他类型的数据。已经给出了将关键帧和附加调试信息写入到跟踪的示例。跟踪可以被有标记的其他类型的信息可以包括计时信息、性能计数器(例如,高速缓存未命中、分支未命中预测等)以及不直接影响跟踪的重放但可以帮助同步(例如,嵌入捕获何时用户界面被捕获的数据,因此这可以在重放时被再现)的事件的记录。另外,当用户模式代码正被跟踪时,记录组件106a可以利用诸如以下的信息来标记(一个或多个)跟踪文件108:(i)何时用户模式线程被调度入或调度出,(ii)何时用户模式线程被挂起,(iii)何时用户转变为关注于被跟踪的应用,(iv)应用接收到的消息的记录,(v)何时用户模式处理造成页面错误,等等。本领域普通技术人员将意识到,鉴于本文中的公开内容,用于记录前述中的任何项的具体方式可以基于实现而变化。
时间机器调试器106可以以各种形式被实现为软件组件。例如,时间机器调试器106的至少一个或多个部分(例如,记录组件)可以被实现为注入到被记录的进程的运行时存储器中的代码部分(即,对被记录的进程进行“仪器检测”)、被实现为操作系统内核组件、被实现为完全机器模拟器(例如,BOCHS、快速模拟器(QEMU)等)的部分、和/或被实现为超级管理程序(例如,来自微软的HYPER-V、LINUX上的XEN等)的部分。当被实现为模拟器或超级管理程序的部分时,可以使得时间机器调试器106能够跟踪整个操作系统的执行。因此,时间机器调试器106能够跟踪用户模式代码的执行(例如,当被实现为注入代码或内核的部分时),和/或跟踪内核模式代码以及甚至整个操作系统(例如,当被实现为超级管理程序或模拟器的部分时)的执行。
基于处理器高速缓存的实现
尽管时间机器调试器106可以完全以软件来实现,但是一些实施例包括基于硬件高速缓存的记录模型,其可以进一步降低与记录程序的执行相关联的开销。如之前一样,该模型建立在如下总体原理上:记录组件106a需要创建使得重放组件106b能够以恰当的顺序和如下的方式来重放在记录时执行的每个指令的记录(即,(一个或多个)跟踪文件108),使得每个指令产生其在记录时产生的输出相同的输出。如鉴于以上的公开内容清楚的,(一个或多个)跟踪文件108的重要组成包括可用于在重放时再现存储器读取的数据。如以上所讨论的,记录这样的数据的实施例可以包括记录读取的每个值,使用预测算法来预料读取的值,使用存储器的影子副本,记录存储器页面和/或页面表条目等。
用于跟踪(包括记录/再现存储器读取)的基于硬件高速缓存的记录模型的实施例建立在如下观察上:处理器102(包括高速缓存102b)形成半封闭或准封闭系统。为了进一步说明,图6图示了用于基于处理器高速缓存的跟踪的示例计算机架构600,其包括处理器601和系统存储器608,其可以映射到图1的(一个或多个)处理器102和系统存储器103。
在概念层面上,在数据被加载到高速缓存603中后,处理器601就可以作为半封闭或准封闭系统自己运行爆发的时间(bursts of time)而没有任何输入。具体地,在程序执行期间,每个处理单元602使用高速缓存603的数据高速缓存605部分存储的数据并且使用寄存器607执行来自高速缓存603的代码高速缓存604段的指令。例如,图6图示了代码高速缓存604包括用于存储程序代码的多个存储位置604a-604n(例如,高速缓存行),以及数据高速缓存605包括用于存储数据的多个存储位置605a-605n(例如,高速缓存行)。如先前结合图1讨论的,高速缓存可以包括多个层(例如,级别1、级别2、以及级别3等)。尽管高速缓存605为简单起见被描绘为在处理器601内,但是将认识到高速缓存605(例如,级别3高速缓存)的一个或多个部分可以实际上存在于处理器601的外部。
当处理单元602需要信息的一些涌入(例如,因为其需要尚未在高速缓存603中的代码或数据)时,“高速缓存未命中”发生并且该信息从系统存储器608的合适的存储位置(例如,608a-608n)被带入到高速缓存603中。例如,如果当指令执行在对应于位置608a(包含程序运行时数据)的存储器地址处的存储器操作时数据高速缓存未命中发生,则该存储器(即,地址和存储于该地址处的数据)被带入到数据高速缓存605的存储位置之一(例如,位置605a)中。在另一示例中,如果当指令执行在对应于位置608b(包含程序代码)的存储器地址处的存储器操作时代码高速缓存未命中发生,则该存储器(即,地址和存储于该地址处的数据)被带入到代码高速缓存604的存储位置之一(例如,位置604a)中。当新数据被导入到高速缓存603时,其可以替代已经在高速缓存603中的信息。在这种情况下,旧信息被逐回到其在系统存储器608中的恰当地址。处理单元602然后使用高速缓存603中的新信息来继续执行,直到另一高速缓存未命中发生并且新信息再次被带入到高速缓存603中。
因此,用于记录/再现存储器读取的基于硬件高速缓存的模型的实施例依赖于如下认识:除了对未高速缓存的存储器的访问(例如,对硬件组件和不可高速缓存的存储器的读取,如稍后讨论的),进程/线程在执行期间所执行的所有存储器访问是通过处理器高速缓存603来执行的。结果,不是如上文那样创建可以再现每个个体存储器读取的记录(例如,每个读取的记录、影子副本等),记录组件106a可以代替地记录(i)被带入到高速缓存603中的数据(即,存储器地址和存储于该地址处的数据)、以及(ii)对未高速缓存的存储器的任何读取。
由于处理器102可以被视为半封闭或准封闭系统,所以在记录时发生的处理器内的执行流可以由重放组件106b使用模拟处理器及其高速缓存系统的模拟器来复制。模拟器被配置为当模拟器由重放组件106b给出在记录时发生的相同输入时,在重放时产生在记录时期间发生的相同结果。模拟器不需要是精确的CPU模拟器,只要其模拟指令执行(即,它们的副作用),其不需要匹配物理处理器的定时、流水线行为等。因此,记录程序执行可以被精简为记录:(i)到系统中的数据的涌入的复制本(例如,基于高速缓存未命中和未高速缓存的读取而带入到高速缓存603中的数据),(ii)引导重放组件106b如何/何时在正确的时间(例如,使用执行的指令的计数)应用到每个输入的数据,以及(iii)描述将要被模拟的系统的数据(即,处理器601,包括其高速缓存603)。这使得时间旅行调试器106能够在记录跟踪时将处理器102建模为线性执行机器而不需要记录处理器102内的指令执行的内部并行化或流水线,并且不需要保留处理器102内的每个指令的执行的特定定时的记录。
作为总体概述,类似于以上描述的技术,用于跟踪线程的基于硬件高速缓存的模型通过将处理器寄存器值保存到跟踪中来开始。附加地,该模型通过确保针对线程的处理器高速缓存603的合适部分为空来开始。如下面所讨论的,记录组件106a记录导入到数据高速缓存605的数据,并且还可以记录导入到代码高速缓存604中的数据。因此,数据高速缓存605需要在跟踪的开始处被清除,并且代码高速缓存604仅在到代码高速缓存604的导入正被记录的情况下需要被清除。然后,线程的代码的至少一部分被带入到代码高速缓存604中(例如,通过处理器基于所请求的代码的存储器地址来执行“高速缓存未命中”,并且,如果到代码高速缓存604的导入正被记录,则将导入的高速缓存行存储到(一个或多个)跟踪文件108中),并且处理单元602开始执行代码高速缓存604中的处理器指令。
当代码执行其第一个存储器操作(例如,对系统存储器608中的存储器地址的读取或写入)时,“高速缓存未命中”发生,因为数据高速缓存605是空的并且因此不包含在被访问的地址处的存储器的副本。因此,系统存储器608的正确部分被带入并存储到数据高速缓存605中的高速缓存行中。例如,如果存储器操作被寻址到系统存储器608中的位置608a处的存储器地址,则在存储器位置608a处的数据被写入到数据高速缓存中的行(例如,位置605a)。由于数据已经被带入到高速缓存603中,所以记录组件106a将该数据(即,地址和寻址的数据)记录到(一个或多个)跟踪文件108。
在此刻之后,未来的存储器访问将新数据带入到高速缓存中(并且因此由记录组件106a记录到(一个或多个)跟踪文件108中)或者针对已经被带入到高速缓存中的数据被执行(例如,它们可以从数据高速缓存605中的高速缓存行读取或者写入数据高速缓存605中的高速缓存行)。对已经在高速缓存中的数据的后续读取不需要被记录。类似于以上结合图1-图5描述的技术,记录组件106a不需要跟踪对高速缓存中的数据的写入,因为这些写入可以通过利用记录的初始状态执行指令并且通过再现非确定性指令的副作用来再现。
假设重放组件106b具有对线程的原始代码的访问,并且执行在记录时未中断(例如,不存在异常),那么如果重放组件106b以空的高速缓存和所记录的寄存器值开始,则重放组件106b可以模拟由处理器601进行的执行,包括在适当的时间将适当的数据带入到高速缓存603中,并且在适当的时间再现非确定性指令的副作用。
因此,像以上结合图1-图5讨论的技术,当使用该基于高速缓存的模型来记录时,记录组件106a仍然在(一个或多个)跟踪文件108中记录非确定性指令的副作用,该非确定性指令不具有由它们的输入值排他地确定的输出。附加地,在一些实施例中,记录组件106a仍然选择跟踪存储器模型并且利用单调增加的数字在(一个或多个)跟踪文件108中记录由线程执行的可排序事件,该单调增加的数字跨线程对这些事件进行排序。
附加地,如稍后更详细地讨论的,在一些实施例中,记录组件106a跟踪不能单独由线程的代码确定的、线程的控制流的变化。例如,控制流的变化可能由于中断而发生。这些可以包括例如异步过程调用(“APC”)、来自内核模式的调用等。
另外,在一些实施例中,记录组件106a仅跟踪数据高速缓存605未命中,而在其他的一些实施例中,记录组件106a跟踪数据高速缓存605未命中和代码高速缓存604未命中两者。具体地,如果线程正在执行仅非动态代码,则仅被导入到数据高速缓存605中的高速缓存行需要被跟踪,因为需要被执行的所有代码在重放时可用。然而,如果线程包括动态代码支持,则被导入到代码高速缓存605中的高速缓存行也需要被跟踪。
更进一步地,在一些实施例中,记录组件106a跟踪哪些指令单独执行从未高速缓存的/不可高速缓存的存储器的存储器读取,因为不存在跟踪这些读取的高速缓存未命中。未高速缓存的/不可高速缓存的读取的示例是从硬件设备的读取,或者从由处理器601和/或操作系统另外认为不可高速缓存的存储器的读取。
图7图示了用于使用高速缓存数据来记录可执行实体的执行的可重放跟踪的示例方法700的流程图。如所描绘的,方法700包括同时执行一个或多个线程的动作701。动作701可以包括跨一个或多个处理器的一个或多个处理单元执行可执行实体(例如,进程、内核、超级管理程序等)的一个或多个线程(例如,用户模式线程、内核线程等),同时利用记录组件106a来观察它们的执行。例如,动作701可以包括在处理器601的第一处理单元602上执行第一线程,同时可能地在相同处理器601的第二处理单元602上执行第二线程。作为另一示例,动作701可以包括在支持超线程的处理器601的相同处理单元602上执行两个线程。作为另一示例,动作701可以包括在不同处理器601的不同处理单元602上执行两个线程。前述的组合也是可能的。
图7还描绘了方法700包括独立地记录针对每个线程的单独的跟踪的动作702。动作702可以包括:在一个或多个线程的执行期间,独立地记录针对每个线程的单独的可重放跟踪。因此,如所图示的,当它们执行时,动作702可以包括由记录组件106a针对每个线程执行的子动作。
图7还描绘了动作702包括针对每个线程记录初始状态的动作703。动作703可以包括记录针对线程的初始处理器寄存器状态。例如,记录组件106a可以记录对应于线程执行于其上的处理单元602的寄存器607的状态。初始状态还可以包括附加信息,诸如存储器的快照、堆栈信息、线程的TEB、进程的PEB等。
图7还描绘了动作702包括针对每个线程记录高速缓存数据的导入行的动作704。动作704可以包括:在基于线程的执行检测到处理器数据高速缓存未命中时,响应于处理器数据高速缓存未命中而记录导入到处理器数据高速缓存中的高速缓存数据的至少一个行。例如,在对代码高速缓存604中的指令的执行期间,那些指令中的一个可以对系统存储器103中的尚未在数据高速缓存605中的具体地址执行存储器操作。因此,“高速缓存未命中”发生并且在该地址处的数据由处理器601导入到数据高速缓存605中。记录组件106a在(一个或多个)跟踪文件108中创建该数据的记录。例如,如果在位置608a处的存储器地址被导入到高速缓存行605a,则记录组件106a将存储器地址的标识以及其包含的数据记录在(一个或多个)跟踪文件108中。如果线程执行动态代码,则高速缓存未命中还可以关于将指令加载到处理器的代码高速缓存604中而发生。因此,动作704还可以包括:响应于处理器代码高速缓存未命中而记录导入到处理器代码高速缓存604中的高速缓存数据的至少一行。
图7还描绘了动作702还可以包括针对每个线程记录未高速缓存的读取的动作705。动作705可以包括:基于线程的执行来记录至少一个未高速缓存的读取。例如,在代码高速缓存604中的指令的执行期间,那些指令中的一个可以执行从硬件设备的存储器地址的存储器读取,或者从系统存储器608的被认为不可高速缓存的部分的存储器读取。由于在这种情况下没有高速缓存未命中,所以记录组件106a在(一个或多个)跟踪文件108中记录关于该指令而读取的值。如由动作704与动作705之间的双箭头所图示的,这些动作可以以任何顺序发生,并且可以在线程的跟踪期间发生多次。
如以上所讨论的,(一个或多个)跟踪文件108可以使用各种技术(例如,使用指令计数、CPU周期、与程序计数器一起的采取的跳转计数、存储器访问等)来记录事件何时发生。在一些实施例中,使用指令计数(相对或绝对)来标识事件何时发生可以是有利的,因为这么做可以去除在重放期间的定时考虑。例如,为重放的目的,可以不管在记录时底层硬件花费多久来服务高速缓存未命中;可以仅关心记录组件106a记录了存储器地址“X”具有值“Y”,以及信息使其及时进入到高速缓存603中以用于被处置的指令“Z”。这可以显著简化重放组件106b精确重放跟踪的花费,因为不需要产生准确的定时。该方法也提供将所有高速缓存未命中包括到(一个或多个)跟踪文件108中的选择,或者仅将实际上由处理单元602消耗的那些高速缓存未命中包括到(一个或多个)跟踪文件108中的选择。因此,例如,作为试图预料将被执行的接下来的指令的部分由处理单元602从系统存储器608的推测性读取不需要被跟踪。然而,如以上所提到的,在其他的一些实施例中,记录组件106a可以将定时信息记录在(一个或多个)跟踪文件108中。这么做可以使得在期望的情况下重放组件106b能够在重放时暴露该定时。
特别地,如果(一个或多个)跟踪文件108将每个高速缓存条目映射到使得其被带入到处理器601中的指令,则(一个或多个)跟踪文件108不需要在高速缓存行从高速缓存603被逐回到系统存储器608时捕获任何信息。这是因为如果线程的代码再次需要来自系统存储器608的该数据,则其将在该时由处理器601重新导入到高速缓存603中。在这种情况下,记录组件106a可以将数据的这种重新导入作为新条目记录到(一个或多个)跟踪文件108中。
如先前提到的,在一些实施例中,记录组件106a跟踪不能单独由线程的代码确定的、线程的控制流的变化。例如,当记录用户模式代码时,可能存在到跟踪的额外输入,因为操作系统内核可以中断用户模式代码并且因此变成数据的外部源。例如,当一些类型的异常发生时,它们首先由内核处置,并且然后最终控制被返回到用户模式——该不连续是到系统中的输入。附加地,当做出在系统调用之后不“返回”到指令的内核调用时,这也是到系统中的不连续。另外,当内核在将控制返回到用户模式代码之前改变处理器寄存器时,其也是到系统中的输入。因此,记录组件106a在(一个或多个)跟踪文件108中创建这些不连续的记录,使得重放组件106b在重放时再现它们的副作用。类似地,当(例如,利用超级管理程序)记录内核模式代码时,其他外部输入(例如,陷阱、中断等)可以发生,并且记录组件106a可以在(一个或多个)跟踪文件中创建这些不连续的记录。
在一些实施例中,这些不连续被记录在(一个或多个)跟踪文件108中作为信息的涌入。用于记录这些不连续的具体方式可以变化,只要(一个或多个)跟踪文件108包含到被记录以考虑不连续的代码中的所有输入。例如,当从内核模式返回到用户模式时(例如,当用户模式代码正被记录时),(一个或多个)跟踪文件108可以包含已经由内核改变的一组寄存器(或所有寄存器)。在另一示例中,(一个或多个)跟踪文件包括在系统调用之后的继续指令的地址的标识。在又一示例中,记录组件106a可以在返回到用户模式时冲刷处理器高速缓存603,日志记录所有有效高速缓存条目,和/或仅仅在它们被使用的情况下/时日志记录条目。类似地,当记录内核模式代码时,(一个或多个)跟踪文件可以包括在陷阱/中断之后的继续指令的记录、由陷阱/中断做出的任何改变等。
在一些实施例中,记录组件106a和重放组件106b被配置为跟踪并模拟处理器的转换后备缓冲器(“TLB”),诸如图6中的TLB 606。具体地,要指出的是,处理器高速缓存603有时基于系统存储器608的存储器物理地址,同时代码常常引用由内核表示为对线程/进程的抽象的存储器虚拟地址。TLB 606中的条目(例如,606a-606n)存储虚拟地址与物理地址之间的一些最近转换。因此,在一些实施例中,记录组件106a将TLB 606中的每个新条目记录到(一个或多个)跟踪文件中,这提供重放组件106b在重放时执行转换所需要的所有数据。关于数据高速缓存605,记录组件106a不需要记录从TLB 606的任何逐出。
跟踪TLB 606条目还允许提供若干其他益处,例如,TLB 606使得记录组件106a能够知道哪些存储器页面是未高速缓存的或不可用的,使得对这些页面的读取可以被日志记录(例如,动作706)。此外,TLB 606使得记录组件106a能够考虑其中两个(或更多个)虚拟地址映射到相同物理地址的情况。例如,如果高速缓存603基于第一虚拟地址逐出物理地址条目,并且然后线程经由不同的虚拟地址访问重叠的物理地址,则记录组件106a使用TLB 606来确定其需要将访问日志记录为高速缓存未命中的部分。
一些实施例包括可以进一步降低基于高速缓存的跟踪的性能影响的硬件辅助模型。如早前所指示的,记录跟踪以空的高速缓存603开始(并且因此高速缓存603被冲刷)。另外,如果(例如,由于中断)存在控制流的变化,则高速缓存603还可以被冲刷作为从非记录(即,当处于内核模式时)到记录(例如,当执行已经转变回到用户模式时)的转变的部分。然而,要指出的是,冲刷处理器高速缓存603可能在计算上代价高。因此,实施例包括对处理器601的硬件修改,其可以防止在处理器601每次从非记录转变到记录时冲刷高速缓存603的需要。这些示例引用设置/清除位。将认识到,取决于实现,位可以被认为被设置有一或零,并且通过将其切换到相对值来“清除”。
一些实施例利用可以用于指示高速缓存行的状态的一个或多个附加位来扩展每个高速缓存行条目(例如,代码高速缓存604的604a-604n和/或数据高速缓存605的605a-605n)。例如,一个位可以被设置(例如,为一)以指示高速缓存行已经被记录到(一个或多个)跟踪文件108中。然后,代替在转变时冲刷高速缓存,处理器601仅需要切换(例如,为零)高速缓存行上的这些位。稍后,如果线程的代码稍后消耗具有未设置的位的高速缓存行,则条目需要被存储到跟踪中,如同其是高速缓存未命中。设置并取消设置该位还使得记录组件106a能够避免跟踪由处理器601做出的任何推测性存储器访问,直到其知道线程的代码已经的确消耗了那些访问。
指示每个高速缓存行的状态的一个或多个位也可以以其他方式使用。例如,假设记录组件106a正在记录用户模式代码,并且这样的代码调用到内核中以在之后返回到用户模式中。在这种情况下,代替当处理器601返回用户模式时清除每个高速缓存行位,处理器601可以代替地清除仅在内核模式代码修改的高速缓存行上的位,并且留下设置在未被修改的任何高速缓存行上的位。这进一步减少当从内核返回时记录组件106a需要添加到(一个或多个)跟踪文件108的条目的量。然而,该技术可能不适用于所有内核到用户模式的转变。例如,如果内核仅仅从另一进程上的线程切换到正在记录的线程,则位应当跨所有高速缓存条目被清除。
特别地,前述概念可用于使用超线程的环境(即,在相同处理单元/核上执行多个硬件线程)中。许多处理器具有针对每个核的专有高速缓存(例如,每个核可以具有它自己的第1层和第2层高速缓存),并且还提供针对所有核的共享高速缓存(例如,第3层高速缓存)。因此,当使用超线程时,在核上执行的多个硬件线程(例如,“线程1”和“线程2”)共享针对该核的相同的专有高速缓存(例如,第1层、第2层),因此处理器用其与哪个线程相关联来标记由这些线程使用的每个高速缓存行。
在一些实施例中,一个或多个位可以被添加到共享高速缓存中的每个高速缓存行,这指示高速缓存行是否已经实际上被线程修改。例如,假设“线程1”正被跟踪并且执行切换到相同核上的“线程2”。如果“线程2”访问在该核的专有高速缓存中的被分配给“线程1”的高速缓存行,则位可以仅在“线程2”已经修改了高速缓存行的情况下被切换。那么,当执行切换回到“线程1”并且“线程1”访问该相同的高速缓存行时,该行在“线程2”不切换该位的情况下不需要被记录到跟踪,因为高速缓存行的内容自“线程1”上次访问它之后尚未改变。前述还可以被应用到共享高速缓存。例如,第3层高速缓存中的每个高速缓存行可以包括针对其所服务的每个线程的位,其指示该线程是否已经“记录”高速缓存行中的当前值。例如,每个线程可以在消耗行时将其位设置为一,并在写入到行时将所有其他值设置为零。
在一些实施例中,(一个或多个)跟踪文件108可以不以它们在记录时被执行的顺序来记录条目。例如,假设条目基于自线程中的上次不连续(包括内核调用)起的指令的数目而被记录。在这种情况下,两个不连续之间的条目可以被重新排序而没有损失信息。在一些实施例中,这么做可以支持更快的记录,因为由处理器做出对存储器访问的优化。例如,如果处理器执行得到(一个或多个)跟踪文件108中的条目但是在它们之间不具有依赖性的指令的序列(例如,A、B和C),则它们被执行的顺序在重放时是不相关的。如果指令A访问尚未在高速缓存603中的数据,则处理器601以许多处理器周期的代价访问系统存储器608;但是指令B和C访问已经在高速缓存603中的数据,然后它们可以被快速执行。然而,如果指令需要按顺序被记录在(一个或多个)跟踪文件108中,则指令B和C的执行的记录必须被保持(例如,在处理器的存储器资源中),直到指令A的执行已经完成。对比之下,如果指令被准许以乱序记录,则指令B和C可以在指令A的完成之前被写入(一个或多个)跟踪文件108,从而释放那些资源。
因此,前述实施例提供用于记录和重放用于时间旅行调试的跟踪的新技术,其产生超过先前尝试几个数量级的性能改进,支持对线程自由地跨多个处理单元同时运行的多线程程序的记录,并且产生具有比先前尝试的跟踪文件减少几个数量级大小的跟踪文件,等等。这样的改进大大减少跟踪和重放软件所需要的计算资源(例如,存储器、处理器时间、存储空间)的量。因此,本文中的实施例可使用在现实世界生产环境中,其大大增强时间旅行调试的可用性和实用性。
尽管已经以对结构特征和/或方法动作特定的语言描述了本技术方案,但是应理解在权利要求中限定的技术方案不必限于所描述的特征或以上描述的动作、或者以上描述的动作的顺序。相反,所描述的特征和动作被公开为实现权利要求的示例形式。
本发明可以在不脱离其精神或必要特性的情况下以其他具体形式来实施。所描述的实施例应在所有方面被认为仅是说明性的而非限制性的。本发明的范围因此由权利要求而非由前述描述指示。在权利要求的等价性的意义和范围内出现的所有改变应被包含在其范围内。
Claims (20)
1.一种计算机系统,包括:
一个或多个处理器;以及
一个或多个计算机可读介质,所述一个或多个计算机可读介质具有存储于其上的计算机可执行指令,所述计算机可执行指令能够由所述一个或多个处理器执行以使所述计算机系统记录多线程进程的执行的可重放跟踪,所述计算机可执行指令包括能够执行以使所述计算机系统至少执行以下操作的指令:
标识跟踪记录模型,所述跟踪记录模型限定跨所述多线程进程的多个线程可排序的一个或多个可排序事件类型,以及跨所述多个线程不可排序的一个或多个不可排序事件类型;
跨所述一个或多个处理器的一个或多个处理单元同时执行所述多个线程;以及
在所述多个线程的执行期间,独立地记录针对每个线程的单独的可重放跟踪,包括针对每个线程:
记录针对所述线程的初始状态;
记录由至少一个处理器指令执行的至少一个存储器读取,由所述线程执行的所述至少一个处理器指令将存储器作为输入;
基于所述线程执行具有可排序事件类型的事件,将第一单调增加的值记录到所述可重放跟踪中,所述单调增加的值相比另一可排序事件来排序所述事件,所述另一可排序事件由第二单调增加的值标识,所述第二单调增加的值被记录在针对所述多个线程中的另一线程的另一可重放跟踪中;以及
记录完整关键帧和轻量级关键帧,并且其中记录所述完整关键帧或所述轻量级关键帧的频率是可调节的。
2.根据权利要求1所述的计算机系统,其中记录针对所述线程的初始状态包括:在执行所述线程之前,记录一个或多个处理器寄存器的初始状态。
3.根据权利要求1所述的计算机系统,其中独立地记录针对每个线程的单独的可重放跟踪包括:针对至少一个线程,记录由所述线程执行的至少一个非确定性处理器指令的一个或多个副作用,包括记录由所述非确定性处理器指令对一个或多个处理器寄存器做出的改变。
4.根据权利要求1所述的计算机系统,其中记录由至少一个处理器指令执行的至少一个存储器读取包括:基于预测算法的使用来记录所述至少一个存储器读取。
5.根据权利要求1所述的计算机系统,其中记录由至少一个处理器指令执行的至少一个存储器读取包括:使用存储器的影子副本来预测读取值,所述影子副本仅包括能够由所述进程寻址的存储器的子集。
6.根据权利要求1所述的计算机系统,其中记录由至少一个处理器指令执行的至少一个存储器读取包括:记录与所述存储器读取相关联的存储器页面的标识。
7.根据权利要求1所述的计算机系统,其中记录针对所述线程的初始状态包括:将完整关键帧记录到所述可重放跟踪中。
8.根据权利要求1所述的计算机系统,其中独立地记录针对每个线程的单独的可重放跟踪包括:针对至少一个线程,基于预测算法的使用来确定存储器读取不需要被记录。
9.根据权利要求1所述的计算机系统,其中独立地记录针对每个线程的单独的可重放跟踪包括:针对每个线程记录到一个或多个可重新使用的环形缓冲区中。
10.根据权利要求1所述的计算机系统,其中独立地记录针对每个线程的单独的可重放跟踪包括:针对每个线程记录对所述线程的执行的一个或多个中断。
11.根据权利要求1所述的计算机系统,其中所述跟踪记录模型限定所述一个或多个可排序事件类型以包括以下至少一项:
内核调用;
完全栅栏;
获取和释放;或
存储器加载。
12.一种被实现在包括一个或多个处理器的计算机系统处的方法,用于记录多线程进程的执行的可重放跟踪,所述方法包括:
标识跟踪记录模型,所述跟踪记录模型限定跨所述多线程进程的多个线程可排序的一个或多个可排序事件类型,以及跨所述多个线程不可排序的一个或多个不可排序事件类型;
跨所述一个或多个处理器的一个或多个处理单元同时执行所述多个线程;以及
在所述多个线程的执行期间,独立地记录针对每个线程的单独的可重放跟踪,包括针对每个线程:
记录针对所述线程的初始状态;
记录由至少一个处理器指令执行的至少一个存储器读取,由所述线程执行的所述至少一个处理器指令将存储器作为输入;
基于所述线程执行具有可排序事件类型的事件,将第一单调增加的值记录到所述可重放跟踪中,所述单调增加的值相比另一可排序事件来排序所述事件,所述另一可排序事件由第二单调增加的值标识,所述第二单调增加的值被记录在针对所述多个线程中的另一线程的另一可重放跟踪中;以及
记录完整关键帧和轻量级关键帧,并且其中记录所述完整关键帧或所述轻量级关键帧的频率是可调节的。
13.根据权利要求12所述的方法,其中记录针对所述线程的初始状态包括:在执行所述线程之前,记录一个或多个处理器寄存器的初始状态。
14.根据权利要求12所述的方法,其中独立地记录针对每个线程的单独的可重放跟踪包括:针对至少一个线程,记录由所述线程执行的至少一个非确定性处理器指令的一个或多个副作用,包括记录由所述非确定性处理器指令对一个或多个处理器寄存器做出的改变。
15.根据权利要求12所述的方法,其中记录由至少一个处理器指令执行的至少一个存储器读取包括:基于预测算法的使用来记录所述至少一个存储器读取。
16.根据权利要求12所述的方法,其中记录由至少一个处理器指令执行的至少一个存储器读取包括:使用存储器的影子副本来预测读取值。
17.根据权利要求12所述的方法,其中记录针对所述线程的初始状态包括:将完整关键帧记录到所述可重放跟踪中。
18.根据权利要求12所述的方法,其中独立地记录针对每个线程的单独的可重放跟踪包括:针对至少一个线程,基于预测算法的使用来确定存储器读取不需要被记录。
19.根据权利要求12所述的方法,其中独立地记录针对每个线程的单独的可重放跟踪包括:针对每个线程记录到一个或多个可重新使用的环形缓冲区中。
20.一个或多个硬件存储设备,具有存储于其上的计算机可执行指令,所述计算机可执行指令能够由计算机系统的一个或多个处理器执行,以通过所述计算机系统执行以下操作来使得所述计算机系统记录多线程进程的执行的可重放跟踪:
标识跟踪记录模型,所述跟踪记录模型限定跨所述多线程进程的多个线程可排序的一个或多个可排序事件类型,以及跨所述多个线程不可排序的一个或多个不可排序事件类型;
跨所述一个或多个处理器的一个或多个处理单元同时执行所述多个线程;以及
在所述多个线程的执行期间,独立地记录针对每个线程的单独的可重放跟踪,包括针对每个线程:
记录针对所述线程的初始状态;
记录由至少一个处理器指令执行的至少一个存储器读取,由所述线程执行的所述至少一个处理器指令将存储器作为输入;
基于所述线程执行具有可排序事件类型的事件,将第一单调增加的值记录到所述可重放跟踪中,所述单调增加的值相比另一可排序事件来排序所述事件,所述另一可排序事件由第二单调增加的值标识,所述第二单调增加的值被记录在针对所述多个线程中的另一线程的另一可重放跟踪中;以及
记录完整关键帧和轻量级关键帧,并且其中记录所述完整关键帧或所述轻量级关键帧的频率是可调节的。
Applications Claiming Priority (4)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US15/252,998 US10042737B2 (en) | 2016-08-31 | 2016-08-31 | Program tracing for time travel debugging and analysis |
US15/252,998 | 2016-08-31 | ||
CN201780053059.9A CN109643273B (zh) | 2016-08-31 | 2017-08-23 | 用于记录可重放跟踪的计算机系统、方法、硬件存储设备 |
PCT/US2017/048094 WO2018044629A1 (en) | 2016-08-31 | 2017-08-23 | Program tracing for time travel debugging and analysis |
Related Parent Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201780053059.9A Division CN109643273B (zh) | 2016-08-31 | 2017-08-23 | 用于记录可重放跟踪的计算机系统、方法、硬件存储设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114490292A true CN114490292A (zh) | 2022-05-13 |
Family
ID=59887361
Family Applications (2)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210093599.2A Pending CN114490292A (zh) | 2016-08-31 | 2017-08-23 | 用于记录可重放跟踪的计算机系统、方法、硬件存储设备 |
CN201780053059.9A Active CN109643273B (zh) | 2016-08-31 | 2017-08-23 | 用于记录可重放跟踪的计算机系统、方法、硬件存储设备 |
Family Applications After (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201780053059.9A Active CN109643273B (zh) | 2016-08-31 | 2017-08-23 | 用于记录可重放跟踪的计算机系统、方法、硬件存储设备 |
Country Status (5)
Country | Link |
---|---|
US (2) | US10042737B2 (zh) |
EP (2) | EP3507698B1 (zh) |
CN (2) | CN114490292A (zh) |
ES (1) | ES2948186T3 (zh) |
WO (1) | WO2018044629A1 (zh) |
Families Citing this family (34)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10031834B2 (en) | 2016-08-31 | 2018-07-24 | Microsoft Technology Licensing, Llc | Cache-based tracing for time travel debugging and analysis |
US10042737B2 (en) * | 2016-08-31 | 2018-08-07 | Microsoft Technology Licensing, Llc | Program tracing for time travel debugging and analysis |
US10324851B2 (en) | 2016-10-20 | 2019-06-18 | Microsoft Technology Licensing, Llc | Facilitating recording a trace file of code execution using way-locking in a set-associative processor cache |
US10310963B2 (en) | 2016-10-20 | 2019-06-04 | Microsoft Technology Licensing, Llc | Facilitating recording a trace file of code execution using index bits in a processor cache |
US10310977B2 (en) | 2016-10-20 | 2019-06-04 | Microsoft Technology Licensing, Llc | Facilitating recording a trace file of code execution using a processor cache |
US10489273B2 (en) | 2016-10-20 | 2019-11-26 | Microsoft Technology Licensing, Llc | Reuse of a related thread's cache while recording a trace file of code execution |
US10540250B2 (en) | 2016-11-11 | 2020-01-21 | Microsoft Technology Licensing, Llc | Reducing storage requirements for storing memory addresses and values |
EP3539000B1 (en) * | 2016-11-11 | 2022-04-13 | Microsoft Technology Licensing, LLC | Cache-based tracing for time travel debugging and analysis |
US10185645B2 (en) * | 2017-03-08 | 2019-01-22 | Microsoft Technology Licensing, Llc | Resource lifetime analysis using a time-travel trace |
US10318332B2 (en) | 2017-04-01 | 2019-06-11 | Microsoft Technology Licensing, Llc | Virtual machine execution tracing |
US10296442B2 (en) | 2017-06-29 | 2019-05-21 | Microsoft Technology Licensing, Llc | Distributed time-travel trace recording and replay |
US10452516B2 (en) * | 2017-07-10 | 2019-10-22 | Microsoft Technology Licensing, Llc | Replaying time-travel traces relying on processor undefined behavior |
US10795801B2 (en) | 2018-01-08 | 2020-10-06 | Ozcode Ltd | Time travel source code debugger incorporating asynchronous collaboration |
US10558572B2 (en) * | 2018-01-16 | 2020-02-11 | Microsoft Technology Licensing, Llc | Decoupling trace data streams using cache coherence protocol data |
US11907091B2 (en) | 2018-02-16 | 2024-02-20 | Microsoft Technology Licensing, Llc | Trace recording by logging influxes to an upper-layer shared cache, plus cache coherence protocol transitions among lower-layer caches |
US10481998B2 (en) * | 2018-03-15 | 2019-11-19 | Microsoft Technology Licensing, Llc | Protecting sensitive information in time travel trace debugging |
US10541042B2 (en) | 2018-04-23 | 2020-01-21 | Microsoft Technology Licensing, Llc | Level-crossing memory trace inspection queries |
US10740219B2 (en) | 2018-04-27 | 2020-08-11 | Workman Nydegger | Selectively tracing portions of computer process execution |
US10747645B2 (en) | 2018-04-27 | 2020-08-18 | Microsoft Technology Licensing, Llc | Selectively tracing portions of computer process execution |
US10698792B2 (en) | 2018-05-02 | 2020-06-30 | Microsoft Technology Licensing, Llc | Execution control with cross-level trace mapping |
US10884720B2 (en) | 2018-10-04 | 2021-01-05 | Microsoft Technology Licensing, Llc | Memory ordering annotations for binary emulation |
US10684835B1 (en) | 2018-12-11 | 2020-06-16 | Microsoft Technology Licensing, Llc | Improving emulation and tracing performance using compiler-generated emulation optimization metadata |
US11281560B2 (en) * | 2019-03-19 | 2022-03-22 | Microsoft Technology Licensing, Llc | Input/output data transformations when emulating non-traced code with a recorded execution of traced code |
US11782816B2 (en) * | 2019-03-19 | 2023-10-10 | Jens C. Jenkins | Input/output location transformations when emulating non-traced code with a recorded execution of traced code |
US10990506B2 (en) * | 2019-04-11 | 2021-04-27 | Microsoft Technology Licensing, Llc | Cross-thread memory indexing in time-travel debugging traces |
US10949332B2 (en) | 2019-08-14 | 2021-03-16 | Microsoft Technology Licensing, Llc | Data race analysis based on altering function internal loads during time-travel debugging |
US11983094B2 (en) | 2019-12-05 | 2024-05-14 | Microsoft Technology Licensing, Llc | Software diagnostic context selection and use |
US11720681B2 (en) * | 2019-12-31 | 2023-08-08 | Micron Technology, Inc. | Firmware execution profiling and verification |
US11237947B2 (en) * | 2020-01-15 | 2022-02-01 | Microsoft Technology Licensing, Llc | Diffing a plurality of subject replayable execution traces against a plurality of comparison replayable execution traces |
US11243869B2 (en) * | 2020-01-15 | 2022-02-08 | Microsoft Technologly Licensing, LLC | Diffing of replayable execution traces |
US11698847B2 (en) | 2020-01-15 | 2023-07-11 | Microsoft Technology Licensing, Llc | Diffing a subject replayable execution trace against a comparison replayable execution trace |
US11698848B2 (en) * | 2020-01-15 | 2023-07-11 | Microsoft Technology Licensing, Llc | Diffing a subject replayable execution trace against a plurality of comparison replayable execution traces |
US11409619B2 (en) | 2020-04-29 | 2022-08-09 | The Research Foundation For The State University Of New York | Recovering a virtual machine after failure of post-copy live migration |
LU500131B1 (en) * | 2021-05-06 | 2022-11-08 | Microsoft Technology Licensing Llc | Diffing prior executions of an executable program |
Family Cites Families (188)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US4598364A (en) | 1983-06-29 | 1986-07-01 | International Business Machines Corporation | Efficient trace method adaptable to multiprocessors |
AU3776793A (en) | 1992-02-27 | 1993-09-13 | Intel Corporation | Dynamic flow instruction cache memory |
US5642478A (en) * | 1994-12-29 | 1997-06-24 | International Business Machines Corporation | Distributed trace data acquisition system |
US5905855A (en) * | 1997-02-28 | 1999-05-18 | Transmeta Corporation | Method and apparatus for correcting errors in computer systems |
US6009270A (en) | 1997-04-08 | 1999-12-28 | Advanced Micro Devices, Inc. | Trace synchronization in a processor |
US6094729A (en) | 1997-04-08 | 2000-07-25 | Advanced Micro Devices, Inc. | Debug interface including a compact trace record storage |
US6167536A (en) * | 1997-04-08 | 2000-12-26 | Advanced Micro Devices, Inc. | Trace cache for a microprocessor-based device |
US5944841A (en) | 1997-04-15 | 1999-08-31 | Advanced Micro Devices, Inc. | Microprocessor with built-in instruction tracing capability |
US5893086A (en) | 1997-07-11 | 1999-04-06 | International Business Machines Corporation | Parallel file system and method with extensible hashing |
US6076156A (en) | 1997-07-17 | 2000-06-13 | Advanced Micro Devices, Inc. | Instruction redefinition using model specific registers |
US6101524A (en) * | 1997-10-23 | 2000-08-08 | International Business Machines Corporation | Deterministic replay of multithreaded applications |
US6553564B1 (en) * | 1997-12-12 | 2003-04-22 | International Business Machines Corporation | Process and system for merging trace data for primarily interpreted methods |
US6772324B2 (en) | 1997-12-17 | 2004-08-03 | Intel Corporation | Processor having multiple program counters and trace buffers outside an execution pipeline |
US6327701B2 (en) | 1998-09-15 | 2001-12-04 | Sun Microsystems, Inc. | Method and apparatus for finding bugs related to garbage collection in a virtual machine |
US6351844B1 (en) | 1998-11-05 | 2002-02-26 | Hewlett-Packard Company | Method for selecting active code traces for translation in a caching dynamic translator |
GB2348718A (en) | 1999-04-07 | 2000-10-11 | Ibm | Data processing system having a centralised trace facility with dynamic tracing |
US20020087949A1 (en) | 2000-03-03 | 2002-07-04 | Valery Golender | System and method for software diagnostics using a combination of visual and dynamic tracing |
US6832367B1 (en) * | 2000-03-06 | 2004-12-14 | International Business Machines Corporation | Method and system for recording and replaying the execution of distributed java programs |
US6598179B1 (en) | 2000-03-31 | 2003-07-22 | International Business Machines Corporation | Table-based error log analysis |
US6823473B2 (en) | 2000-04-19 | 2004-11-23 | Hewlett-Packard Development Company, L.P. | Simultaneous and redundantly threaded processor uncached load address comparator and data value replication circuit |
US6854108B1 (en) * | 2000-05-11 | 2005-02-08 | International Business Machines Corporation | Method and apparatus for deterministic replay of java multithreaded programs on multiprocessors |
US6553511B1 (en) | 2000-05-17 | 2003-04-22 | Lsi Logic Corporation | Mass storage data integrity-assuring technique utilizing sequence and revision number metadata |
US6502111B1 (en) | 2000-07-31 | 2002-12-31 | Microsoft Corporation | Method and system for concurrent garbage collection |
US6938252B2 (en) | 2000-12-14 | 2005-08-30 | International Business Machines Corporation | Hardware-assisted method for scheduling threads using data cache locality |
US7448025B2 (en) | 2000-12-29 | 2008-11-04 | Intel Corporation | Qualification of event detection by thread ID and thread privilege level |
US6634011B1 (en) | 2001-02-15 | 2003-10-14 | Silicon Graphics, Inc. | Method and apparatus for recording program execution in a microprocessor based integrated circuit |
US20020144101A1 (en) | 2001-03-30 | 2002-10-03 | Hong Wang | Caching DAG traces |
US7178133B1 (en) | 2001-04-30 | 2007-02-13 | Mips Technologies, Inc. | Trace control based on a characteristic of a processor's operating state |
US7181728B1 (en) | 2001-04-30 | 2007-02-20 | Mips Technologies, Inc. | User controlled trace records |
US7185234B1 (en) | 2001-04-30 | 2007-02-27 | Mips Technologies, Inc. | Trace control from hardware and software |
US7478394B1 (en) | 2001-06-04 | 2009-01-13 | Hewlett-Packard Development Company, L.P. | Context-corrupting context switching |
US20030079205A1 (en) | 2001-10-22 | 2003-04-24 | Takeshi Miyao | System and method for managing operating systems |
US7051239B2 (en) | 2001-12-28 | 2006-05-23 | Hewlett-Packard Development Company, L.P. | Method and apparatus for efficiently implementing trace and/or logic analysis mechanisms on a processor chip |
JP3609794B2 (ja) | 2002-03-26 | 2005-01-12 | 株式会社東芝 | トレースデータ圧縮装置、トレースデータ圧縮方法及びトレースデータ圧縮回路を内蔵したマイクロコンピュータ |
US7293256B2 (en) | 2002-06-18 | 2007-11-06 | Microsoft Corporation | Debugger causality system and methods |
US7454486B2 (en) | 2002-07-09 | 2008-11-18 | Microsoft Corporation | Profiling and tracing distributed applications |
US7089400B1 (en) | 2002-08-29 | 2006-08-08 | Advanced Micro Devices, Inc. | Data speculation based on stack-relative addressing patterns |
US20040117690A1 (en) | 2002-12-13 | 2004-06-17 | Andersson Anders J. | Method and apparatus for using a hardware disk controller for storing processor execution trace information on a storage device |
US20040153635A1 (en) | 2002-12-30 | 2004-08-05 | Kaushik Shivnandan D. | Privileged-based qualification of branch trace store data |
US7921333B2 (en) | 2003-03-19 | 2011-04-05 | Jds Uniphase Corporation | Method and systems for providing data replay, reprocess and retrigger functions in an analyzer |
US7089272B1 (en) | 2003-06-18 | 2006-08-08 | Sun Microsystems, Inc. | Specializing write-barriers for objects in a garbage collected heap |
US7984129B2 (en) | 2003-07-11 | 2011-07-19 | Computer Associates Think, Inc. | System and method for high-performance profiling of application events |
US7469324B2 (en) | 2005-01-07 | 2008-12-23 | Azul Systems, Inc. | System and method for concurrent compacting self pacing garbage collection using loaded value and access barriers |
US7150006B2 (en) | 2003-11-03 | 2006-12-12 | Microsoft Corporation | Techniques for managed code debugging |
US7512750B2 (en) | 2003-12-31 | 2009-03-31 | Intel Corporation | Processor and memory controller capable of use in computing system that employs compressed cache lines' worth of information |
US7526757B2 (en) | 2004-01-14 | 2009-04-28 | International Business Machines Corporation | Method and apparatus for maintaining performance monitoring structures in a page table for use in monitoring performance of a computer program |
US20050223364A1 (en) * | 2004-03-30 | 2005-10-06 | Peri Ramesh V | Method and apparatus to compact trace in a trace buffer |
JP2005346414A (ja) | 2004-06-03 | 2005-12-15 | Fujitsu Ltd | トレース処理プログラム、方法及び装置 |
JP4263141B2 (ja) | 2004-06-25 | 2009-05-13 | 株式会社日立製作所 | ディスク駆動装置 |
US20060036579A1 (en) | 2004-08-10 | 2006-02-16 | Byrd Stephen A | Apparatus, system, and method for associating resources using a time based algorithm |
US8010337B2 (en) | 2004-09-22 | 2011-08-30 | Microsoft Corporation | Predicting database system performance |
US7447946B2 (en) | 2004-11-05 | 2008-11-04 | Arm Limited | Storage of trace data within a data processing apparatus |
JP4114879B2 (ja) | 2005-01-21 | 2008-07-09 | インターナショナル・ビジネス・マシーンズ・コーポレーション | トレース情報収集システム、トレース情報収集方法、及びトレース情報収集プログラム |
US7437618B2 (en) | 2005-02-11 | 2008-10-14 | International Business Machines Corporation | Method in a processor for dynamically during runtime allocating memory for in-memory hardware tracing |
US7640539B2 (en) | 2005-04-12 | 2009-12-29 | International Business Machines Corporation | Instruction profiling using multiple metrics |
US8301868B2 (en) | 2005-09-23 | 2012-10-30 | Intel Corporation | System to profile and optimize user software in a managed run-time environment |
US8355801B2 (en) | 2005-09-26 | 2013-01-15 | Biosense Webster, Inc. | System and method for measuring esophagus proximity |
US7877630B1 (en) | 2005-09-28 | 2011-01-25 | Oracle America, Inc. | Trace based rollback of a speculatively updated cache |
US7984281B2 (en) | 2005-10-18 | 2011-07-19 | Qualcomm Incorporated | Shared interrupt controller for a multi-threaded processor |
US9268666B2 (en) | 2005-10-21 | 2016-02-23 | Undo Ltd. | System and method for debugging of computer programs |
GB0521465D0 (en) | 2005-10-21 | 2005-11-30 | Law Gregory E W | System and method for debugging of computer programs |
US7620938B2 (en) * | 2005-10-31 | 2009-11-17 | Microsoft Corporation | Compressed program recording |
US20070106827A1 (en) | 2005-11-08 | 2007-05-10 | Boatright Bryan D | Centralized interrupt controller |
US7461209B2 (en) | 2005-12-06 | 2008-12-02 | International Business Machines Corporation | Transient cache storage with discard function for disposable data |
US20070150881A1 (en) | 2005-12-22 | 2007-06-28 | Motorola, Inc. | Method and system for run-time cache logging |
US20070220361A1 (en) | 2006-02-03 | 2007-09-20 | International Business Machines Corporation | Method and apparatus for guaranteeing memory bandwidth for trace data |
US7991965B2 (en) | 2006-02-07 | 2011-08-02 | Intel Corporation | Technique for using memory attributes |
US8769511B2 (en) | 2006-02-16 | 2014-07-01 | The Regents Of The University Of California | Dynamic incremental compiler and method |
JP2007328770A (ja) | 2006-05-10 | 2007-12-20 | Ricoh Co Ltd | 情報処理装置、アクセス制御方法、アクセス制御プログラム、記録媒体、及び画像形成装置 |
US7958497B1 (en) * | 2006-06-07 | 2011-06-07 | Replay Solutions, Inc. | State synchronization in recording and replaying computer programs |
US7676632B2 (en) | 2006-07-18 | 2010-03-09 | Via Technologies, Inc. | Partial cache way locking |
US7472218B2 (en) | 2006-09-08 | 2008-12-30 | International Business Machines Corporation | Assisted trace facility to improve CPU cache performance |
US20080114964A1 (en) | 2006-11-14 | 2008-05-15 | Davis Gordon T | Apparatus and Method for Cache Maintenance |
US20080250207A1 (en) | 2006-11-14 | 2008-10-09 | Davis Gordon T | Design structure for cache maintenance |
US8370806B2 (en) | 2006-11-15 | 2013-02-05 | Qualcomm Incorporated | Non-intrusive, thread-selective, debugging method and system for a multi-thread digital signal processor |
US7549025B2 (en) | 2006-12-06 | 2009-06-16 | Sun Microsystems, Inc. | Efficient marking of shared cache lines |
CN100555240C (zh) * | 2007-01-16 | 2009-10-28 | 国际商业机器公司 | 用于诊断应用程序的方法和系统 |
US8296775B2 (en) | 2007-01-31 | 2012-10-23 | Microsoft Corporation | Efficient context switching of virtual processors by managing physical register states in a virtualized environment |
US8261130B2 (en) | 2007-03-02 | 2012-09-04 | Infineon Technologies Ag | Program code trace signature |
US7840759B2 (en) | 2007-03-21 | 2010-11-23 | International Business Machines Corporation | Shared cache eviction |
US7904493B2 (en) | 2007-03-30 | 2011-03-08 | Sap Ag | Method and system for object age detection in garbage collection heaps |
US8087017B1 (en) | 2007-04-09 | 2011-12-27 | Moka5, Inc. | Trace-assisted prefetching of virtual machines in a distributed system |
US8185698B2 (en) | 2007-04-09 | 2012-05-22 | Bratin Saha | Hardware acceleration of a write-buffering software transactional memory |
US8484516B2 (en) | 2007-04-11 | 2013-07-09 | Qualcomm Incorporated | Inter-thread trace alignment method and system for a multi-threaded processor |
US20090007111A1 (en) | 2007-06-27 | 2009-01-01 | Vmware, Inc. | Logging and replaying input/output events for a virtual machine |
US8171225B2 (en) | 2007-06-28 | 2012-05-01 | Intel Corporation | Cache for a multi thread and multi core system and methods thereof |
US7698504B2 (en) | 2007-07-03 | 2010-04-13 | Oracle America, Inc. | Cache line marking with shared timestamps |
US20090037886A1 (en) | 2007-07-30 | 2009-02-05 | Mips Technologies, Inc. | Apparatus and method for evaluating a free-running trace stream |
US8161323B2 (en) | 2007-10-19 | 2012-04-17 | Oracle International Corporation | Health monitor |
US7844954B2 (en) | 2007-11-06 | 2010-11-30 | Vmware, Inc. | Using branch instruction counts to facilitate replay of virtual machine instruction execution |
US7840839B2 (en) | 2007-11-06 | 2010-11-23 | Vmware, Inc. | Storage handling for fault tolerance in virtual machines |
US8627302B2 (en) | 2007-11-27 | 2014-01-07 | Oracle America, Inc. | Sampling based runtime optimizer for efficient debugging of applications |
CN101446909B (zh) * | 2007-11-30 | 2011-12-28 | 国际商业机器公司 | 用于管理任务事件的方法和系统 |
US7962314B2 (en) | 2007-12-18 | 2011-06-14 | Global Foundries Inc. | Mechanism for profiling program software running on a processor |
US8078807B2 (en) | 2007-12-27 | 2011-12-13 | Intel Corporation | Accelerating software lookups by using buffered or ephemeral stores |
US8832682B2 (en) | 2008-03-28 | 2014-09-09 | Vmware, Inc. | Trace collection for a virtual machine |
US9336066B2 (en) | 2008-06-19 | 2016-05-10 | Intel Corporation | Hybrid linear validation algorithm for software transactional memory (STM) systems |
US9058420B2 (en) | 2008-06-20 | 2015-06-16 | Vmware, Inc. | Synchronous decoupled program analysis in virtual environments |
US8321842B2 (en) | 2008-06-27 | 2012-11-27 | Vmware, Inc. | Replay time only functionalities in a virtual machine |
US8473946B2 (en) | 2008-07-03 | 2013-06-25 | Vmware, Inc. | Efficient recording and replaying of non-deterministic instructions in a virtual machine and CPU therefor |
JP5176837B2 (ja) | 2008-09-30 | 2013-04-03 | 富士通株式会社 | 情報処理システム及びその管理方法、制御プログラム並びに記録媒体 |
US8499297B2 (en) | 2008-10-28 | 2013-07-30 | Vmware, Inc. | Low overhead fault tolerance through hybrid checkpointing and replay |
US8103834B2 (en) | 2008-10-29 | 2012-01-24 | Oracle America, Inc. | Coherence protocol with dynamic privatization |
US9910688B2 (en) | 2008-11-28 | 2018-03-06 | Red Hat, Inc. | Implementing aspects with callbacks in virtual machines |
US8259118B2 (en) | 2008-12-12 | 2012-09-04 | Mobitv, Inc. | Event based interactive animation |
US20100162247A1 (en) | 2008-12-19 | 2010-06-24 | Adam Welc | Methods and systems for transactional nested parallelism |
US8413122B2 (en) * | 2009-02-12 | 2013-04-02 | International Business Machines Corporation | System and method for demonstrating the correctness of an execution trace in concurrent processing environments |
US9256514B2 (en) * | 2009-02-19 | 2016-02-09 | Nvidia Corporation | Debugging and perfomance analysis of applications |
US20100223446A1 (en) | 2009-02-27 | 2010-09-02 | Microsoft Corporation | Contextual tracing |
US8402318B2 (en) * | 2009-03-24 | 2013-03-19 | The Trustees Of Columbia University In The City Of New York | Systems and methods for recording and replaying application execution |
US8589629B2 (en) | 2009-03-27 | 2013-11-19 | Advanced Micro Devices, Inc. | Method for way allocation and way locking in a cache |
US8140903B2 (en) | 2009-04-16 | 2012-03-20 | International Business Machines Corporation | Hardware process trace facility |
US8423965B2 (en) | 2009-06-23 | 2013-04-16 | Microsoft Corporation | Tracing of data flow |
JP2011013867A (ja) | 2009-06-30 | 2011-01-20 | Panasonic Corp | データ処理装置、性能評価解析システム |
US9348624B2 (en) | 2009-07-23 | 2016-05-24 | International Business Machines Corporation | Monitoring file access of java processes |
US8656222B2 (en) | 2009-07-30 | 2014-02-18 | Vmware, Inc. | Method and system for recording a selected computer process for subsequent replay |
US8719796B2 (en) | 2010-01-26 | 2014-05-06 | The Board Of Trustees Of The University Of Illinois | Parametric trace slicing |
US8966623B2 (en) | 2010-03-08 | 2015-02-24 | Vmware, Inc. | Managing execution of a running-page in a virtual machine |
US8468501B2 (en) | 2010-04-21 | 2013-06-18 | International Business Machines Corporation | Partial recording of a computer program execution for replay |
US8407321B2 (en) | 2010-04-21 | 2013-03-26 | Microsoft Corporation | Capturing web-based scenarios |
US9015441B2 (en) | 2010-04-30 | 2015-04-21 | Microsoft Technology Licensing, Llc | Memory usage scanning |
US8499200B2 (en) | 2010-05-24 | 2013-07-30 | Ncr Corporation | Managing code-tracing data |
US8195984B2 (en) | 2010-05-26 | 2012-06-05 | Telcordia Technologies, Inc. | System and method for a staggered execution environment |
US8769518B1 (en) | 2010-06-29 | 2014-07-01 | Ca, Inc. | Ensuring determinism during programmatic replay in a virtual machine |
US8499299B1 (en) | 2010-06-29 | 2013-07-30 | Ca, Inc. | Ensuring deterministic thread context switching in virtual machine applications |
US20120042212A1 (en) | 2010-08-10 | 2012-02-16 | Gilbert Laurenti | Mixed Mode Processor Tracing |
US8826273B1 (en) | 2010-12-22 | 2014-09-02 | Vmware, Inc. | Synchronously logging to disk for main-memory database systems through record and replay |
US8510597B2 (en) | 2011-02-08 | 2013-08-13 | Wisconsin Alumni Research Foundation | Providing restartable file systems within computing devices |
US9063766B2 (en) | 2011-03-16 | 2015-06-23 | Vmware, Inc. | System and method of manipulating virtual machine recordings for high-level execution and replay |
US8689214B2 (en) | 2011-03-24 | 2014-04-01 | Amazon Technologies, Inc. | Replication of machine instances in a computing environment |
US8427347B1 (en) | 2011-03-30 | 2013-04-23 | Altera Corporation | Dynamic data compression and decompression |
US8839245B1 (en) | 2012-06-18 | 2014-09-16 | Bromium, Inc. | Transferring files using a virtualized application |
US9645913B2 (en) | 2011-08-03 | 2017-05-09 | Daniel Geist | Method and apparatus for debugging programs |
US20130055033A1 (en) | 2011-08-22 | 2013-02-28 | International Business Machines Corporation | Hardware-assisted program trace collection with selectable call-signature capture |
US8584110B2 (en) | 2011-09-30 | 2013-11-12 | International Business Machines Corporation | Execution trace truncation |
US9280379B2 (en) | 2012-02-28 | 2016-03-08 | Red Hat Israel, Ltd. | Hibernation via paravirtualization |
US8612650B1 (en) | 2012-03-13 | 2013-12-17 | Western Digital Technologies, Inc. | Virtual extension of buffer to reduce buffer overflow during tracing |
US9250945B2 (en) | 2012-03-27 | 2016-02-02 | Microsoft Technology Licensing, Llc | Detecting a repeating execution time sequence in a virtual machine |
US8694562B2 (en) | 2012-05-22 | 2014-04-08 | Microsoft Corporation | Generational garbage collection for a pool-based heap |
CN103577310A (zh) * | 2012-07-20 | 2014-02-12 | 腾讯科技(深圳)有限公司 | 记录软件调试日志的方法以及装置 |
US9342454B2 (en) | 2012-08-02 | 2016-05-17 | International Business Machines Corporation | Nested rewind only and non rewind only transactions in a data processing system supporting transactional storage accesses |
US9164809B2 (en) | 2012-09-04 | 2015-10-20 | Red Hat Israel, Ltd. | Virtual processor provisioning in virtualized computer systems |
US9317297B2 (en) * | 2012-09-27 | 2016-04-19 | Intel Corporation | Replay execution of instructions in thread chunks in the chunk order recorded during previous execution |
US9015121B1 (en) | 2013-01-15 | 2015-04-21 | Emc Corporation | Unified virtual machine and data storage snapshots |
US9135145B2 (en) | 2013-01-28 | 2015-09-15 | Rackspace Us, Inc. | Methods and systems of distributed tracing |
JP6132065B2 (ja) * | 2013-03-13 | 2017-05-24 | インテル・コーポレーション | 性能及び正確性のためのマルチスレッドソフトウェアプログラムの記録された実行の視覚化 |
US9058415B1 (en) | 2013-03-15 | 2015-06-16 | Google Inc. | Counting events using hardware performance counters and annotated instructions |
US9304863B2 (en) | 2013-03-15 | 2016-04-05 | International Business Machines Corporation | Transactions for checkpointing and reverse execution |
US20130283242A1 (en) | 2013-04-20 | 2013-10-24 | Concurix Corporation | Tracing Closures in a Callback Environment |
US9807116B2 (en) | 2013-05-03 | 2017-10-31 | Vmware, Inc. | Methods and apparatus to identify priorities of compliance assessment results of a virtual computing environment |
JP6115331B2 (ja) | 2013-06-06 | 2017-04-19 | 富士通株式会社 | トランザクション再開プログラム、情報処理装置及びトランザクション再開方法 |
US9189360B2 (en) | 2013-06-15 | 2015-11-17 | Intel Corporation | Processor that records tracing data in non contiguous system memory slices |
US20150012699A1 (en) | 2013-07-02 | 2015-01-08 | Lsi Corporation | System and method of versioning cache for a clustering topology |
US9086974B2 (en) | 2013-09-26 | 2015-07-21 | International Business Machines Corporation | Centralized management of high-contention cache lines in multi-processor computing environments |
US10007592B2 (en) * | 2013-10-22 | 2018-06-26 | Purdue Research Foundation | Debugging non-deterministic embedded systems |
US20150319221A1 (en) | 2014-04-30 | 2015-11-05 | AppDynamics, Inc. | Tracing business transactions based on application frameworks |
US9785568B2 (en) | 2014-05-19 | 2017-10-10 | Empire Technology Development Llc | Cache lookup bypass in multi-level cache systems |
US9535815B2 (en) | 2014-06-04 | 2017-01-03 | Nvidia Corporation | System, method, and computer program product for collecting execution statistics for graphics processing unit workloads |
US9300320B2 (en) | 2014-06-27 | 2016-03-29 | Qualcomm Incorporated | System and method for dictionary-based cache-line level code compression for on-chip memories using gradual bit removal |
US9875173B2 (en) | 2014-06-30 | 2018-01-23 | Microsoft Technology Licensing, Llc | Time travel debugging in managed runtime |
US9329884B2 (en) | 2014-07-11 | 2016-05-03 | Intel Corporation | Managing generated trace data for a virtual machine |
US20170192886A1 (en) | 2014-07-31 | 2017-07-06 | Hewlett Packard Enterprise Development Lp | Cache management for nonvolatile main memory |
US9361228B2 (en) | 2014-08-05 | 2016-06-07 | Qualcomm Incorporated | Cache line compaction of compressed data segments |
US10241691B2 (en) | 2014-11-04 | 2019-03-26 | Rubrik, Inc. | Data management system |
CN104461876B (zh) * | 2014-11-26 | 2017-09-22 | 北京航空航天大学 | 一种基于运行快照序列的并行程序重现调试方法 |
US9639432B2 (en) | 2014-12-01 | 2017-05-02 | Citrix Systems, Inc. | Live rollback for a computing environment |
US9798900B2 (en) | 2015-03-26 | 2017-10-24 | Intel Corporation | Flexible counter system for memory protection |
US9588870B2 (en) | 2015-04-06 | 2017-03-07 | Microsoft Technology Licensing, Llc | Time travel debugging for browser components |
US9864538B1 (en) | 2015-06-25 | 2018-01-09 | Amazon Technologies, Inc. | Data size reduction |
US10509713B2 (en) | 2015-08-18 | 2019-12-17 | Telefonaktiebolaget Lm Ericsson (Publ) | Observation by a debug host with memory model and timing offset calculation between instruction and data traces of software execution carried on in a debug target having a main memory and a cache arrangement |
US9767237B2 (en) | 2015-11-13 | 2017-09-19 | Mentor Graphics Corporation | Target capture and replay in emulation |
US9569338B1 (en) | 2015-12-02 | 2017-02-14 | International Business Machines Corporation | Fingerprint-initiated trace extraction |
CN105718374A (zh) * | 2016-01-26 | 2016-06-29 | 国家信息技术安全研究中心 | 一种热点模块指令跟踪的方法及系统 |
US20170286111A1 (en) | 2016-04-01 | 2017-10-05 | Intel Corporation | Instruction, Circuits, and Logic for Data Capture for Software Monitoring and Debugging |
US9965375B2 (en) | 2016-06-28 | 2018-05-08 | Intel Corporation | Virtualizing precise event based sampling |
US10042576B2 (en) | 2016-08-17 | 2018-08-07 | Advanced Micro Devices, Inc. | Method and apparatus for compressing addresses |
US10031834B2 (en) | 2016-08-31 | 2018-07-24 | Microsoft Technology Licensing, Llc | Cache-based tracing for time travel debugging and analysis |
US10042737B2 (en) | 2016-08-31 | 2018-08-07 | Microsoft Technology Licensing, Llc | Program tracing for time travel debugging and analysis |
US10031833B2 (en) | 2016-08-31 | 2018-07-24 | Microsoft Technology Licensing, Llc | Cache-based tracing for time travel debugging and analysis |
WO2018071450A1 (en) | 2016-10-11 | 2018-04-19 | Green Hills Software, Inc. | Systems, methods, and devices for vertically integrated instrumentation and trace reconstruction |
US10489273B2 (en) | 2016-10-20 | 2019-11-26 | Microsoft Technology Licensing, Llc | Reuse of a related thread's cache while recording a trace file of code execution |
US10310977B2 (en) | 2016-10-20 | 2019-06-04 | Microsoft Technology Licensing, Llc | Facilitating recording a trace file of code execution using a processor cache |
US10310963B2 (en) | 2016-10-20 | 2019-06-04 | Microsoft Technology Licensing, Llc | Facilitating recording a trace file of code execution using index bits in a processor cache |
US10324851B2 (en) | 2016-10-20 | 2019-06-18 | Microsoft Technology Licensing, Llc | Facilitating recording a trace file of code execution using way-locking in a set-associative processor cache |
US10540250B2 (en) | 2016-11-11 | 2020-01-21 | Microsoft Technology Licensing, Llc | Reducing storage requirements for storing memory addresses and values |
US9934127B1 (en) | 2017-03-08 | 2018-04-03 | Microsoft Technology Licensing, Llc | Indexing a trace by insertion of key frames for replay responsiveness |
US10318332B2 (en) | 2017-04-01 | 2019-06-11 | Microsoft Technology Licensing, Llc | Virtual machine execution tracing |
US10296442B2 (en) | 2017-06-29 | 2019-05-21 | Microsoft Technology Licensing, Llc | Distributed time-travel trace recording and replay |
-
2016
- 2016-08-31 US US15/252,998 patent/US10042737B2/en active Active
-
2017
- 2017-08-23 EP EP17768274.7A patent/EP3507698B1/en active Active
- 2017-08-23 CN CN202210093599.2A patent/CN114490292A/zh active Pending
- 2017-08-23 ES ES17768274T patent/ES2948186T3/es active Active
- 2017-08-23 CN CN201780053059.9A patent/CN109643273B/zh active Active
- 2017-08-23 WO PCT/US2017/048094 patent/WO2018044629A1/en unknown
- 2017-08-23 EP EP23164451.9A patent/EP4220410A1/en active Pending
-
2018
- 2018-08-07 US US16/057,353 patent/US10963367B2/en active Active
Also Published As
Publication number | Publication date |
---|---|
US10042737B2 (en) | 2018-08-07 |
US20180060213A1 (en) | 2018-03-01 |
CN109643273B (zh) | 2022-02-01 |
WO2018044629A1 (en) | 2018-03-08 |
EP3507698A1 (en) | 2019-07-10 |
US20190018755A1 (en) | 2019-01-17 |
ES2948186T3 (es) | 2023-09-01 |
US10963367B2 (en) | 2021-03-30 |
EP4220410A1 (en) | 2023-08-02 |
EP3507698B1 (en) | 2023-05-24 |
CN109643273A (zh) | 2019-04-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109643273B (zh) | 用于记录可重放跟踪的计算机系统、方法、硬件存储设备 | |
US20220012162A1 (en) | Cache-based tracing for time travel debugging and analysis | |
US10031833B2 (en) | Cache-based tracing for time travel debugging and analysis | |
CN109964207B (zh) | 用于时间旅行调试和分析的计算机系统、计算机系统处实施的方法和硬件存储设备 | |
US10481998B2 (en) | Protecting sensitive information in time travel trace debugging | |
Chen et al. | Deterministic replay: A survey | |
US20200167261A1 (en) | Tentative execution of code in a debugger | |
EP3652648B1 (en) | Replaying time-travel traces relying on processor undefined behavior | |
US10671512B2 (en) | Processor memory reordering hints in a bit-accurate trace | |
Ren et al. | Leveraging hardware-assisted virtualization for deterministic replay on commodity multi-core processors | |
Wang et al. | Towards the multithreaded deterministic replay in program debugging | |
Narayanasamy | Deterministic replay using processor support and its applications | |
CN117157632A (zh) | 在记录位精确踪迹时日志记录高速缓存行寿命提示 | |
Honarmand | Record and deterministic replay of parallel programs on multiprocessors | |
Frank | System Support for Implicitly Parallel Programming | |
Alipour et al. | Hardware Support for Software Debugging; An Overview |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |