CN110998541A - 调试器中的代码的试验性执行 - Google Patents
调试器中的代码的试验性执行 Download PDFInfo
- Publication number
- CN110998541A CN110998541A CN201880050455.0A CN201880050455A CN110998541A CN 110998541 A CN110998541 A CN 110998541A CN 201880050455 A CN201880050455 A CN 201880050455A CN 110998541 A CN110998541 A CN 110998541A
- Authority
- CN
- China
- Prior art keywords
- execution
- entity
- trace
- computer system
- value
- 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.)
- Granted
Links
- 230000015654 memory Effects 0.000 claims abstract description 97
- 238000000034 method Methods 0.000 claims abstract description 32
- 230000008569 process Effects 0.000 claims abstract description 8
- 238000004590 computer program Methods 0.000 claims 1
- 238000012545 processing Methods 0.000 description 15
- 238000002955 isolation Methods 0.000 description 11
- 238000001514 detection method Methods 0.000 description 10
- 230000000694 effects Effects 0.000 description 7
- 230000007613 environmental effect Effects 0.000 description 7
- 230000005540 biological transmission Effects 0.000 description 6
- 230000002441 reversible effect Effects 0.000 description 5
- 230000008859 change Effects 0.000 description 4
- 238000004458 analytical method Methods 0.000 description 3
- 238000004891 communication Methods 0.000 description 3
- 238000010586 diagram Methods 0.000 description 3
- 230000006870 function Effects 0.000 description 3
- 230000036961 partial effect Effects 0.000 description 3
- 230000002829 reductive effect Effects 0.000 description 3
- 238000011161 development Methods 0.000 description 2
- 230000002411 adverse Effects 0.000 description 1
- 238000013459 approach Methods 0.000 description 1
- 230000006399 behavior Effects 0.000 description 1
- 239000000470 constituent Substances 0.000 description 1
- 238000013500 data storage Methods 0.000 description 1
- 230000000977 initiatory effect Effects 0.000 description 1
- 230000003993 interaction Effects 0.000 description 1
- 230000009249 intrinsic sympathomimetic activity Effects 0.000 description 1
- 230000000670 limiting effect Effects 0.000 description 1
- 230000007257 malfunction Effects 0.000 description 1
- 238000005259 measurement Methods 0.000 description 1
- 230000005055 memory storage Effects 0.000 description 1
- 238000005457 optimization Methods 0.000 description 1
- 230000008520 organization Effects 0.000 description 1
- 230000002085 persistent effect Effects 0.000 description 1
- 229920001690 polydopamine Polymers 0.000 description 1
- 238000011176 pooling Methods 0.000 description 1
- 238000011084 recovery Methods 0.000 description 1
- 238000004088 simulation Methods 0.000 description 1
- 238000013522 software testing Methods 0.000 description 1
- 239000007787 solid Substances 0.000 description 1
- 230000003595 spectral effect Effects 0.000 description 1
- 239000000725 suspension Substances 0.000 description 1
- 230000002123 temporal effect Effects 0.000 description 1
- 238000012546 transfer Methods 0.000 description 1
- 230000001052 transient effect Effects 0.000 description 1
- 238000013519 translation Methods 0.000 description 1
- 230000014616 translation Effects 0.000 description 1
Images
Classifications
-
- 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/3457—Performance evaluation by simulation
- G06F11/3461—Trace driven simulation
-
- 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/3457—Performance evaluation by simulation
-
- 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
-
- 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/3604—Software analysis for verifying properties of programs
- G06F11/3612—Software analysis for verifying properties of programs by runtime analysis
-
- 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/3624—Software debugging by performing operations on the source code, e.g. via a compiler
-
- 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/3632—Software debugging of specific synchronisation aspects
-
- 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/366—Software debugging using diagnostics
-
- 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)
- Software Systems (AREA)
- Debugging And Monitoring (AREA)
Abstract
试验性执行实体包括执行实体的第一执行。在第一执行中的点处,暂停第一执行并且接收指定用于运行时数据元素的替换值的输入。基于该输入,在第一执行中的点处开始执行实体的第二执行,同时使得第一执行能够稍后恢复,而不由第二执行影响。第二执行包括将运行时数据元素设定为替换值,并且模拟在第二执行期间由实体执行的一个或多个存储器写入。实体的第一执行可以包括实时执行、基于跟踪数据的执行、基于过程转储的执行等。
Description
背景技术
当在软件应用的开发期间编写代码时,开发者通常花费大量的时间“调试”代码以找到运行时和其他源代码错误。这样做时,开发者可以采用几种方法再现和定位源代码故障,诸如基于不同输入观察程序的行为、***调试代码(例如,打印变量值、跟踪执行的分支等)、暂时移除代码部分等。跟踪运行时错误以找准代码故障可能占用应用开发时间的很大一部分。
已经开发了许多类型的调试应用(“调试器”)以便利用代码调试过程辅助开发者。这些工具给开发者提供跟踪、可视化和改变计算机代码的执行的能力。例如,除了其他方面之外,调试器可以可视化代码指令的执行、可以呈现代码执行期间的各时间处的代码变量值、可以使得开发者能够改变代码执行路径、和/或可以使得开发者能够在感兴趣的代码元素上设定“中断点”和/或“观察点”(其在执行期间到达时,使得代码的执行暂停)。
一种新兴形式的调试应用支持“时间旅行”、“反转”或“历史”调试。利用“时间旅行”调试,程序(例如,可执行实体,诸如线程)的执行由跟踪应用记录/跟踪到一个或多个跟踪文件中。这些(一个或多个)跟踪文件然后可以被用于稍后重放程序的执行以用于正向分析和反向分析二者。例如,“时间旅行”调试器可以使得开发者能够设定正向中断点/观察点(像常规调试器一样)以及反向中断点/观察点。
发明内容
在此的实施例通过提供试验性执行代码的调试器能力来改进调试体验。试验性执行代码使得调试器能够在调试可执行实体时向“假如…怎么样?”问题提供答案。例如,当执行实体时,调试器可以在某个时间点处(诸如在中断点处)暂停执行。在那里,调试器可以呈现各种执行状态,诸如寄存器的值、变量的值和/或其他运行时数据元素的值。根据本文中的实施例,还使得调试器能够采用用户输入来修改这些值中的一个或多个。然后,调试器可以利用改变的(一个或多个)值和跟踪文件来执行实体的试验性执行。这样做时,调试器将试验性执行的状态与原始执行状态相隔离,使得试验性执行可以被放弃并且执行可以在没有原始重放状态的结果的情况下使用(一个或多个)正常值从暂停点恢复。因此,这些实施例使得用户能够参与“假如…怎么样”假设以基于程序状态的改变部分看执行可能如何偏离(或者已经偏离)。实施例使得试验性执行能够在基于跟踪文件执行的实体(即,“时间旅行”调试会话中的实体的重放)、实时执行的实体(即,实时调试会话中的实体的原始执行)、基于从过程转储获得的状态执行的实体等上执行。
在一些实施例中,一种用于试验性执行实体的方法包括执行实体的第一执行。方法还包括在实体的第一执行中的点处暂停实体的第一执行,并且标识由实体使用的运行时数据元素。运行时数据元素具有基于重放执行的第一值。方法还包括接收指定用于运行时数据元素的第二不同值的输入。基于该输入,方法还包括在第一执行中的点处开始执行实体的第二执行,同时使得第一执行能够稍后恢复,而不由第二执行影响。执行第二执行包括将运行时数据元素设定为第二值,并且模拟在第二执行期间由实体执行的一个或多个存储器写入。
在“时间旅行”调试的上下文中操作的其他实施例中,一种用于试验性执行跟踪实体的方法包括执行实体的第一执行。第一执行包括基于利用一个或多个跟踪数据流向实体提供输入的实体的重放执行。一个或多个跟踪数据流在实体的先前执行期间被记录。方法还包括在实体的第一执行中的点处暂停实体的第一执行,并且标识由实体使用的运行时数据元素。运行时数据元素具有基于重放执行的第一值。方法还包括接收指定用于运行时数据元素的第二不同值的输入。基于该输入,方法还包括在第一执行中的点处开始执行实体的第二执行,同时使得第一执行能够稍后恢复,而不由第二执行影响。执行第二执行包括将运行时数据元素设定为第二值,利用一个或多个跟踪数据流向实体提供输入,并且模拟在第二执行期间由实体执行的一个或多个存储器写入。
提供本发明内容以引入以在详细描述中下面具体实施方式的简化形式的概念的选择。本发明内容不旨在标识要求保护的主题的关键特征或基本特征,其也不旨在被用作辅助确定要求保护的主题的范围。
附图说明
为了描述可以获得本发明的上文记载和其他优点和特征的方式,上文简要描述的本发明的更具体描述将通过参考在附图中图示的其特定实施例而被提供。理解这些附图仅描绘了本发明的典型实施例并且因此将不被认为是对其范围的限制,本发明将通过使用附图利用附加的特殊性和细节来描述和解释,其中:
图1图示了促进时间旅行记录和重放的示例计算环境;
图2图示了表示三个可执行实体的执行的一部分的示例时序图;
图3图示了基于图2的时序图记录的跟踪文件的示例;
图4图示了试验性执行处理程序的示例;
图5图示了基于跟踪文件的实体的试验性重放的示例时间线;以及
图6图示了用于试验性执行实体的示例方法的流程图。
具体实施方式
本文中的实施例通过提供试验性执行代码的调试器能力来改进调试体验。试验性执行代码使得调试器能够在调试可执行实体时向“假如…怎么样?”问题提供答案。例如,当执行实体时,调试器可以在某个时间点处(诸如在中断点处)暂停执行。在那里,调试器可以呈现各种执行状态,诸如寄存器的值、变量的值和/或其他运行时数据元素的值。根据本文中的实施例,还使得调试器能够采用用户输入来修改这些值中的一个或多个。然后,调试器可以利用改变的(一个或多个)值和跟踪文件执行实体的试验性执行。这样做时,调试器将试验性执行的状态与原始执行状态相隔离,使得试验性执行可以放弃并且执行可以在没有原始重放状态的结果的情况下使用(一个或多个)正常值从暂停点恢复。因此,这些实施例使得用户能够参与“假如…怎么样”假设以基于程序状态的改变部分看执行可能如何偏离(或者已经偏离)。实施例使得试验性执行能够在基于跟踪文件执行的实体(即,“时间旅行”调试会话中的实体的重放)、实时执行的实体(即,实时调试会话中的实体的原始执行)、基于从过程转储获得的状态执行的实体等上执行。
图1图示了促进时间旅行跟踪记录和重放以及试验性执行代码的示例计算环境100。如所描绘的,实施例可以包括或者利用专用或者通用计算机***101,其包括计算机硬件,诸如例如一个或多个处理器102、***存储器103、一个或多个数据存储库104、和/或输入/输出硬件105(例如,诸如描绘的键盘/鼠标硬件105a、网络硬件105b和显示设备105c)。在一些实施例中,计算机***101和其中的部件可以包括虚拟化环境。
本发明的范围内的实施例包括用于携带或者存储计算机可执行指令和/或数据结构的物理和其他计算机可读介质。这样的计算机可读介质可以是可以由计算机***101访问的任何可用介质。存储计算机可执行指令和/或数据结构的计算机可读介质是计算机存储介质。携带计算机可执行指令和/或数据结构的计算机可读介质是传输介质。因此,以示例而非限制的方式,本发明的实施例可以包括至少两个不同地不同的种类的计算机可读介质:存储介质和传输介质。
计算机存储设备是存储计算机可执行指令和/或数据结构的物理硬件设备。计算机存储设备包括各种计算机硬件,诸如RAM、ROM、EEPROM、固态驱动器(“SDD”)、闪存、相变存储器(“PCM”)、光谱存储装置、磁盘存储装置或其他磁存储设备、或者可以被用于以计算机可执行指令或数据结构的形式存储程序代码并且可以由计算机***101访问和执行以实现本发明的所公开的功能的任何其他(一个或多个)硬件设备。因此,例如,计算机存储设备可以包括所描绘的***存储器103、可以存储计算机可执行指令和/或数据结构的所描绘的数据存储库104、或者其他存储装置(诸如处理器存储装置),如稍后所讨论的。
传输介质可以包括可以被用于以计算机可执行指令或数据结构的形式携带程序代码并且可以由计算机***101访问的网络和/数据链路。“网络”被定义为支持计算机***和/或模块和/或其他电子设备之间的电子数据的传输的一个或多个数据链路。当信息通过网络或者另一通信连接(或者硬连线、无线或者硬连线或无线的组合)被传送或者被提供到计算机***时,计算机***可以将连接视为传输介质。上文的组合还应当被包括在计算机可读介质的范围内。例如,输入/输出硬件105可以包括连接可以被用于以计算机可执行指令或数据结构的形式存储程序代码的网络和/或数据链路的网络硬件105b(例如,硬连线或无线网络接口模块)。
进一步地,在到达各种计算机***组件时,以计算机可执行指令或数据结构的形式的程序代码装置可以从传输介质自动地传送到计算机存储介质(设备)(或反之亦然)。例如,通过网络或数据链路接收到的计算机可执行指令或数据结构可以被缓冲在网络硬件105b内的RAM中,并且然后最终被传送到***存储器103和/或计算机***101处的较少易失性计算机存储设备(例如,数据存储库104)。因此,应当理解,计算机存储设备可以被包括在还(或甚至主要地)利用传输介质的计算机***组件中。
计算机可执行指令包括例如指令和数据,其当在(一个或多个)处理器102处执行时,使得计算机***101执行某个功能或功能组。计算机可执行指令可以是例如二进制、中间格式指令(诸如汇编语言或甚至源代码)。
本领域的技术人员将理解到,本发明可以被实践在具有许多类型的计算机***配置的网络计算环境中,包括个人计算机、台式计算机、膝上型计算机、消息处理器、手持式设备、可穿戴设备、多处理器***、基于微处理器或可编程的消费者电子产品、网络PC、小型计算机、大型计算机、移动电话、PDA、平板电脑、寻呼机、路由器、交换机等。本发明还可以被实践在其中通过网络链接(或者通过硬连线数据链路、无线数据链路或者通过硬连线数据链路和无线数据链路的组合)本地计算***和远程计算机***二者执行任务的分布式***环境中。如此,在分布式***环境中,计算机***可以包括多个构成计算机***。在分布式***环境中,程序模块可以被定位在本地存储器存储设备和远程存储器存储设备二者中。
本领域的技术人员还将理解到,可以在云计算环境中实践本发明。云计算环境可以是分布式的,但是这不是必须的。当分布时,云计算环境可以国际上被分布在组织内和/或具有跨多个组织拥有的部件。在本说明书和所附权利要求中,“云计算”被定义为用于使能对可配置的计算资源(例如,网络、服务器、存储装置、应用和服务)的共享池的按需网络访问的模型。“云计算”的定义不限于当适当地部署时可以从这样的模型获得的其他许多优点中的任一个。
云计算模型可以包括各种特点(诸如例如按需自服务、宽网络访问、资源池化、迅速弹性、测量服务等)。云计算模型还可以以各种服务模型(诸如例如软件即服务(“SasS”)、平台即服务(“PaaS”)和基础设施即服务(“IaaS”))的形式出现。还可以使用不同的部署模型(诸如私有云、社区云、公共云、混合云等)部署云计算模型。
一些实施例(诸如云计算环境)可以包括一种***,其包括各自能够运行一个或多个虚拟机的一个或多个主机。在操作期间,虚拟机模拟操作计算***,支持操作***以及也许一个或多个其他应用。在一些实施例中,每个主机包括管理程序,其使用从虚拟机的视图提取的物理资源模拟用于虚拟机的虚拟资源。管理程序还提供了虚拟机之间的适当的隔离。因此,从任何给定虚拟机的视角,虽然虚拟机仅与物理资源的出现(例如,虚拟资源)进行对接,但是管理程序提供虚拟机与物理资源进行对接的错觉。物理资源的示例包括处理能力、存储器、磁盘空间、网络带宽、介质驱动器,等等。
通常包括持久存储的数据存储库104可以存储表示应用代码的计算机可执行指令和/或数据结构,诸如例如调试器106(包括例如记录部件106a、重放部件106b、试验性执行处理程序106c等)、操作***107和应用108(包括应用108的可执行代码108a的部分)。数据存储库104还可以存储其他类型的数据,诸如一个或多个跟踪文件109。当应用代码(例如,使用(一个或多个)处理器102)执行时,***存储器103可以存储对应的运行时数据,诸如运行时数据结构、计算机可执行指令等。因此,图1将***存储器103图示为包括运行时调试器数据106'(运行时记录数据106a'、运行时重放数据106b'、运行时试验性执行处理程序数据106c'等)、运行时操作***数据107'和运行时应用数据108'(包括例如当其执行时的应用108的运行时变量、数据结构等,以及作为代码部分108a的存储器内副本的运行时代码部分108a')。
虽然记录部件106a和重放部件106b被描绘为调试器106的一部分,但是将理解到,这些部件中的一个或多个可以是独立应用或者某个其他应用的一部分。记录部件106a可用于跟踪应用(诸如应用108(包括其可执行代码部分108a))的执行,并且将跟踪数据存储在(一个或多个)跟踪文件109中。在一些实施例中,记录部件106a可以被集成到操作***107自身中、到管理程序中、或到某个其他运行时或虚拟化技术中。记录部件106a还可以存在于完全不同的计算机***处以记录该计算机***处的迹线。因此,记录部件106a可以跟踪计算机***处的代码的执行;那么起因于该跟踪的(一个或多个)跟踪文件109可以(例如,使用网络硬件105b)被传送到计算机***101以用于由重放部件106b重放。虽然(一个或多个)跟踪文件109被描绘为被存储在数据存储库104中,但是他们也可以专有或者暂时存储在***存储器103中或者在某个其他存储设备处。
图1还包括(一个或多个)处理器102的内部硬件部件的简化表示。如图所示,每个处理器102包括(一个或多个)处理单元102a。每个处理单元可以是物理的(即,物理处理器核)和/或逻辑的(即,由支持超线程的物理核心呈现的逻辑核,其中,超过一个应用线程在物理核处执行)。因此,例如,即使在一些实施例中处理器102仅包括单个物理处理单元(核),其也可以包括由该单个物理处理单元呈现的两个或更多个虚拟处理单元102a。
每个处理单元102a执行由应用(例如,调试器106、操作***107、应用代码部分108a等)定义的处理器指令,并且该指令选自预定义处理器ISA(指令集架构)。给定处理器102的特定ISA基于处理器制造商和处理器模型而变化。共同ISA包括来自INTEL公司的IA-64和IA-32、来自ADVANCED MICRO DEVICES公司的AMD64架构和来自ARM控股的PLC的各种高级精简指令集计算机(“ARM”)架构,但是大量的其他ISA存在并且可以由本发明使用。一般而言,“指令”是可由处理器执行的代码的最小外部可见(即,在处理器的外部)单元。
每个处理单元102a从处理器高速缓存102b获得处理器指令(其可以潜在地由处理单元102a共享),并且基于高速缓存102b中的数据、基于寄存器102c中的数据和/或在没有输入数据的情况下执行处理器指令。一般而言,高速缓存102b是存储***存储器102的部分的处理器上副本的少量的随机存取存储器(即,相对于典型数量的***存储器103是少的)。例如,当执行应用108的可执行代码部分108a时,高速缓存102b将运行时代码部分108b'的子集存储在高速缓存102b的代码高速缓存部分中,并且将其他运行时应用数据108'(例如,变量、数据结构等)存储在高速缓存102b的数据高速缓存部分中。如果(一个或多个)处理单元102a要求未已经存储在高速缓存102b中的数据,那么“高速缓存未命中”发生,并且该数据从***存储器103获取(潜在地从高速缓存102b驱逐某个其他数据)。
寄存器102c是基于(一个或多个)处理器102的ISA定义并且由处理器指令读取和/或写入的基于硬件的存储位置。例如,寄存器102c通常被用于存储从高速缓存102b获取的值用于由指令使用,以存储执行指令的结果,和/或存储状态或状态-诸如执行指令的副作用中的一些(例如,值的符号改变、值到达零、进位的发生等)、处理器循环计数等。因此,一些存储器102c可以包括被用于信号通知通过执行处理器指令引起的一些状态改变的“标志”。
重放部件106b通过执行(一个或多个)跟踪文件109在(一个或多个)处理器102处基于的可执行实体的代码来重放一个或多个跟踪文件109,同时在适当的时间处给该代码提供来自(一个或多个)跟踪文件109的跟踪数据(例如,寄存器值、存储器值等)。因此,例如,记录部件106a可以记录(一个或多个)处理器102处的应用108的一个或多个代码部分108a的执行,同时将跟踪数据(例如,由代码指令读取的存储器值、提供到代码指令的寄存器值等)存储在(一个或多个)跟踪文件109中。然后,重放部件106b可以重新执行(一个或多个)处理器102处的(一个或多个)代码部分108a,同时给该代码提供来自(一个或多个)跟踪文件109的跟踪数据,使得代码以其在跟踪时间处的相同方式执行。
图2图示了表示三个可执行实体201a-201c的执行的一部分的示例时序图200(例如,通过记录部件106a在记录/跟踪期间观察的),其中,执行在箭头的左端开始,并且向右进行。例如,可执行实体201a-201c可以对应于执行来自代码部分108a中的一个或多个的代码的应用108a的线程。在另一示例中,可执行实体201a-201c可以对应于操作***107的内核的线程。在图2中,可执行实体201a-201c并行执行(例如,并发地各自在不同物理或者虚拟处理单元102a处),但是本文中的实施例也可以在其中可执行实体201a-201c在单个处理单元处的执行“单个线程”共享时间的环境中操作。
在图2中,个体事件沿着每个箭头发生。一般而言,这些事件对应于从每个可执行实体执行的个体处理器指令。由于在现代处理器上这些事件可以容易地针对执行的仅几秒以亿万计算,但是其未明确地被描绘在图2中。然而,图2的确标识跨可以在调试期间特别感兴趣的实体发生的数个事件(即,事件202a-202t)。例如,其可以对应于与感兴趣存储器访问(例如,将是按顺序事件的基础并且结合圆形“顺序数字”描绘的指令,如稍后所讨论的)相关联的指令、与某些逻辑边界(例如,函数、模块、内核转换的调用或退出)相关联的指令、与异常相关联的指令、与高速缓冲冲刷相关联的指令、与输入/输出操作(例如,数据访问、网络访问等)相关联的指令、与运行时环境的活动(例如,垃圾回收活动)相关联的指令等。事件还可以与从(一个或多个)实体的重放获得的数据相关联,诸如经过时间(例如,“壁钟”时间)量、处理时间(使用的处理器周期)量、到达特定指令计数等。虽然事件202a-202t被描绘为已经发生,但是应注意到,记录部件106a可能不实际上将其中的每一个识别为感兴趣事件。
鉴于图2,图3图示了基于图2中所描绘的可执行实体201a-201c的执行可能不由记录部件106a生成的跟踪文件300的一个示例。在基于可执行实体201a-201c的并行执行的图3中,跟踪文件300独立地存储记录表示代码实体的执行的不同实例的数据的不同数据流。因此,在图3中,跟踪文件300包括三个跟踪数据流301a-301c(统称为跟踪数据流301),每个跟踪数据流记录可执行实体201a-201c之一的执行的跟踪。将理解到,取决于计算机***101处可用的处理单元102a的数目和/或由正跟踪的程序(例如,应用108)产生的可执行实体的数目,跟踪文件300可以包括任何数目的跟踪数据流301。还将理解到,跟踪数据流301可以被包括在单个文件跟踪文件中,或者可以各自被存储在不同相关文件中。
每个跟踪数据流301包括存储跟踪数据的多个数据分组,跟踪数据由重放部件106b可用于通过在适当的时间处向可执行实体的可执行代码提供适当的记录状态数据(例如,寄存器值、存储器地址和值等)来再现其对应的可执行实体的执行。因此,使用数据流301中的信息并且使用跟踪其执行的应用的实际可执行代码,该代码的执行的全部再现可以通过重放部件106b来再现。
在一些实施例中,每个数据分组可能潜在地表示多个代码指令的执行。例如,数据分组可以记录标识待执行的代码指令的信息和其输入。然后,重放部件106b可以重放指令序列,其中序列中的每个指令仅取决于在序列中其(一个或多个)先前指令到其的输出,和/或其他程序状态(例如,建立作为重放相同跟踪数据流301中的(一个或多个)先前数据分组的一部分的寄存器值、存储器值等)。
用于记录每个跟踪数据流301的数据分组中的状态数据的一种方式由发明人建立在以下认识上:处理器指令(包括虚拟机“虚拟处理器”指令)可以通常落在三种类别之一中:(1)如不产生可预测输出被标识为“非确定性的”指令,因为其输出未完全由通用寄存器102c或存储器中的数据确定,(2)其输入不取决于存储器值的确定性指令(例如,其仅取决于处理器寄存器值或代码自身中定义的值),以及(3)其输入取决于从存储器读取值的确定性指令。因此,在一些实施例中,存储足够的状态数据以再现指令的执行可以利用三个对应挑战的方案完成:(1)如何记录产生未完全由其输入确定的非确定性指令,(2)取决于寄存器如何再现用于指令的输入寄存器的值,和(3)取决于存储器读取如何读取用于指令的输入存储器的值。
作为第一挑战的方案,关于如何记录由于其输出未完全由通用寄存器或存储器中的数据确定而不产生完全可预测输出的实体的“非确定性”指令,实施例包括将这样的指令的执行的副作用存储在实体的跟踪数据流301中。如本文所使用的,“非确定性”指令在某种程度上包括不常见指令,其(i)每次其执行时产生非确定性输出(例如,INTEL处理器上的RDTSC,其写入自从最后处理器重置到寄存器中以来处理器周期的数目),其(ii)可以产生确定性输出,但是取决于未由记录部件106a(例如调试寄存器、计时器等)未跟踪的输入,和/或其(iii)产生处理器特定信息(例如,INTEL处理器上的CUPID,其将处理器特定数据写入寄存器中)。存储这样的指令的执行的副作用可以包括例如存储由指令的执行改变的寄存器值和/或存储器值。在一些架构中(诸如来自INTEL),诸如在虚拟机扩展(VMX)中找到的处理器特征的处理器特征可以被用于捕获用于将其副作用记录在跟踪文件300中的指令。
作为第二挑战的方案,关于再现用于实体的确定性指令的输入寄存器的值(例如,其输入仅取决于处理器寄存器值)是直接的,因为其是由实体造成的(一个或多个)先前指令的执行的输出。因此,记录跟踪数据流301中的处理器指令的整个序列的执行可以减少以在序列开始时再现寄存器值;跟踪文件300不需要存储序列中执行的特定指令或中间寄存器值的记录。这是因为实际指令在应用的代码部分108a自身中是可用的,并且其在重放时间是可用的。这些指令可以因此在重放期间提供记录输入(即,记录寄存器值的初始集),以与如其在跟踪期间执行的相同方式执行。
作为第三挑战的方案,关于再现其输入取决于存储器值的实体的确定性指令的输入存储器的值,实施例包括在实体的跟踪数据流301中记录实体中的指令消耗(例如,其读取)的存储器值-而不管指令读取的值如何被写入存储器。换句话说,一些实施例包括仅记录存储器读取,但非存储器写入。例如,虽然值可以通过当前线程、通过另一线程(包括内核,例如,作为处理中断的一部分)、或通过硬件设备(例如,输入/输出硬件105)写入存储器,但是其仅是对于执行读取的线程的指令的完全重放需要的线程的指令读取的值。这是因为其是指示线程如何执行的由线程读取的值(并且不必写入存储器的所有值)。
虽然在一些实施例中每个存储器值读取的值可以被存储在跟踪文件300中,但是其他实施例包括诸如试图在不必记录每个读取的情况下预测适当值的预测技术的优化。例如,在一些实现中,如果预测值是实际上从存储器读取的值,那么没有东西需要被记录在跟踪文件300中;然而,如果预测值不匹配实际上读取的值,那么值读取被记录在跟踪文件300中。虽然数个预测技术存在,但是两个简单预测技术包括预测由线程读取的下一存储器值将与由线程先前读取的值相同,或者总是预测下一存储器读取将具有零的值。
图3描绘了如由每个数据流中的水平线限制的数据分组。数据流301c中的四个数据示例分组302明确地被标记为数据分组302a-302d。如所描绘的,取决于跟踪文件实现和存储在每个分组中的特定数据,单独数据分组可以具有不同大小。将理解到,鉴于以上讨论,可以被包括在数据分组中的数据包括用于标识执行的代码指令(例如,自从最后记录代码指令以来执行的指令的计数、处理器指令计数器值等)、提供到该代码指令的(一个或多个)寄存器值、(一个或多个)存储器地址/(一个或多个)值读取、执行代码指令的任何副作用(例如,所得寄存器值)等。注意,虽然图2中的事件相对于“壁钟”时间为了清晰起见而示出,但是数据分组不必指示不同事件发生的相对“壁钟”时间。
跟踪文件300包括标准数据分组(其被描绘为从轻水平线开始)以及关键帧304(其被描绘为从重水平线开始)。关键帧是在不需要具有来自关键帧之前的分组的执行/重放状态的情况下存储足够的信息以从关键帧的点向前开始可执行实体的重放执行的一种类型的数据分组。例如,关键帧可以存储用于所有相关处理器寄存器的值、对于从该点向前再现存储器值需要的信息等。
跟踪文件300包括每个跟踪数据流301的开始时的关键帧(其使得重放部件106b能够开始每个跟踪数据流的重放),以及贯穿每个跟踪数据流301出现的附加关键帧。三个示例关键帧在图3中明确地被标记为关键帧304a(其在跟踪数据流301b的开始发生)、关键帧304b(其结合按顺序事件发生,其稍后讨论)和关键帧304c。一般而言,记录部件106a可以在数据流301中的任何点处记录关键帧。如所描绘的,其不需要跨数据流同时或者以任何特定频率发生。
如上文所提到的,关键帧使得重放部件106b能够在各种点处发起每个跟踪数据流301的重放。例如,参考数据流301a,重放部件106b可以使用关键帧在流中的不同部分处发起执行,包括在数据流的开始、在“顺序数字”4、5和9处(如所描绘的,其各自符合关键帧)并且在关键帧304c处。因此,关键帧定义不同的独立可重放跟踪区段(或段),其中,每个区段通过关键帧在两端上限制。
在一些实施例中,当使用跟踪文件300的示例格式时,记录部件106a在代码被跟踪的并行执行期间通常与其他数据流独立地记录每个数据流301。这样做时,记录部件106a通常不记录由一个实体造成的事件的实际定时执行与由另一实体造成的事件的执行的定时,因为由一个实体执行的代码指令通常不影响由另一实体执行的代码指令。因此,一个跟踪数据流301中的数据分组可以通常独立于另一跟踪数据流301中的数据分组来重放。
然而,跟踪文件300的确包括标识跨实体/数据流“按顺序”的事件的一些数据分组。这些按顺序事件通常对应于由可能影响另一实体的执行(诸如访问由实体共享的存储器)的一个可执行实体执行的事件。在图2和图3中,按顺序事件利用定义这些事件相对于彼此跨实体发生的相对次序的“顺序数字”表示。由于仅“按顺序事件”给定顺序数字,因而其仅提供跟踪中记录的所有事件的部分排序,如稍后所讨论的。在一些实施例中,顺序数字是单调增加数字(“MIN”)-即,单调增加并且保证不重复的数字。例如,跟踪文件300包括十二个顺序数字(被描绘为圆圈数字1-12),每个顺序数字定义不同按顺序事件相对于彼此在跨201a-201c执行的次序。
在一些实施例中,按顺序事件基于“跟踪存储器模型”来标识,“跟踪存储器模型”定义是否基于其跨可执行实体的相互作用将事件视为按顺序或不按顺序的。例如,按顺序和/或不按顺序事件可以基于线程如何通过共享存储器相互作用、其共享存储器中的数据的共享使用等来定义。取决于实现,由记录部件106a使用的跟踪存储器模型可以比由处理器102使用的存储器模型更弱或更强。使用的跟踪存储器模型可以是由编程语言被用于编译代码(例如,C++14)定义的存储器模型,或者出于跟踪的目的明确定义的某个其他存储器模型。
第一示例跟踪存储器模型可以仅将内核调用(来自用户模式)、捕获和异常视为按顺序的。该跟踪存储器模型将具有低开销,因为这些操作相对“昂贵”是其自身的权利,其无论如何可能跟踪并且提供排序的非常粗粒度的概述。第二示例跟踪存储器模型可以视为按顺序全栅栏(即,具有获得&释放语义的操作)。这样的操作的示例可以包括INTEL的“锁定”指令、内核调用、异常和捕获。该存储模型为当代码使用“互锁”类型的基元跨共同在诸如来自MICROSOFT公司的WINDOWS中操作的线程通信时在过程中发生的几乎所有跨线程通信提供足够的排序。第三示例跟踪存储器模型可以将所有获得和释放视为按顺序的。该存储器模型可以适于基于处理器的ARM指令集,因为ARM不将大多数负载和存储视为获得或释放。在其他架构(诸如来自INTEL(其中,大多数存储器访问是获得或释放))上,这将等于将几乎所有存储器访问排序。第四示例跟踪存储器模型可以将所有存储器负载视为按顺序的。这将提供强排序,但是可能导致与其他示例存储器模型相比较降低的性能。前述存储器模型已经仅被呈现为示例,并且本领域普通技术人员将认识到,鉴于本文中的公开内容,可以选择各种存储器模型。
鉴于跟踪文件300的前述讨论,将理解到,关键帧使得重放部件106b能够发起相同跟踪数据流的不同区段的重放,并且因此使得重放部件106b单独并且并行地重放相同跟踪数据流301的这些不同区段。此外,在跟踪数据流301独立记录的情况下,并且在一个跟踪数据流中的事件的定时通常独立于另一跟踪数据流中的事件的定时的情况下,重放部件106b可以独立并且并行重放来自不同跟踪数据流301的区段。
顺序数字然后使得重放部件106b能够将这些单独区段的并行重放的结果组合以呈现实体当其记录时实际上如何执行的准确表示。特别地,顺序数字(如上文所讨论的,其定义跨跟踪数据流的按顺序事件的相对次序和所有事件的部分排序)使得重放部件106b能够选择不同跟踪区段中间的排序以定义可以被用于在调试器106处呈现结果的跟踪文件300中的所有指令的总排序。这样的排序使得调试器106能够呈现跟踪中的所有点处的程序状态(例如,存储器和寄存器)的一致视图,并且无论重放部件106b如何实际上在执行中到达该点(例如,其执行单独跟踪区段的什么次序)。
由于顺序数字仅提供事件的部分排序,因而可能存在许多有效排序。一般而言,有效排序以将确保顺序数字以适当的次序(即,以其单调增加次序)呈现的次序放置跟踪区段。然而,有效排序不需要再现所有指令在跟踪时间处相对于彼此执行的确切次序。例如,参考图2,有效排序需要确保顺序数字3处的按顺序事件呈现已经在顺序数字4处的按顺序事件之前发生。然而,排序不需要确保由实体201c仅在顺序数字3之后执行的不按顺序事件在由实体201a仅在顺序数字4执行的不按顺序事件之前呈现,因为这些事件是不同实体处的不按顺序事件。
有效排序不需要包括来自所有跟踪数据流的区段(例如,因为一个线程的执行可能不与获得给定感兴趣点处的期望数据相关),并且可以选择多个有效排序。例如,假如顺序数字8处的事件的反向中断点被请求。仅使用跟踪数据流301a和301c到达该中断点的区段的一个有效排序可以包括:
1.跟踪301a上的区段在顺序数字1处的关键帧处开始,并且在仅在顺序数字4处的关键帧之前的指令处结束,然后
2.跟踪301c上的区段开始其开始关键帧,并且在顺序数字3处的关键帧处的指令处结束,然后
3.跟踪301a上的区段在顺序数字4处的关键帧处开始,并且在仅在顺序数字5处的关键帧之前的指令处结束,然后
4.跟踪301c上的区段仅在顺序数字3处的关键帧之后的指令处开始,并且在仅在顺序数字7处的关键帧之前的指令处结束,并且然后
5.跟踪301a上的区段在顺序数字5处的关键帧处开始,并且在仅在顺序数字处的关键帧之前的指令处结束。注意,该区段包括顺序数字5与9之间的顺序数字8。
如果这些区段被视为已经以指定的次序线性重放,那么直到(但是不包括)顺序数字9的跟踪301a上的所有指令被重放,直到(但是不包括)顺序数字7的跟踪301c上的所有指令重放,并且重放的每个按顺序事件被视为以正确次序(即,1、3、4、5和8)重放。
使用可以被选择以到达顺序事件8的所有跟踪数据流的另一有效排序可以包括:
1.跟踪301a上的区段在顺序数字1处的关键帧处开始,并且在仅在顺序数字4处的关键帧之前的指令处结束,然后
2.跟踪301b上的区段开始其开始关键帧,并且仅在顺序数字2处的关键帧之前的指令处结束,然后
3.跟踪301c上的区段开始其开始关键帧,并且仅在顺序数字3处的关键帧之前的指令处结束,然后
4.跟踪301b上的区段在顺序数字2处的关键帧处开始,并且在仅在顺序数字6处的关键帧之前的指令处结束,然后
5.跟踪301c上的区段在顺序数字3处的关键帧处的指令处开始,并且在仅在顺序数字7处的关键帧之前的指令处结束,然后
6.跟踪301a上的区段在顺序数字4处的关键帧处开始,并且在仅在顺序数字5处的关键帧之前的指令处结束,然后
7.跟踪301a上的区段在顺序数字5处的关键帧处开始,并且在仅在顺序数字处的关键帧之前的指令处结束。再次注意,该区段包括顺序数字5与9之间的顺序数字8。
类似地,如果这些区段被视为已经以指定的次序线性重放,直到(但是不包括)顺序数字9的跟踪301a上的所有指令重放,直到(但是不包括)顺序数字6的跟踪301b上的所有指令重放,并且直到(但是不包括)顺序数字7的跟踪301c上的所有指令重放,并且重放的每个按顺序事件被视为以正确次序(即,1、2、3、4、5和8)重放。
重放部件106b不需要实际上根据该确定的排序执行区段的重放。相反,重放部件106b可以以任何次序重放区段,只要由重放获得的结果根据确定的排序的约束呈现。因此,重放部件106b可以将跟踪区段排队用于以任何次序重放,并且可以在一个或多个处理单元102a处以任何次序将其重放,只要结果以有效排序呈现。
如在图1中所示,调试器106可以包括试验性执行处理程序106c。一般而言,试验性执行处理程序106c使得调试器106能够暂停实体的执行(例如,(一个或多个)代码部分108a的实时执行、基于(一个或多个)跟踪文件109的(一个或多个)代码部分108a的重放等)、替换用于一个或多个运行时数据元素(例如,变量、寄存器等)的(一个或多个)用户提供值、以及使用(一个或多个)代替值从暂停点恢复实体的执行。在该试验性执行期间,试验性执行处理程序106c隔离可能不利地影响调试器的稍后在没有结果的情况下利用(一个或多个)原始值从暂停点恢复的能力的环境改变(例如,存储器值、文件数据等的改变)。这样做时,试验性执行处理程序106c使得用户能够使用调试器106参与“假如…怎么样”假设以看执行可能如何基于程序状态的改变部分偏离,同时使得原始执行能够继续不由假设影响。
在以下描述中,试验性执行主要在跟踪实体的重放的上下文中描述-即,其中实体的重放由调试器暂停,使得可以进行实体的试验性重放。然而,将理解到,在此所描述的原理适用于除时间旅行调试之外的其他场景,诸如执行初始地实时执行的实体的试验性重放(即,实时调试会话而不是时间旅行调试会话)、执行其状态从过程转储得到的实体的试验性重放等。
为了促进试验性重放的进一步的理解,图4图示了试验性执行处理程序400(诸如图1的试验性执行处理程序106c)的示例的附加细节。图5图示了基于跟踪文件的实体的试验性重放的示例时间线500。如图4中所描绘的,试验性执行处理程序400包括多个子部件,诸如环境隔离部件401、值替换部件402、故障检测部件403、跟踪记录部件404和/或外部实体处理程序405。子部件401-405的所描绘的标识和布置仅是一个示例作为描述中的助手,并且本领域普通技术人员将认识到,试验性执行处理程序400的子部件的特定标识和数字可以基于实现很大地变化。
一般而言,试验性执行处理程序400通过跟踪文件109的基于代码实体(例如,代码部分108a)的跟踪数据的重放部件106b结合重放而操作。因此,例如,图5描绘了示出基于跟踪数据流502(例如,跟踪文件109)的代码实体(例如,代码部分108a)的重放。参考图2和3,时间线501可以表示可执行实体201(例如,可执行实体201a)之一的重放,并且跟踪数据流502可以对应于对应的跟踪数据流301(例如,跟踪数据流301a)。在图5中,从跟踪数据流502延伸到重放时间线501的箭头503指示来自跟踪数据流502的跟踪数据被用于控制实体的重放。例如,跟踪数据流502可以被用于向代码实体的处理器指令提供输入、为存储器读取提供值等。将理解到,在此所描述的原理可以适用于各种跟踪文件格式。
在重放期间,重放部件106b可以暂停代码执行。这可以归因于由用户造成的手动介入或者软件组件、归因于命中定义中断点或观察点等。因此,例如,在图5中重放时间线501在特定时间点504处暂停。在这时,调试器106可以将程序状态(例如,变量、寄存器102c等的值)的一个或多个部分呈现为其在代码重放暂态时存在。从这里,可以恢复重放,如由继续的重放时间线501'所描绘的,其继续依赖于如由箭头503'指示的跟踪数据流502。
然而,当调试器106包括试验性执行处理程序400时,调试器106可以呈现使得(一个或多个)替换值能够为程序状态的一个或多个部分提供的一个或多个接口。例如,用户接口可以使得用户能够为代码变量、处理器寄存器102c等提供(一个或多个)替换值,和/或软件接口可以使得软件组件能够为代码变量、处理器寄存器102c等提供(一个或多个)替换值。
因此,不是照常继续重放(即,继续的重放时间线501'),试验性执行处理程序400可以利用重放部件106b基于重放暂停期间接收到的(一个或多个)替换值来执行试验性重放。因此,例如,图4描绘了试验性执行处理程序400包括环境隔离部件401和值替换部件402。使用环境隔离部件401,试验性执行处理程序400通过代码实体的重放部件106b恢复重放,但是在防止由在该恢复重放期间由代码实体做出的任何环境改变影响原始重放时间线501的隔离环境内这样做。在恢复重放之前,值替换部件402利用(一个或多个)替换值修改暂停时的程序状态—诸如替换变量、处理器寄存器102c等的值。
在图5中使用试验性重放时间线505描绘该试验性重放。试验性重放时间线505是来自重放时间线501的继续,并且其利用来自跟踪数据流502的跟踪数据,如由箭头508指示。然而,它被描绘为与重放时间线501分离的时间线。这是因为环境隔离部件401确保在试验性重放时间线505期间做出的环境改变不影响重放时间线501(即,继续的重放时间线501')的后续继续正常重放。
例如,当正重放的实体在试验性重放时间线505期间向存储器的特定地址做出写入时,环境隔离部件401可以模拟写入而不是向请求的地址执行写入。这可以例如通过环境隔离部件401将写入重定向到没有已经结合重放时间线501由实体利用的某个其他存储器地址并且然后将在试验性重放时间线505期间来自请求的地址的后续读取重定向到该其他存储器地址而完成。通过另一示例,环境隔离部件401可以实际上在试验性重放时间线505期间执行对请求的地址的写入,但是保存重写为写入的一部分的任何数据的副本,因此数据可以稍后当沿着重放时间线501恢复正常重放时被恢复。因此,在试验性重放时间线505期间,呈现了与重放时间线501相同存储器空间的可执行实体,但是该存储器的任何改变被跟踪或者隔离,因此重放时间线501可以在没有由试验性重放时间线505造成的任何存储器操作的结果的情况下继续。
如所描绘的,试验性执行处理程序400可以包括可以在试验性重放期间利用的附加部件(例如,故障检测部件403、跟踪记录部件404、外部实体处理器程序405)。故障检测部件403标识试验性重放时间线505可以不进一步继续的条件。例如,如所提到的,在试验性重放时间线505期间实体的执行仍然利用来自跟踪数据流502的跟踪数据(如由箭头508所指示的)。如果用来发起试验性重放时间线505的(一个或多个)替换值使得实体的执行与其将如何在继续的重放时间线501'期间执行偏离,那么实体可以请求在跟踪数据流502中不可用的数据。例如,其可以请求来自未记录在跟踪数据流502中的存储器位置的读取,其可以执行其输入未记录在跟踪数据流502中的指令等。因此,在这些情况下,故障检测部件403可以停止试验性重放,并且通知用户或某个其他软件组件。备选地,故障检测部件403可以提示用户提供用于丢失数据的值,或者从某个其他软件组件请求用于丢失数据的值。一个示例软件组件可以是通过提供无效、意外或者随机数据作为输入而自动化软件测试的“模糊”工具。
跟踪记录部件404可以使得试验性重放时间线505期间实体的执行记录到分离的跟踪数据流506,如由箭头507所指示的(例如,使用记录部件106a)。这使得调试器106能够执行关于实体如何在试验性重放期间执行的附加重放/分析。此外,分离的跟踪数据流506中的数据可以是与原始跟踪数据流502中的数据相比较的基础,以便或以标识试验性重放时间线505与继续重放时间线501'期间执行之间的差异。
外部实体处理程序405处理在试验性重放时间线505期间重放的实体试图与某个外部实体(诸如文件)相互作用的情况。应注意到,由于重放在与当跟踪数据流502被记录时不同的时间处并且潜在地在完全不同的计算机***处发生,因而外部实体可能不可用或者可以在与其在记录期间存在的不同状态中。因此,如果可执行实体试图访问在记录期间未访问的试验性重放时间线505期间的来自外部实体的数据,则该数据可能是不可用的。此外,如果可执行实体试图在试验性重放时间线505期间写入到这些外部实体,则这可以改变能够在没有已经执行试验性重放的任何结果的情况下恢复正常重放(即,继续的重放时间线501')需要的环境状态。
在文件访问的情况下,用于外部实体处理程序405处理的一些考虑是在尚未记录在跟踪数据流502中的读取的情况下做什么并且在写入的情况下做什么。这可以包括模拟读取和/或写入,使得其看起来是待执行的实体,但是实际上不影响文件。在读取的情况下,外部实体处理程序405可以提示用户提供执行读取的文件,提示用户数据提供为数据读取,或者通知故障检测部件403防止试验性重放继续的故障。在写入的情况下,外部实体处理程序405可以执行类似于执行为存储器写入的一部分的模拟。例如,其可以承兑写入,但是将数据存储在除实际外部实体之外的某个位置中。当然,外部实体处理程序405可能拒绝承兑写入,并且通知故障检测部件403。
其他类型的外部实体可以包括网络连接/套接字、过程间通信套接字等。在这些情况下,故障检测部件403可以模拟写入到实体。在读取的情况下,故障检测部件403可以提示用户输入,或者通知故障检测部件403继续的无能力。
在试验性重放期间的任何时候,调试器106使得用户能够查看并且与程序状态交互以观察给定(一个或多个)替换值实体将如何已经执行。使用在试验性重放期间创建的分离的跟踪数据流506,调试器106可以甚至执行该试验性重放的时间旅行分析,包括设置反向中断点/观察点等。
在试验性重放的结束时(例如,由于用户介入或者由于某个故障),重放部件106b可以在时间504处恢复原始重放时间线501,如由继续重放时间线501'所指示的。由于环境隔离部件401和外部实体处理程序405的操作,因而已经对存储器做出的任何环境改变未在原始重放时间线501期间最初使用(并且因此将不影响继续的重放时间线501'),或者可以回滚。如此,继续的重放时间线501'可以进行,好像试验性重放尚未发生。
由于使能高度平行和分布式重放的在此所描述的跟踪文件的性质(例如,结合图2和3),如果它们被使用,则各种重放时间线501、501'和505不需要在相同计算***处发生。此外,甚至可以在不同计算机***处处理相同重放时间线的不同段。然而,如果使用跟踪文件格式,则这样的并行化/分布式重放可能不是实际的。
图6图示了用于试验性执行实体的方法600的示例。方法600主要结合图1-5描述。虽然方法600被呈现为一系列动作,但是将理解到,示出的动作的特定数目和排序仅是与本文中的实施例一致的试验性重放的示例。
如所描绘的,方法600包括执行实体的第一执行的动作601。例如,调试器106可以执行实体,诸如应用108。在重放来自跟踪文件的实体的一些实施例中,动作601包括第一执行,其包括基于利用一个或多个第一跟踪数据流向实体提供输入的实体的重放执行,一个或多个第一跟踪数据流在实体的先前执行期间被记录。例如,重放部件106b可以基于跟踪数据流来重放实体的执行。如在图5中所描绘的,例如,重放部件106b可以基于跟踪数据流502重放可执行实体以创建重放时间线501。例如,跟踪数据流502可以记录可执行实体(例如,201a)的先前执行,并且因此可以对应于图3的跟踪数据流301a。
方法600还包括暂停实体的第一执行并且接收用于运行时数据元素的替换值的动作602。在一些实施例中,动作602包括:在实体的第一执行的某个点处,暂停实体的第一执行;标识由实体使用的运行时数据元素,运行时数据元素具有基于重放执行的第一值;并且接收指定用于运行时数据元素的第二不同值。例如,调试器106可以暂停实体的执行并且接收用于运行时数据元素的替换值。返回重放示例,在时间点504处,重放时间线501的重放可以通过重放部件106b暂停(因此暂停重放时间线501)。暂停可以是命中中断点或观察点、用户手动暂停重放等的结果。在这时,调试器106可以呈现运行时程序状态的部分,诸如各种变量、寄存器等的值。然后,调试器106可以接收用于运行时状态的这些部分中的一个或多个的(一个或多个)替换值。
方法600还包括基于替换值执行实体的第二试验性执行同时使得第一执行能够在暂停点处恢复的动作603。例如,调试器106可以执行实体的试验性执行,同时将其环境改变与原始执行隔离。在一些实施例中,动作603包括:基于输入,在第一执行中的点处开始执行实体的第二执行,同时使得第一执行稍后恢复,而不由第二执行影响,包括将运行时数据元素设定为第二值,并且模拟在第二执行期间由实体执行的一个或多个存储器写入。在利用重放的实施例中,动作603还可以包括利用一个或多个第一跟踪数据流向实体提供输入。例如,试验性执行处理程序400可以恢复可执行实体的执行(例如,重放部件106b可以使用示出为试验性重放时间线505的跟踪数据流502恢复可执行实体的重放)。然而,在发起该执行之前,试验性执行处理程序400的值替换部件402可以用动作602中接收到的(一个或多个)值替换运行时状态的一个或多个部分。此外,试验性执行处理程序400的环境隔离部件401可以将试验性执行时间线505期间做出的任何环境改变与重放时间线501隔离。因此,尽管试验性重放时间线505的执行,重放时间线505可以稍后在没有任何结果的情况下继续(即,作为继续的重放时间线501)。
在一些实施例中,环境隔离部件401呈现具有在第一执行期间由实体使用的相同存储器空间的实体的第二执行,但是模拟在第二执行期间由实体执行的存储器读取/写入以将其保持隔离。例如,这可以包括将用于读取/写入的目标存储器地址重定向到未由实体的第一执行使用的存储器地址,和/或将现有值保存在目的地存储器地址处,并且当恢复实体的第一执行期间复原现有值。
方法600还可以包括记录第二执行的跟踪的动作604。在一些实施例中,动作604包括将实体的第二执行记录到一个或多个第二跟踪数据流中。例如,虽然重放部件106b重放可执行实体作为重放时间线501的一部分,但是试验性执行处理程序400的跟踪记录部件404可以使得记录部件106a将该执行记录到跟踪数据流506。跟踪数据流506然后可以是稍后时间旅行调试和/或与跟踪数据流502的比较的基础。
因此,本文中的实施例提供用于试验性执行跟踪代码的调试器能力,其使得调试器能够在基于包含在跟踪文件中的数据来重放可执行实体的执行时提供答案“假如…怎么样”问题。
虽然已经以特定于结构特征和/或方法动作的语言描述主题,但是将理解到,所附的权利要求中定义的主题不必限于上文所描述的特征或动作,或者上文所描述的动作的顺序。相反,所描述的特征和行为被公开为实现权利要求的示例形式。
在不脱离其精神或基本特点的情况下,可以以其他特定形式实现本发明。所描述的实施例将在所有方面中仅被认为是说明性而非限制性的。因此,本发明的范围由所附的权利要求书指示,而不是由前述描述指示。落在权利要求的等效物的意义和范围内的所有改变将被包含在其范围内。
Claims (15)
1.一种计算机***,包括:
一个或多个处理器;以及
一个或多个计算机可读介质,所述一个或多个计算机可读介质具有存储在其上的计算机可执行指令,所述计算机可执行指令由所述一个或多个处理器可执行以将所述计算机***配置为试验性执行实体,所述计算机可执行指令包括可执行以将所述计算机***配置为至少执行以下各项的指令:
执行实体的第一执行;
在所述实体的所述第一执行中的点处:
暂停所述实体的所述第一执行;
标识由所述实体使用的运行时数据元素,所述运行时数据元素具有基于所述重放执行的第一值;以及
接收指定用于所述运行时数据元素的第二不同值的输入;以及
基于所述输入,在所述第一执行中的所述点处开始执行所述实体的第二执行,同时使得所述第一执行能够不由所述第二执行影响而稍后恢复,包括:
将所述运行时数据元素设定为所述第二值;以及
模拟在所述第二执行期间由所述实体执行的一个或多个存储器写入。
2.根据权利要求1所述的计算机***,其中执行所述实体的所述第一执行包括:基于利用一个或多个第一跟踪数据流向所述实体提供输入,来执行所述实体的重放执行,所述一个或多个第一跟踪数据流在所述实体的先前执行期间被记录。
3.根据权利要求2所述的计算机***,其中执行所述实体的所述第二执行还包括:将所述实体的所述第二执行记录到一个或多个第二跟踪数据流中。
4.根据权利要求2所述的计算机***,其中执行所述实体的所述第二执行还包括:利用所述一个或多个第一跟踪数据流向所述实体提供输入。
5.根据权利要求1所述的计算机***,其中执行所述实体的所述第二执行包括:在所述第二执行期间,向所述实体呈现在所述第一执行期间由所述实体使用的存储器空间。
6.根据权利要求5所述的计算机***,其中模拟在所述第二执行期间由所述实体执行的一个或多个存储器写入包括以下一项或多项:
将目标存储器地址重定向到未由所述实体的所述第一执行使用的存储器地址;或者
将现有值保存在目的地存储器地址处,并且在恢复所述实体的所述第一执行时恢复所述现有值。
7.根据权利要求2所述的计算机***,其中执行所述实体的所述第二执行还包括:
检测所述实体对未被记录在所述一个或多个第一跟踪数据流中的数据的访问;以及
停止所述实体的所述第二执行。
8.根据权利要求2所述的计算机***,其中执行所述实体的所述第二执行还包括:
检测所述实体对未被记录在所述一个或多个第一跟踪数据流中的数据的访问;以及
针对用于所述数据的输入,提示用户。
9.根据权利要求1所述的计算机***,其中执行所述实体的所述第二执行还包括:
模拟在所述第二执行期间由所述实体执行的一个或多个文件操作。
10.根据权利要求9所述的计算机***,其中模拟所述一个或多个文件操作包括以下至少一项:
将写操作重定向到与目的地文件分离的位置;或者
执行从与所述目的地文件分离的所述位置的读操作。
11.根据权利要求1所述的计算机***,其中执行所述实体的所述第二执行还包括:
模拟在所述第二执行期间由所述实体执行的一个或多个存储器读取,包括将目标存储器地址重定向到未由所述实体的所述第一执行使用的存储器地址。
12.根据权利要求1所述的计算机***,其中执行所述实体的所述第一执行包括以下一项:
基于一个或多个跟踪数据流的所述实体的重放执行;
所述实体的实时执行;或者
基于过程转储的所述实体的执行。
13.一种在包括一个或多个处理器的计算机***处实现的用于试验性执行跟踪实体的方法,所述方法包括:
执行实体的第一执行,所述第一执行包括基于利用一个或多个第一跟踪数据流向所述实体提供输入的所述实体的重放执行,所述一个或多个第一跟踪数据流在所述实体的先前执行期间被记录;
在所述实体的所述第一执行中的点处:
暂停所述实体的所述第一执行;
标识由所述实体使用的运行时数据元素,所述运行时数据元素具有基于所述重放执行的第一值;以及
接收指定用于所述运行时数据元素的第二不同值的输入;以及
基于所述输入,在所述第一执行中的所述点处开始执行所述实体的第二执行,同时使得所述第一执行能够不由所述第二执行影响而稍后恢复,包括:
将所述运行时数据元素设定为所述第二值;
利用所述一个或多个第一跟踪数据流向所述实体提供输入;以及
模拟在所述第二执行期间由所述实体执行的一个或多个存储器写入。
14.根据权利要求13所述的方法,其中模拟在所述第二执行期间由所述实体执行的一个或多个存储器写入包括以下一项或多项:
将目标存储器地址重定向到未由所述实体的所述第一执行使用的存储器地址;或者
将现有值保存在目的地存储器地址处,并且在恢复所述实体的所述第一执行时复原所述现有值。
15.一种计算机程序产品,其包括一个或多个计算机可读介质,所述一个或多个计算机可读介质具有在其上存储的计算机可执行指令,所述计算机可执行指令由一个或多个处理器可执行以将所述计算机***配置为试验性执行跟踪实体,所述计算机可执行指令包括可执行以将所述计算机***配置为至少执行以下各项的指令:
执行实体的第一执行,所述第一执行包括基于利用一个或多个第一跟踪数据流向所述实体提供输入的所述实体的重放执行,所述一个或多个第一跟踪数据流在所述实体的先前执行期间被记录;
在所述实体的所述第一执行中的点处:
暂停所述实体的所述第一执行;
标识由所述实体使用的运行时数据元素,所述运行时数据元素具有基于所述重放执行的第一值;以及
接收指定用于所述运行时数据元素的第二不同值的输入;以及
基于所述输入,在所述第一执行中的所述点处开始执行所述实体的第二执行,同时使得所述第一执行能够不由所述第二执行影响而稍后恢复,包括:
将所述运行时数据元素设定为所述第二值;
利用所述一个或多个第一跟踪数据流向所述实体提供输入;以及
模拟在所述第二执行期间由所述实体执行的一个或多个存储器写入。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311460286.7A CN117389900A (zh) | 2017-08-03 | 2018-06-01 | 调试器中的代码的试验性执行 |
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US15/667,752 | 2017-08-03 | ||
US15/667,752 US10565087B2 (en) | 2017-08-03 | 2017-08-03 | Tentative execution of code in a debugger |
PCT/US2018/035517 WO2019027558A1 (en) | 2017-08-03 | 2018-06-01 | PROVISIONAL CODE EXECUTION IN A DEBUGGING |
Related Child Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311460286.7A Division CN117389900A (zh) | 2017-08-03 | 2018-06-01 | 调试器中的代码的试验性执行 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110998541A true CN110998541A (zh) | 2020-04-10 |
CN110998541B CN110998541B (zh) | 2023-11-17 |
Family
ID=62685204
Family Applications (2)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201880050455.0A Active CN110998541B (zh) | 2017-08-03 | 2018-06-01 | 调试器中的代码的试验性执行 |
CN202311460286.7A Pending CN117389900A (zh) | 2017-08-03 | 2018-06-01 | 调试器中的代码的试验性执行 |
Family Applications After (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311460286.7A Pending CN117389900A (zh) | 2017-08-03 | 2018-06-01 | 调试器中的代码的试验性执行 |
Country Status (4)
Country | Link |
---|---|
US (2) | US10565087B2 (zh) |
EP (1) | EP3662372B1 (zh) |
CN (2) | CN110998541B (zh) |
WO (1) | WO2019027558A1 (zh) |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10783055B2 (en) * | 2018-01-08 | 2020-09-22 | Ozcode Ltd. | Time travel source code debugger incorporating live coding ability |
US10747645B2 (en) * | 2018-04-27 | 2020-08-18 | Microsoft Technology Licensing, Llc | Selectively tracing portions of computer process execution |
JP6961553B2 (ja) * | 2018-08-30 | 2021-11-05 | 株式会社東芝 | 情報処理装置、システム及び方法 |
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 |
US11138093B2 (en) * | 2019-04-30 | 2021-10-05 | Microsoft Technology Licensing, Llc | Identifying data inconsistencies and data contention based on historic 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 |
JP2022150518A (ja) * | 2021-03-26 | 2022-10-07 | 富士通株式会社 | テスト処理プログラム、テスト処理方法および情報処理装置 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1804853A (zh) * | 2004-09-01 | 2006-07-19 | 微软公司 | 体系结构、编程模型和api |
CN102216941A (zh) * | 2008-08-19 | 2011-10-12 | 数字标记公司 | 用于内容处理的方法和*** |
US20120096371A1 (en) * | 2010-08-02 | 2012-04-19 | Be In, Inc. | System and method for online interactive recording studio |
CN102929780A (zh) * | 2012-11-06 | 2013-02-13 | 无锡江南计算技术研究所 | 基于应用逻辑序的并行程序调试方法和装置 |
CN104956333A (zh) * | 2013-01-31 | 2015-09-30 | 弗兰霍菲尔运输应用研究公司 | 处理无序事件的设备、方法和计算机程序 |
Family Cites Families (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7673296B2 (en) | 2004-07-28 | 2010-03-02 | Hewlett-Packard Development Company, L.P. | Method and system for optional code scheduling |
US20060206873A1 (en) | 2005-03-11 | 2006-09-14 | Argade Pramod V | Environment for run control of computer programs |
US20060288332A1 (en) | 2005-06-21 | 2006-12-21 | Microsoft Corporation | Workflow debugger |
US8079019B2 (en) * | 2007-11-21 | 2011-12-13 | Replay Solutions, Inc. | Advancing and rewinding a replayed program execution |
US7958497B1 (en) | 2006-06-07 | 2011-06-07 | Replay Solutions, Inc. | State synchronization in recording and replaying computer programs |
US7849446B2 (en) | 2006-06-09 | 2010-12-07 | Oracle America, Inc. | Replay debugging |
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 |
US8560991B1 (en) | 2010-10-05 | 2013-10-15 | Cadence Design Systems, Inc. | Automatic debugging using automatic input data mutation |
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 |
US20150301806A1 (en) | 2014-04-16 | 2015-10-22 | The Mathworks, Inc. | Tentative program code in an editor |
GB201508034D0 (en) | 2015-05-12 | 2015-06-24 | Undo Ltd | Debugging systems |
EP3244306B1 (en) * | 2016-04-29 | 2020-10-28 | Fujitsu Limited | A computer-implemented method for allowing modification of a region of original code |
-
2017
- 2017-08-03 US US15/667,752 patent/US10565087B2/en active Active
-
2018
- 2018-06-01 CN CN201880050455.0A patent/CN110998541B/zh active Active
- 2018-06-01 CN CN202311460286.7A patent/CN117389900A/zh active Pending
- 2018-06-01 EP EP18733097.2A patent/EP3662372B1/en active Active
- 2018-06-01 WO PCT/US2018/035517 patent/WO2019027558A1/en unknown
-
2020
- 2020-01-31 US US16/778,953 patent/US11055197B2/en active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1804853A (zh) * | 2004-09-01 | 2006-07-19 | 微软公司 | 体系结构、编程模型和api |
CN102216941A (zh) * | 2008-08-19 | 2011-10-12 | 数字标记公司 | 用于内容处理的方法和*** |
US20120096371A1 (en) * | 2010-08-02 | 2012-04-19 | Be In, Inc. | System and method for online interactive recording studio |
CN102929780A (zh) * | 2012-11-06 | 2013-02-13 | 无锡江南计算技术研究所 | 基于应用逻辑序的并行程序调试方法和装置 |
CN104956333A (zh) * | 2013-01-31 | 2015-09-30 | 弗兰霍菲尔运输应用研究公司 | 处理无序事件的设备、方法和计算机程序 |
Also Published As
Publication number | Publication date |
---|---|
US20200167261A1 (en) | 2020-05-28 |
WO2019027558A1 (en) | 2019-02-07 |
EP3662372B1 (en) | 2022-08-10 |
CN117389900A (zh) | 2024-01-12 |
US10565087B2 (en) | 2020-02-18 |
CN110998541B (zh) | 2023-11-17 |
US20190042396A1 (en) | 2019-02-07 |
US11055197B2 (en) | 2021-07-06 |
EP3662372A1 (en) | 2020-06-10 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110998541B (zh) | 调试器中的代码的试验性执行 | |
US10235273B2 (en) | Indexing a trace by insertion of key frames for replay responsiveness | |
US9959194B1 (en) | Indexing a trace by insertion of memory snapshots for replay responsiveness | |
US10296442B2 (en) | Distributed time-travel trace recording and replay | |
EP3577564B1 (en) | Efficient retrieval of memory values during trace replay | |
CN110168507B (zh) | 可执行代码的推测重放 | |
CN110892384B (zh) | 对处理器未定义行为依赖的重放时间行程跟踪 | |
CN110062927B (zh) | 用于可执行代码的并行重放的方法、***和存储设备 | |
AU2018309575B2 (en) | Focused execution of traced code in a debugger | |
CN113678110A (zh) | 时间旅行调试追踪中的存储器值暴露 |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |