CN112074817A - 具有跨级别跟踪映射的执行控制 - Google Patents

具有跨级别跟踪映射的执行控制 Download PDF

Info

Publication number
CN112074817A
CN112074817A CN201980029543.7A CN201980029543A CN112074817A CN 112074817 A CN112074817 A CN 112074817A CN 201980029543 A CN201980029543 A CN 201980029543A CN 112074817 A CN112074817 A CN 112074817A
Authority
CN
China
Prior art keywords
trace
execution
replay
code
runtime
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
Application number
CN201980029543.7A
Other languages
English (en)
Inventor
P·尼尔森
J·戴维斯
D·迈尔斯
T·莱
D·陈
J·莫拉
N·福尔克
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Microsoft Technology Licensing LLC
Original Assignee
Microsoft Technology Licensing LLC
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Microsoft Technology Licensing LLC filed Critical Microsoft Technology Licensing LLC
Publication of CN112074817A publication Critical patent/CN112074817A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3636Software debugging by tracing the execution of the program
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3624Software debugging by performing operations on the source code, e.g. via a compiler
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3664Environments for testing or debugging software

Abstract

所描述的技术有助于在所跟踪的程序行为的重放期间执行控制。跨级别映射将跟踪中的源代码、中间表示和本机指令相关联。跟踪包括由运行时管理的程序执行的本机代码指令的记录。跟踪不包括运行时的任何执行实例。设置断点以使跟踪位置与源代码表达式或语句对准,并且略过垃圾收集和开发者不太可能感兴趣的其他代码。实时调试环境被适配于支持基于跟踪的反向执行。调试器或其他工具中的执行控制器可以利用断点范围、跨级别映射、向后步进退出支持和其他项来控制跟踪的重放执行。可以将熟悉的编译器或熟悉的运行时的方面重新用于创新的执行控制,该创新的执行控制重放先前生成的本机代码,这与它们生成本机代码的既定目的相反。

Description

具有跨级别跟踪映射的执行控制
背景技术
计算机软件通常很复杂。部分复杂性可能来自于程序被设计为执行的工作的性质,例如,在数小时或更长时间内追踪大量真实世界项或正在进行的事务,与其他复杂软件协调活动,控制复杂硬件,等等。在软件的几乎任何真实世界使用中,复杂性也会出现,因为很多细节被引入并且应当被正确管理以指示计算机硬件如何执行真实世界工作,该真实世界工作在最初用英语或另一种自然语言来描述时精度要小得多。也就是说,从高级别描述到由计算机系统可执行的低级别实现的转换不可避免地引入了复杂性。甚至比自然语言更精确的编程语言源代码仍处于相对高级别,并且因此是模糊的,对各种理解和实现是开放的。源代码被转换为由计算性硬件直接可执行的低级别指令,很多细节被引入,并且在转换期间做出了选择。
复杂性引入通常经常意识到的编程错误(又称为“缺陷”,bug)的可能性。标识缺陷的原因并且尝试修改程序以补救或移除缺陷的影响的过程被称为“调试”。协助调试的专用软件工具称为“调试器”。被调试的程序称为“调试对象”。
当开发者可以随意缓慢地或全速运行调试对象,或者随意暂停调试对象的执行,并且可以在调试对象的执行的任何时候检查调试对象的所有状态信息时,调试可能是最容易的。这被称为“实时过程调试”。然而,对调试对象的这样的完全访问权通常是不可用的。例如,调试对象可以是生产软件,在不违反服务协议或损害利益方的声誉、安全性或财务状况的情况下,不能够对该生产软件进行实时调试。如果在开发者检查变量值、检查利用哪些参数值调用了哪些函数、查看源代码、考虑缺陷的可能解释、以及设计可能有助于标识、补救或消除缺陷的测试时一次将实时过程调试对象暂停几秒钟,则可能会造成不能够接受的危害。
因此,有时状态信息在调试对象执行时被记录,以便稍后被检查而基本上不暂停调试对象的执行。创建这样的记录可能会减慢调试对象的速度,但是该记录可以提供有用的信息,而不会像实时调试那样损害生产性能目标。例如,调试对象可以被暂停足够长的时间以创建存储器转储,该存储器转储在特定时间点将与调试器相关的一些或所有存储器值复制到磁盘上。调试对象的执行的一些方面也可以记录在执行跟踪中。在调试对象不是实时过程的情况下,一些调试器支持使用这种跟踪来重放所跟踪的调试对象的执行。利用一些调试器,可以正向或反向重放调试对象执行,从而准许“时间旅行”(time travel)、“反向”或“历史性”调试。
然而,由于执行跟踪包含的信息可以少于实时过程调试期间有时可用的信息,并且由于执行跟踪在低级别记录状态信息,因此当调试器或其他软件工具尝试控制重放执行(即,基于所记录的跟踪的执行)时会出现技术挑战。依赖于实现,开发者熟悉的并且经常在实时调试期间使用的执行控制操作当在基于跟踪的重放期间尝试时可能不太准确,或者可能根本不可用。
因此,通过调试器或其他重放或日志记录工具,使用低级别执行跟踪来有效且准确地实现高级别执行控制的进步可以帮助改善开发者或自动化性能监测工具可用的信息。因此,这样的进步将倾向于通过支持对计算机系统行为的准确理解并且通过支持减轻或消除计算机系统缺陷来改善计算机系统的功能。
发明内容
本文中描述的一些技术涉及在程序的源代码中的位置与程序的执行的跟踪中的对应位置之间进行映射的技术活动,从而提高了在基于跟踪的调试中的执行控制的准确性。一些教导涉及特定断点设置过程(procedure),该过程在与源代码表达式或语句对准的位置处设置一个或多个断点。用于适配实时调试环境以支持基于跟踪的反向执行的技术机制被描述。响应于基于执行跟踪向前或反向或向前和反向重放调试对象执行的挑战,特定的技术工具和技术在此被描述。与本文中的教导有关的其他技术活动对于本领域技术人员也将变得很清楚。
本文所述的一些实施例使用或提供跟踪重放执行控制能力,其使用处理器、存储器、在使用运行时的程序的执行期间所记录的跟踪、程序源代码、源代码和其中间表示和跟踪之间的映射、以及调试器或其他工具中的执行控制器。运行时包含支持代码,代码随所跟踪的程序被执行以及跟踪被捕获而提供动态编译或存储器垃圾收集服务。跟踪可以包括由程序执行的本机代码指令的记录。跟踪可以包括在调试对象正在被执行的同时在程序的执行期间所访问的数据的记录。跟踪可以包括一个或多个存储器转储或快照。跟踪可以被存储在非易失性或易失性存储器的一个或多个文件或部分中。执行控制器被配置为响应于来自工具的请求而控制跟踪的重放执行。在重放期间,使用被设置为帮助将所分组的本机指令与其对应的相应源代码项进行对准的断点,源代码与跟踪本机代码指令或其他跟踪条目通过源中间映射和中间本机映射得以相关联。
本文所述的一些实施例使用或执行计算机实现的跟踪重放执行控制。所跟踪的被管理程序被标识。被管理程序(也称为“运行时管理”程序)是一种被配置为结合对运行时的调用而执行的程序。所跟踪的被管理程序是一个被跟踪或被配置为要被跟踪的程序。在软件工具中接收跟踪重放执行控制请求。基于跟踪重放执行控制请求,在所跟踪的被管理程序的源代码与该源代码的中间表示之间进行映射,并且在该中间表示与跟踪之间进行另一映射。跟踪不包括运行时的任何执行实例。通过例如在与跟踪重放执行控制请求相对应的方向和数量上仿真模拟跟踪活动(例如,向前一步,或者通过对其步进跳过(step over)来重复整个例程),或者通过在跟踪位置上设置断点,或者通过执行上述两者,跟踪的重放可以被控制。
给出的示例仅仅是示出性的。本“发明内容”既不旨在标识所要求保护的主题的关键特征或必要特征,也不旨在用于限制所要求保护的主题的范围。相反,提供本“发明内容”是为了以简化的形式介绍一些技术概念,这些技术概念将在下面的“具体实施方式”中进一步描述。本发明以权利要求书来定义,并且在本发明内容与权利要求相抵触的情况下,以权利要求书为准。
附图说明
将参考附图给出更具体的描述。这些附图仅说明所选择的方面,因此不能完全确定涵盖或范围。尽管虚线表示一些项是可选的,但在权利要求中记载的任何项或被本领域技术人员认为对于体现权利要求是非可选的任何项应当理解为以某种形式存在于权利要求的一个实施例中。
图1是示出计算机系统并且还示出所配置的存储介质的框图;
图2是示出实时过程调试的方面的框图;
图3是示出基于在单个特定时间点制作的存储器的副本来进行调试的方面的框图;
图4是示出用于基于跟踪的调试的示例架构的方面的框图,包括调试器与重放适配器之间的主请求和响应;
图5是示出可以在调试期间引用或在跟踪中引用的各种存储器单元的框图;
图6是示出机器级别请求的框图,该机器级别请求可以在执行跟踪的重放期间从执行跟踪寻找信息或施加执行控制;
图7是示出对机器级别请求的响应的框图;
图8是示出示例跟踪重放执行控制系统的框图;
图9是示出一些跟踪重放执行控制操作的框图;
图10是示出线程跟踪数据的一些方面的框图;
图11是示出一个或多个中间表示的一些方面的框图;
图12是示出被适配于使用支持反向执行调试的跟踪的实时过程调试环境的一些方面的框图;
图13是示出示例跟踪重放执行控制方法的流程图;以及
图14是进一步示出一些跟踪重放执行控制方法的流程图。
具体实施方式
概述
在生产云环境中的调试提出了严重的技术挑战。例如,假定对在线购物车的特定请求R不起作用。开发者如何在不减慢所有其他请求的处理速度并且使请求R的处理减速最小化的情况下调试请求R的处理?为了找到缺陷,开发者使用关于代码内部正在发生什么的信息,例如一种在请求R的处理期间查看一个或多个兴趣点处的变量的值的方式。
这里讨论的基于跟踪的调试创新有助于克服传统方法不能够解决的技术难题。例如,很多传统的调试器和调试方法允许开发者设置暂停断点(halt breakpoint)以得到关于变量值的信息。暂停断点是暂停执行的指令,从而开发者有时间在处理中的给定点处检查存储器内容并且考虑观察到的可能解释。但是在生产环境中,暂停断点可能会暂停大量请求的处理,或者使请求彻底失败(例如,超时),或者使执行采取不同的执行路径,无论哪一个都是不希望的。即使仅暂停单个线程,也可能导致不希望的放弃请求,并且产生不能够预料的副作用,其阻碍调试、或降低性能、或两者。
一些熟悉的调试方法涉及在代码中的特定点处添加打印语句,以打印特定变量的值,或者添加其他代码,例如,以测试变量的值以查看其是否是开发者在代码中的这一点处期望的值。但是这些方法可能需要重新编译和重新部署代码,这在生产环境中不受欢迎,尤其是如果重新编译和重新部署要被多次完成作为迭代调试过程的一部分以查找和修复单个缺陷。
开发者可以在执行时间处将操作注入请求处理代码中,以制作与请求有关的部分或全部存储器的副本。副本可以包括“快照”304(经由写时复制与原始过程共享存储器分配页的过程的存储器中(in-memory)副本)或“转储”文件302(过程的序列化副本)或两者。一些传统的调试器可以读取转储文件或快照,并且在给定适当元数据的情况下,以特定格式呈现存储器内容,该特定格式示出从二进制被转换为包括变量名称的信息性结构的变量值并且基于变量的相应数据类型来显示变量值。但是将存储器转储到文件需要花费大量时间,这不仅会减慢请求R,而且会减慢示例场景中所有请求的处理。尽管拍摄快照比创建转储文件要快得多,但这可能会需要开发者的很多尝试来在处理中找到有用的点,以获取揭示缺陷的存储器快照,并且快照占用RAM中的空间。为了在转储文件或快照中捕获的除执行时间以外的时间中的另一点查看存储器,可以创建另一存储器副本。
为了在实时过程中的任何时间点查看存储器,实时过程被使用。在很多现代计算系统中,如图2中的示例所示,除了依赖于操作系统120以外,实时过程202还包括运行时204。运行时204提供垃圾收集或动态代码编译(即,JIT编译或中间语言代码的编译)或两者。垃圾收集可以利用对象可达性分析、对象引用计数或其他策略。一些配置包括所解释的运行时204,并且本领域技术人员将认识到,通过将解释器的视图叠加到本机跟踪上并且使用解释器自身内的断点,本文中的教导可以被应用以对所解释的运行时进行执行控制。附加地,一些运行时(例如,
Figure BDA0002753400150000061
运行时)并不总是JIT编译其IL表示(Java术语将其称为“字节码”)。而是,运行时可以选择为不常用的功能解释字节码。在这种情况下,执行控制可以进行运行时代码自身的执行控制,并且可以映射本机代码到内部运行时数据结构到IL到源代码。本机代码到内部运行时数据结构到IL的映射可以被视为中间本机映射812的示例,并且IL到源代码的映射可以被视为源中间映射810的示例。
与缺少运行时的过程可以通过插入暂停断点由调试器来直接控制不同。依赖于运行时的过程不能够被调试器200直接控制,因为它们的运行时有效地从调试器细节206隐藏,诸如存储器位置、存储器内容和指令指针。为了向开发者展示调试期间存储器中有什么,调试器向运行时发送要求当前存储器值的消息214,运行时在答复消息216中将这些值发送给调试器,调试器在某个用户界面210中显示其在回复消息中接收到的值。
作为先前方法的缺点的特定示例,考虑被实现为执行中间语言(IL)的虚拟机的运行时204。使用传统的本机代码调试器不能够轻松调试IL代码,因为该调试器将用于调试虚拟机/运行时,而不是用于调试IL代码。
运行时还控制实时调试对象的执行。用于IL或进行向IL编译的语言的传统调试器通过在调试器与调试对象内部的运行时之间建立通信通道来工作。调试对象中的运行时进行提供调试体验所需要的大部分工作。在一个示例中,为了在偏移28处在方法Foo中的中间语言(IL)指令处设置断点,消息被发送至运行时,要求它在Foo偏移28处设置断点。然后,运行时内的线程将接收该消息,将Foo IL偏移28转换为驻留于存储器地址0x4567123512395处的机器指令,并且然后在该位置写入断点指令。类似地,为了执行熟悉的执行控制操作,诸如步进、步进进入、步进退出和步进跳过,调试器向运行时发送请求该操作的消息214,运行时204执行该操作并且在答复消息216中将已更新状态发送给调试器,并且调试器在某个用户界面210中显示在答复消息中所指示的结果。
用户界面210以图形方式向用户显示调试器的调试对象程序状态的代表。程序状态的一些示例是线程的列表、要在每个线程上执行的下一行源代码、每个线程的调用栈、调用栈的每一帧中的一组变量、这些变量的值等。用户界面可以包括对例程的本地数据、所监视(watch)的变量及其值、源代码、表达式求值器、以及关于调试对象202的其他信息进行显示的窗口。
在一些实现中,调试器200的运行时转换部分负责在低级别概念(诸如存储器单元和寄存器)与运行时抽象之间进行转换。运行时抽象的示例包括线程的列表、针对每个线程的一个或多个调用栈、以及接下来将要执行的IL指令。注意,抽象的运行时层的调用栈不一定与抽象的源代码级别处的调用栈相同,例如,虚拟机的调用栈与虚拟机中正在执行的IL代码的虚拟调用栈不一定匹配。
创建过程的执行跟踪418是可能的。然后可以使用硬件102的仿真来重放跟踪。有时,该跟踪过程是用高级别语言212编写的,高级别语言需要由运行时框架204执行过程202。跟踪本身可能很难调试,因为跟踪数据反映的是低级别处的视图(例如,运行时或即时编译的代码或两者),而不是编写程序的高级别语言。一些跟踪技术不提供开发者104可能更喜欢的过程的高级别视图。大多数高级别运行时都要求运行时本身提供关于在其框架中运行的程序的信息。因此,常规调试可能要求过程在运行时内执行,而当调试基于跟踪而不是实时过程时,这不可选。
像任何其他过程一样,运行时可以被跟踪。然而,调试除运行时以外的软件比调试运行时更为常见。跟踪过程可以包括或排除跟踪其是运行时本身的一部分的一些或全部代码。
该功能性不适用于没有当前执行运行时的跟踪文件。为了对正在执行依赖于运行时204的代码的实时过程的执行进行控制,调试器可以向运行时发送请求操作的消息,所请求的操作诸如“步进”(step)或者“运行”(run),然后运行时代表调试器执行该操作。
调试器向运行时发送消息以代表调试器执行操作的功能不适用于没有当前正在执行的运行时的跟踪文件。就运行时不可用而言,转储文件302和快照304与跟踪相似。运行时可以表示为转储或快照或跟踪,但它没有正在执行并且因此不能够以传统方法被调用。
尽管如此,可以使跟踪文件420是调试环境的一部分。这里讨论的一些基于跟踪的调试实施例扩展了调试的权力(power),使得调试器可以从跟踪文件重放执行,从由开发者所选择的执行时间的一个或多个点开始,然后在跟踪执行中以由开发者所选择的增量向前或向后移动。一种方法是在跟踪与高级别语言调试器之间插入重放层。重放层理解运行时的执行控制消息,从而允许对所跟踪的过程进行高级别控制。
在一些情况下,开发者可以使用“时间旅行”调试器来控制执行重放,以在重放记录的跟踪418时在执行时间中向前运行或在执行时间中向后运行,从而利用调试器的能力以有用的高级别(例如,被命名的和基于数据类型的)变量呈现形式来呈现诸如(多个)指令指针的程序状态信息和存储器,不仅像以前一样用于快照,现在还可以用于连续重放在代码执行期间所记录的执行时间的分段(segment)。通过将分组的跟踪数据与对应的源代码结构(诸如表达式和语句)对准,可以使调试更加有效。可以由开发者基于跟踪文件中所记录的低级别数据在高级别呈现中在多个点处检查在跟踪中所捕获的存储器值。
随着跟踪被重放,进行包括的重放层可以用于控制调试对象状态。如此适配,调试器200可以应用已经被记录为机器级别操作的过程跟踪的运行时(高级别)视图。仅出于本申请的目的,“机器级别”操作是在机器具体级别明细处所指明的操作。一般而言,“本机”和“机器级别”在本文中相对于指令或代码可互换使用。
一些人可以在较广泛的上下文中查看本文中描述的一些实施例。例如,诸如控制执行、记录执行以及重放所记录的执行的概念可以被认为与特定实施例相关。然而,其并不遵从广泛上下文的可用性,在此寻求抽象概念的专有权;他们不是。而是,本公开关注于提供适当的特定实施例,这些实施例的技术效果完全或部分地解决特定技术问题,诸如如何将高级别控制请求与机器级别跟踪自动地相关联、以及本文中解决的其他问题。涉及控制执行、记录执行或重放所记录的执行的其他介质、系统和方法不在本发明范围之内。因此,在适当地理解本公开的情况下,也避免了模糊、仅仅抽象、缺乏技术特征以及伴随的证明问题。
技术特征
本文中描述的实施例的技术特征对于本领域普通技术人员将是明显的,并且也将以多种方式对于各种专注读者而言是明显的。一些实施例解决植根于计算技术的技术活动并且通过帮助调试计算系统来改善这些系统的功能,从而相对于所产生的计算性结果来改善系统的正常运行时间、系统准确性和功率利用。例如,一些实施例提供系统可调试性功能性,其通过允许重放执行向后移动到期望点而不是从执行的起始重新开始并且向前移动到该点,来帮助减少由开发者在调试的同时对缺陷说明进行定位所花费的时间量。一些实施例通过将跟踪数据与对应的源代码语句准确地对准来改善系统的可调试性。一些实施例在系统中提供附加的调试功能性,诸如用于设置断点地址范围来取代一次在一个地址上设置断点的功能性。
一些实施例包括诸如计算硬件的技术性组件,该技术性组件以超出通用计算机内的典型交互的方式与软件交互。例如,除了一般交互(诸如一般的存储器分配、一般的存储器读取和写入、一般的指令执行、以及某种I/O)以外,本文中描述的一些实施例还实现了如本文中公开的向后步进退出重放操作。
一些实施例提供的技术效果包括:更有效地使用调试时间、经减的重新跟踪以获取附加跟踪数据、以及经改进的调试器功能性用于缺陷因果关系的探索。
一些实施例包括技术性适配。一些实施例包括重放层适配器,该重放层适配器接受针对运行时而被格式化的请求,即,以与熟悉的调试器运行时通信兼容的消息格式,并且以可以由运行时在实时调试期间使用的格式响应于这些请求。在一些实施例中,重放适配器提供隐藏实时过程调试、基于转储的调试以及基于时间旅行跟踪的调试之间的差异的接口。一些实施例包括源代码、(多个)中间表示以及跟踪数据之间的映射。
从所提供的描述,基于教导的技术特征的其他优点对于本领域技术人员也是明显的。
首字母缩写词和缩写
下面定义一些首字母缩写词和缩写。其他缩写可以在本文中的其他地方定义,或者不需要任何定义就能被本领域技术人员理解。
ALU:算术和逻辑单元
API:应用程序接口
BIOS:基本输入/输出系统
CD:压缩盘
CPU:中央处理单元
DAC:数据访问组件
DVD:数字多功能盘或数字视频盘
FPGA:现场可编程门阵列
FPU:浮点处理单元
GPU:图形处理单元
GUI:图形用户界面
IDE:集成开发环境,有时又称为“交互式开发环境”
IL:中间语言
OS:操作系统
RAM:随机存取存储器
ROM:只读存储器
附加术语
在本文中参考诸如附图中所示的示例性实施例,并且本文中使用特定语言来描述它们。然而,相关领域的技术人员可能想到的并且具有本公开的本文中示出的特征的改变和进一步修改以及本文中由特定实施例示出的抽象原理的附加技术应用应当被认为在权利要求的范围内。
在本公开中声明了术语的含义,因此在阅读权利要求时应当仔细注意这些声明。给出了具体示例,但是相关领域的技术人员将理解,其他示例也可以落入所使用的术语的含义内,并且落入一个或多个权利要求的范围内。这里的术语不一定具有与它们在一般用途(尤其是在非技术用途中)、在特定行业的用途、在特定词典或词典中的用途相同的含义。附图标记可以与各种措词一起使用,以帮助示出术语的广度。从给定文本中省略附图标记并不一定表示该文本未讨论图的内容。发明人主张并且行使其对自己的词典编纂的权利。带引号的术语是显式地定义的,但也可以不使用引号而隐式定义术语。可以在“具体实施方式”中和/或在申请文件中的其他位置显式或隐式地定义术语。
如本文中使用的,“计算机系统”可以包括例如一个或多个服务器、主板、处理节点、膝上型计算机、平板电脑、个人计算机(便携式或非便携式)、个人数字助理、智能电话、智能手表、智能手环、蜂窝或移动电话、至少具有处理器和存储器的其他移动设备、视频游戏系统、增强现实系统、全息投影系统、电视、可穿戴计算系统、物联网节点、和/或提供至少部分由指令控制的一个或多个处理器的其他设备。指令可以采用固件或存储器和/或专用电路系统中的其他软件的形式。
“多线程”计算机系统是支持多个执行线程的计算机系统。术语“线程”应当被理解为包括能够进行或被进行排程(并且可能进行同步)的指令的任何序列,并且例如还可以称为诸如“过程”或“协程”。线程可以并行地运行、顺序地运行、或以并行执行(例如,多处理)和顺序执行(例如,时间被切片地(time-sliced))的组合运行。
“处理器”是线程处理单元,诸如同时多线程实现中的核心。处理器包括硬件。给定芯片可以容纳一个或多个处理器。处理器可以是通用的,也可以被定制用于特定用途,诸如矢量处理、图形处理、信号处理、浮点算术处理、加密、I/O处理等。
“内核”包括操作系统、虚拟机监视器、虚拟机、BIOS代码和类似的硬件接口软件。
“代码”是指处理器指令、数据(包括常量、变量和数据结构)或指令和数据两者。“代码”和“软件”在本文中可互换使用。可执行代码、解释代码和固件是代码的一些示例。被解释或被编译以便执行的代码称为“源代码”。
“程序”在本文中被广泛地使用,以包括应用、内核、驱动、中断处理器、固件、状态机、库、以及由程序员(又称为开发者)编写和/或自动生成的其他代码。
“服务”是指在云计算环境或其他网络环境中进行提供的消耗性程序。
“执行时间点”是指针对处理单元或线程的具体执行点,尤其是与跟踪执行有关的。本文中对“特定执行时间”或“执行时间t”等的引用是对执行时间点的引用。例如,可以将执行时间点实施为时间码变量或时间码值,或者实施为跟踪或执行活动的其他记录中的相对位置。执行时间点ta“早于”或“晚于”执行时间点tb表示两个执行时间点的相对顺序被确定。类似地,“较年轻”的执行时间点比“较老”的执行时间点晚的执行时间点。
跟踪中有关跟踪事件的顺序的信息可能不完整。因此,跟踪可以具有足够的信息来确定事件A早于事件B,或确定事件D晚于事件C。但是就考虑跟踪来说,事件的相对顺序也可能是部分或完全不确定的。跟踪可以示出,事件E不在事件F之后,但这并不一定表示E在事件F之前;类似地,在没有跟踪还示出K在J之后的情况下,跟踪可以示出,事件K不在事件J之前。跟踪还可能缺少足够的信息来确立两个特定事件相对于彼此的任何顺序。
“时间码”表示单调变化的值,该值可以用于对执行跟踪中的至少一些事件施加顺序。可以预期,时间码通常是单调递增的值,但是时间码也可以被实施为单调递减的值。时间码的一些示例包括指令计数器、时钟时间(又称时钟滴答)和完全人工的(不基于寄存器或指令的)单调值。依赖于跟踪,所有或一些或没有跟踪事件可以具有相应的相关联的时间码。当时间码存在时,它们可以是唯一的,或者由于一些时间码值重复,因此它们可能只是单调的。
“存储器单元”是指存储器的可寻址单元。一些示例包括RAM或ROM中的字节或字、处理器寄存器、高速缓存行、以及其他可寻址的存储器单元。
“仿真器”执行“仿真模拟”,该“仿真模拟”提供与原始硬件相同的功能,但是使用不同的实施或不同的硬件或两者。一个示例是CPU仿真器,其作用类似于CPU,并且可以像原始CPU硬件一样被用于执行代码,但是与原始CPU的实施不同,例如,仿真器可以在完全不同的物理硬件上运行。
除非另有说明,否则如本文中使用的,“包括”允许附加的元素(即,包括是指包含)。
“优化”是指改进,而不必须完美。例如,可以对已经优化的程序或算法进行进一步的改进。
例如,“过程”在本文中有时被用作计算科学领域的术语,并且在技术意义上涵盖计算性资源用户,即协程、线程、任务、中断处理器、应用过程、内核过程、过程(procedure)和对象方法。“过程”在本文中也用作专利法的术语,例如,在描述与系统权利要求或制品(所配置的存储介质)权利要求相对的过程权利要求时。类似地,“方法”在本文中有时被用作计算机科学领域的技术术语(一种“例程”),也被用作专利法领域的术语(“过程”)。本领域技术人员将理解在特定情况下意图使用的含义,还将理解(在专利法意义上的)给定的要求保护的过程或方法有时可以使用一个或多个过程或方法(在计算科学意义上)而被实现。
与没有自动化相反,“自动地”是指利用自动化(例如,由软件配置的、用于本文中讨论的特定操作和技术效果的通用计算硬件)。尤其是,“自动地”执行的步骤虽然可以由人发起或由人以交互方式引导,但它们并不手动地在纸上或在人的脑海中执行。自动的步骤通过机器被执行,为了获取不利用如此提供的技术交互就不能够实现的一种或多种技术效果。
技术人员理解,技术效果是技术实施例的推定目的。例如,在一个实施例中涉及计算,并且一些计算也可以在没有技术组件(例如,通过纸和铅笔,或者甚至作为精神步骤)的情况下执行,这一事实并不消除技术效果的存在或改变实施例的具体和技术性质。诸如以足够快的速度搜索跟踪数据以准许在原始执行速度的一个或两个数量级内进行重放的操作、以及用于对跟踪的本机指令分组并且将指令组与相应源代码项对准的计算在本文中应当理解为:除了其固有的数字本质以外,还需要以及提供人类思维步骤不能够获取的速度和准确性(人类的思维不能够直接与跟踪文件或其他数字存储对接以检索必要的跟踪数据)。本领域技术人员已经很好地理解了这一点,但是其他人有时可能会从事实的告知或提醒中受益。除非另有说明,否则与单纯的思想实验相反,实施例被假定能够在生产环境中或在生产环境的测试实验室中大规模操作。
“计算性地”同样表示正在使用计算设备(至少是处理器加存储器),并且排除了仅凭人类思想或仅凭人类行动获取的结果。例如,如本文中理解的,用纸和铅笔进行算术不是计算性地进行算术。计算性结果更快,更广泛,更深入,更准确,更一致,更全面,和/或提供的技术效果超出了人类绩效范围。“计算性步骤”是计算性地执行的步骤。“自动地”或“计算性地”都不一定表示“立即”。“计算性地”和“自动地”在本文中可互换使用。
“主动地”是指没有来自用户的直接请求。实际上,在直到步骤的结果已经被呈现给用户为止,用户甚至可能没有意识到一个实施例的主动步骤是可能的。除非另有说明,否则本文中描述的任何计算性和/或自动的步骤也可以主动地进行。
在整个文档中,使用可选的“(多个)”表示存在一个或多个所指示的特征。例如,“(多个)处理器”是指“一个或多个处理器”或等效地“至少一个处理器”。
出于美国法律和实践的目的,在权利要求书或其他地方使用本文中的“步骤”一词并非旨在调用手段加功能、步骤加功能或35美国法典第112条第六款/第112(f)条要求解释。特此明确驳斥对此种效果的任何推定。
出于美国法律和实践的目的,除非权利要求使用短语“用于……的手段”,否则它们并不意图援引手段加功能的解释。意图被解释为手段加功能语言的权利要求语言(如果有的话)将通过使用短语“用于……的手段”来明确叙述该意图。当采用手段加功能的解释时,无论是通过使用“用于……的手段”和/或通过法院对权利要求语言的法律解释,应当将说明书中针对给定名词或给定动词列举的手段理解为与权利要求语言链接在一起并且在此通过以下任何方式链接在一起:出现在附图框图中相同框内,用相同或相似名称表示,用相同附图标记表示。例如,如果权利要求限制中记载了“zac小部件”,并且该权利要求限制受制于手段加功能的解释,则至少在说明书中任何图块、段落或示例中提到“zac小部件”的任何地方标识的或由分配给zac小部件的任何附图标记绑在一起的所有结构应当视为zac小部件应用中标识的结构的一部分,并且有助于定义zac小部件结构的等效项集。
在整个文档中,除非另有明确说明,否则对过程中的步骤的任何引用均假定该步骤可以由感兴趣的一方直接执行,和/或由一方通过干预机制和/或干预实体间接执行,并且仍然在该步骤的范围内。也就是说,除非明确说明直接执行,否则该步骤不需要由相关方直接执行。例如,诸如对准、清除、编译、继续、控制、调试、仿真模拟、遇到、超过、执行、获取、分组、标识、映射、执行、接收、记录、重放、请求、响应、发送、设置、指定、步进(以及诸如步进进入、步进退出、步进跳过的变型)、终止、跟踪(以及对准、经对准的、清除、经清除的等)等涉及由感兴趣的一方所进行的、关于目的地或其他主题的动作的步骤可以涉及由某个其他方进行的干预动作,诸如转发、复制、上传、下载、编码、译码、压缩、解压缩、加密、解密、认证、调用等,但仍应当理解为直接由感兴趣一方执行。
每当引用数据或指令时,应当理解,例如,这些项配置计算机可读存储器和/或计算机可读存储介质,从而将其转换为特定物品,与简单地存在于纸上、在一个人的思想中、仅仅是能量、或者仅仅是信号在电线上传播相反。出于美国专利保护的目的,根据美国专利商标局(USPTO)在re Nuijten案中的解释,存储器或其他计算机可读存储介质不是在可专利主题范围之外的传播信号、载波或仅能量。在美国,没有任何一项权利要求能够涵盖信号本身,并且任何主张相反的权利要求解释都是不合理的。除非在美国以外地区授予的权利要求中另有明确说明,否则权利要求并不涵盖信号本身。
此外,尽管本文中其他地方有明显相反的规定,但是应当理解(a)计算机可读存储介质和计算机可读存储器与(b)传输介质(又称为信号介质或仅能量)之间的明显区别。传输介质是传播信号或载波计算机可读介质或仅能量。相反,计算机可读存储介质和计算机可读存储器不是传播信号或载波计算机可读介质。除非在权利要求中另有明确说明,否则“计算机可读介质”是指计算机可读存储介质,不是传播信号本身,也不是仅能量。
本文中的“实施例”是示例。术语“实施例”不能与“本发明”互换。实施例可以自由地共享或借用各方面以创建一些其他实施例(只要结果是可操作的),即使本文中本身未明确描述各方面的结果性组合。对于本领域技术人员而言,不需要明确描述的每个许可组合都是必要的,这与承认专利说明书是为本领域技术人员编写的政策相反。关于即使由少量可组合特征引起的可能组合的数目的形式化组合计算和非正式的直觉也将表明,本文中描述的各方面存在大量的方面组合。因此,要求每种组合的明确叙述与要求简明的专利说明书并且要求读者在有关技术领域具有知识的政策背道而驰。
附图标记列表
提供以下列表是为了方便和支持附图以及作为说明书文本的一部分,其通过引用多个项来描述创新。尽管如此,这里未列出的项仍可以是给定实施例的一部分。为了使文本更清晰易读,在文本中一些(而非全部)引用项附近引用了给定的附图标记。可以参考给定项的不同示例或不同实例使用相同的附图标记。附图标记的列表是:
100:操作环境,又称为计算环境
102:计算机系统,又称为计算性系统或计算系统
104:用户
106:外围设备
108:一般是网络
110:处理器
112:计算机可读存储介质,例如RAM、硬盘
114:可移动地配置的计算机可读存储介质
116:通过处理器可执行的指令;可以在可移动介质上,也可以在其他存储器(易失性或非易失性或两者)中
118:数据
120:(多个)内核,例如,(多个)操作系统、BIOS、设备驱动程序
122:工具,例如防病毒软件、分析器(profiler)、调试器、编辑器、编译器、解释器、安全渗透测试器、模糊器、自动化性能监测工具等;可以被适配于使用本文中教导的执行控制
124:应用,例如文字处理器、网络浏览器、电子表格
126:显示屏
128:计算硬件,不以其他方式与附图标记106、108、110、112、114相关联
200:调试器,也指代调试的活动
202:实时调试对象程序或过程
204:运行时,例如,公共语言运行时、
Figure BDA0002753400150000181
虚拟机、或动态地转换代码以供执行的其他虚拟机(甲骨文美国公司的商标)
206:存储器项,例如,应用或系统数据结构
208:调试器的数据访问组件
210:调试器的用户界面
212:源代码,相关信息,诸如元数据和符号表
214:来自调试器的对调试对象信息源的主请求,例如实时调试对象或转储文件读取器软件或快照读取器软件或跟踪文件读取器软件
216:对主请求的响应,该主请求从调试对象信息源或状态改变寻求信息;也称为“主响应”,如在主请求的抽象级别处的响应中,而不是如在第一或初始或最重要的响应中
218:源代码中的语句;例如可以由分号或括号、大括号或方括号明确地定界,也可以用空格或行尾符(end-of-line)隐式地定界
220:源代码中的表达式;由所使用的编程语言在语法上定义;可以是函数调用的分配、对象成员的分配、例程调用、或者产生结果值或副作用的常量、变量、运算符和例程的另一组合
302:转储文件,也称为存储器转储;可以包括附加信息,诸如索引或元数据
304:存储器快照;可以包括附加信息,诸如索引或元数据
402:调试器中的调试对象执行控制代码,例如,用于请求或仿真模拟对调试对象的执行控制,诸如步进通过调试对象、设置断点、执行调试对象直到到达断点等
404:调试器或其他工具中的跨级别映射,例如,源代码与中间表示之间的映射或中间表示与跟踪数据之间的映射
406:重放组件,其使用跟踪文件来仿真模拟调试对象执行;跟踪重放组件406单独地或与其他重放层组件402、408(依赖于实现)一起,使用跟踪来仿真模拟原始过程的执行,并且允许随时间查看CPU状态和存储器单元;在一些实施例中,该仿真模拟可以向前或向后进行
408:用于重放组件的重放适配器,其允许重放组件发送请求和接收响应,这些响应也在实时过程的调试期间被使用;在跟踪文件调试场景中,重放层(即,重放组件加重放适配器)接收和响应于来自调试器的主请求,这些主请求可以由实时过程调试场景中的运行时进行接收和响应,并且重放适配器还可以做出对跟踪文件的次请求
410:重放适配器接口;被配置用于与调试器通信
414:来自重放适配器的对跟踪的次请求,其中“次”指示比主请求214的抽象级别低的抽象级别;该次请求可以是机器级别的请求,其可以被实施为到跟踪文件读取器的通信,也可以以内部方式被实施在重放适配器内(例如,作为函数调用)
416:对机器级别请求的响应,该机器级别请求从跟踪寻求信息;也称为“次响应”,如在次请求的抽象级别的响应中,而不是如在第二响应中;可以被实施为从跟踪文件读取器的通信,也可以以内部方式被实施在重放适配器内(例如,作为函数结果或数据结构更新)
418:执行跟踪;尽管图4中的虚线示出了给定跟踪中可以包括个体项或省略了个体项,但是本文中假定跟踪不是空的,并且因此针对跟踪数据的框总体454上以实线示出;418也可以指代创建跟踪的活动,其有时也称为“跟踪”或“记录”
420:包含执行跟踪数据的跟踪文件;可以包括机器级别的跟踪数据,即,记录本机代码级别的执行活动的数据
422:在跟踪中精确到位的跟踪数据
424:在所跟踪的代码的执行中标识特定执行时间点的跟踪中的时间码;可以被链接到或被嵌入到跟踪内的其他数据中,例如,在跟踪数据中,该跟踪数据明确陈述在涉及所陈述的数据值的所陈述的存储器地址处与所陈述的操作相关联的执行时间点;时间码可以被实施为例如时钟滴答或指令计数器;对于每个被记录的操作,一些跟踪可以包含唯一时间码,但是在一些跟踪数据中,时间码也可以被重复或被省略
428:跟踪中的时间码中的间隙,用于明确或隐式地指示其中未执行跟踪的执行时间点(例如,当对线程或处理单元禁用跟踪时的范围)。这可以包括相邻时间码相差大于默认值或指定增量(通常为1)的任何间隙,例如,时间码序列2、3、4、300、301、302的间隙在4至300之间,时间码序列250、500、750、1000、2000、2250、2500的间隙在1000到2000之间。
430:到跟踪文件中的数据中的索引,例如反向查找数据结构,用于快速标识跟踪属性、存储器寿命索引信息、以及跟踪数据中可能特别令人感兴趣的位置的其他可搜索列表
432:跟踪数据中的关键帧;例如,可以以固定间隔存在于跟踪数据中,以准许重放以更快地跳转到关键帧处(或附近)的跟踪重放
434:所执行的代码,例如在调试对象运行并且被跟踪时由处理器执行的调试对象的机器级别代码的操作码和参数
436:在调试对象运行并且被跟踪时发生的堆栈活动,例如,堆栈增长、堆栈收缩、以及该活动发生的执行时间点
438:数据流;可以对应于单个线程或一组线程,可以对应于处理器单元(例如,处理器核心);可以对应于给定处理器插槽中的所有核心;可以注释有元数据,以帮助重放
440:在调试对象运行并且被跟踪时发生的处理器核心活动,例如,由核心执行的指令的操作码和参数
442:在调试对象运行并且被跟踪时发生的处理器插槽活动,例如,由位于给定处理器插槽中的任何核心执行的指令的操作码和参数
444:在调试对象运行并且被跟踪时发生的线程活动,例如,在线程运行时执行的指令、在线程运行时进行的存储器单元访问、相关联的元数据,诸如线程ID和时间码
446:在调试对象运行并且被跟踪时发生的寄存器活动,例如,在什么时间码从哪个寄存器读取什么值、在什么时间码向哪个寄存器写入什么值
448:存储器地址
450:指令操作码
452:数据值
454:一般地是跟踪数据
456:元组,即,在跟踪中相关联的跟踪数据的两个或更多项,代表在跟踪执行期间的相同操作;例如,存储器读取操作或存储器写入操作可以作为元组被记录在跟踪中的单个行上,该元组包含或以其他方式将操作码(例如,读取或写入)、地址(例如,RAM地址或寄存器ID)、以及已经读取或写入的数据值相关联在一起
458:跟踪条目
502:存储器单元,例如RAM或ROM中的字节或字、处理器寄存器、高速缓存线、或其他可寻址存储器单元
504:堆栈,例如,存储器的一部分,当例程被进入时状态信息被推入其中,并且然后随着控制从例程返回到调用例程的代码而被弹出;通常区别于堆存储器
506:堆栈基地址,其定义起始点,从该起始点开始在连续的存储器中分配堆栈;堆栈被假定利用系统中的堆栈存储器的分配在已知方向上增长,这在给定系统中可以是向上的方向(即,地址随着项被推入堆栈而增加),但在另一系统中,其也可以向下(即,地址随着项被推入堆栈而减小);术语“增长的”在此是指在所讨论的系统上在堆栈增长的方向上,而“收缩的”是指在相反方向上
508:堆栈框架,即分配记录,其当例程被调用时被分配在堆栈上;通常包含返回地址,该地址标识代码中的位置,该位置是例程返回时将恢复执行的位置;也可以包含当例程被调用时作为参数传递给例程的值、或这样的参数值的地址
510:随着构造和释放对象而分配和释放的堆存储器;在一些情况下,堆可以进行自动垃圾收集,该堆标识并且标记为可用存储器,可用存储器保持过程的实时执行期间不再可达的对象;在其他情况下,从堆分配的存储器需要单独的显式调用以释放所分配的存储器。
512:对象
514:高速缓冲存储器;例如可以在RAM工作存储器中或在处理器芯片上
516:处理器核中的寄存器
518:对象属性;被命名的值,它是对象的组成部分;可以是函数,在这种情况下,该属性通常称为方法;也是指实现对象属性的函数;函数是返回值的例程
520:ROM(只读存储器);通常是非易失性的
522:除了板载ROM之外的非易失性存储器,诸如可移动闪存、磁盘或光盘存储、磁带存储等。
524:RAM(随机存取存储器);通常为易失性的
526:本地存储器,例如,对于所陈述的或隐式的上下文是本地的存储器,诸如在例程的执行期间相对于例程是本地的并且然后被释放,或者相对于线程是本地的
528:全局存储器,例如对于所陈述的或隐式的上下文是全局的存储器,诸如在它们中的任何一个的执行期间相对于一组多个例程是全局的,或者相对于一组线程是全局的
530:存储器的特性,其增加或减小线程外部的实体将改变存储在存储器单元中的值的可能性,例如,存储器单元是否相对于其他线程被写保护,是否在共享存储器(诸如相对多个线程是全局的存储器)中
602:存储器单元规格,例如,ROM或RAM或高速缓存中的地址,或寄存器ID,或通过将存储器单元与其他存储器单元区分开以准许访问(读或写,或合理尝试读或写)该存储器单元来指明该存储器单元的另一项;也可以指明多个存储器单元,例如,作为地址的范围
604:寄存器ID,例如,寄存器名称,或者到寄存器阵列的索引
606:地址范围,即,对对应的连续存储器单元的集合进行标识的相邻地址的集合;作为一个示例,可以将范围指明为一对地址(高地址和低地址);作为另一示例,可以将范围指明为基地址和基于基地址的连续单元的计数
608:一个或多个执行时间点的规定,例如,作为特定时间码或者时间码的范围;可以将范围指明为一对时间码(开始时间码和结束时间码),也可以将范围指明为基时间码和时间码增量的计数,诸如时钟滴答的数目或指令的数目
610:指令计数,可用作时间码;可以是从过程开始执行时的绝对计数,也可以是诸如从线程恢复执行时的相对计数
612:系统时钟值,例如,以毫秒或CPU周期数为单位
614:执行时间范围规定,即,指明执行时间点的范围的数据;例如,可以被实施为一对时间码(开始和结束)或被实施为基时间码和基于基时间码的时间码增量的计数
616:执行时间点
618:执行控制操作,例如,向前步进、反向步进跳过、去往所指明的位置、设置或清除断点等
620:执行控制操作的标识符;对于步进或继续操作,其引用或包括方向(即,向前或向后;“反向”和“向后”在本文中可互换使用),并且还引用或包括增量大小(例如,一步,步进跳过例程,或继续直到遇到断点)
702:从跟踪数据导出的数据值
704:指令指针,其标识跟踪数据中的特定指令或执行时间点;这是重放执行向前或向后移动的引用位置;“向后”是指朝着执行时间点越来越年轻的方向,“向前”是指朝着执行时间点越来越老的方向
706:状态码,指示请求的结果,例如,执行控制操作成功、执行控制操作被发起(用于异步控制)、执行控制操作失败
800:跟踪重放执行控制系统
802:所跟踪的程序的过程;可以包括一个或多个线程
804:线程
806:来自用户对用于执行控制操作的工具的请求
808:程序元数据或工具元数据,例如,没有另外具体编号但仍在此讨论的数据
810:源中间映射,即,源代码或(多个)源代码项与源代码或(多个)源代码项的一个或多个中间表示之间的映射;映射810是跨级别映射404的示例
812:中间本机映射,即,一个或多个中间表示与本机指令或其他跟踪数据之间的映射;映射812是跨级别映射404的示例
814:跟踪中的本机指令116的记录;可以包括例如精确到位的跟踪数据422、执行代码434、元组456或其他跟踪数据454
816:JIT(即时)编译器
818:对例程的调用或其他调用,例如,将控制权传递到异常处理器或中断处理器
820:返回地址,即,在调用818之后执行将在此继续的执行时间点或指令
822:一组跟踪数据,诸如本机指令,其对应于特定源代码语句S或源代码表达式E;例如,这可以包括指令的执行的记录,这些指令全部是通过编译源代码语句S或源代码表达式E而产生的,而不是从与S或E相邻的源代码语句和源代码表达式的编译产生的
824:组822的边缘指令;每个组通常具有两个边缘——如果指令是有序的,则一个边缘是该组中最年轻的指令,另一边缘是该组中最老的指令;不管一组指令中的所有指令是否彼此相对排序,当指令X满足以下条件中的至少一个条件时,跟踪中的一组指令G的X在G的边缘上:X是在跟踪的向前执行期间遇到的G的第一指令(“第一向前边缘”),X是在跟踪的向前执行期间遇到的G的最后指令(“最后向前边缘”),X是在跟踪的向后执行期间遇到的G的第一指令(“第一向后边缘”),或者X是在跟踪的向后执行期间遇到的G的最后指令(“最后向后边缘”)
826:中间表示,例如,低级别代码,诸如中间语言代码、或抽象语法树、或符号表
828:断点
830:断点范围
902:向前步进操作,也称为“向前步进”或“步进”(当默认或仅方向是向前的时),是指向前步进跳过一个源代码语句
904:向前步进进入操作,也称为“向前步进进入”或“步进进入”(默认或仅方向是向前的时),是指向前步进跳过进入例程,因此要执行的下一语句是例程的主体的第一语句
906:向前步进跳过操作,也称为“向前步进跳过”或“步进跳过”(默认或仅方向是向前的时),是指向前步进跳过进入并且通过例程,因此要执行的下一语句是调用例程之后的第一语句
908:向前步进退出操作,也称为“向前步进退出”或“步进退出”(默认或仅方向是向前的时),是指向前步进跳过通过当前例程的剩余部分,因此要执行的下一语句是调用例程之后的第一语句
910:继续向前操作,当默认或仅方向是向前的时,也称为“继续”或“运行”,是指继续向前执行,直到遇到断点或过程终止
912:向后步进操作,也称为“向后步进”,是指向后步进跳过一个源代码语句
914:向后步进进入操作,也称为“向后步进进入”,是指向后步进跳过进入例程,因此要反向执行的下一语句是例程的主体的最后语句
916:向后步进跳过操作,也称为“向后步进跳过”,是指向后步进跳过进入并且通过例程,因此要反向执行的下一语句是调用例程之前的第一语句
918:向后步进退出操作,也称为“向后步进退出”,是指向后步进跳过通过当前例程的剩余部分,因此要反向执行的下一语句是调用例程之前的第一语句
920:继续向后操作,也称为“向后继续”或“向后运行”或“反向运行”,是指继续向后执行,直到遇到断点或到达过程开始
一些实现可以例如通过执行更多或更少的指令或通过使用不同的名称来对操作902-920使用不同的定义。
922:设置断点范围,即指明:在遇到多个地址或执行时间点的所指明的范围内的任何地址或执行时间点时,执行应当断点暂停
924:设置断点
1004:线程ID
1006:线程状态,例如,被创建的、可运行、正在运行、挂起、阻塞、终止
1008:线程代码,即,当线程运行时所执行的或可以执行的代码
1010:线程存储器,例如,其对于线程是本地的的存储器、或者其对于线程是全局的并且随线程执行而被线程访问的存储器
1102:符号表
1104:在源代码中使用的标识符
1106:数据类型
1108:抽象数据树
1110:中间语言,例如,微软通用中间语言、
Figure BDA0002753400150000271
字节码(甲骨文公司的商标)、寄存器传输语言、Parrot中间表示、标准便携式中间表示、
Figure BDA0002753400150000272
IR中间语言(LLVM基金会公司的商标)等
1112:中间语言代码
1300:示例跟踪重放执行控制方法、和示出上述方法的流程图
1302:标识程序
1304:接收执行控制请求
1306:使用源代码与中间表示之间的映射
1308:使用中间表示与跟踪之间的映射
1310:例如通过向前或向后执行或者在这样的执行上设置参数(方向、增量)来控制答复
1312:在重放期间执行所跟踪的指令,例如,通过仿真模拟或通过将跟踪中所指明的操作转换为对本机指令(不一定全部在跟踪中)的重放的控制
1314:设置断点或断点范围;包括922或924或两者
1316:发送对执行控制请求的响应
1318:例如通过在断点暂停之前执行直到该组的边缘,将一组所跟踪的指令与源代码语句或表达式对准
1400:流程图
1402:这样标识向后步进退出请求
1404:在所指明的位置之前紧接的执行位置处设置断点;当A在跟踪的向前执行期间在B之前被遇到并且A与B之间存在最多五个跟踪本机代码指令时,位置A在跟踪中在位置B“之前紧接”
1406:在与特定源代码语句或表达式相对应的一组指令的边缘处设置断点
1408:设置断点范围,该断点范围涵盖(并且在一些实现中匹配)被指定为接收动态编译(“即时的”(jitted))代码的地址的范围
1410:设置断点,以步进跳过所指明的运行时例程
1412:在原始执行或重放执行期间遇到指令
1414:超出对同时被监测的断点的最大数目的硬件约束
1416:避免终止程序
1418:终止程序
1420:例如通过指明关于要执行的源代码语句或表达式的执行来在高级别控制原始执行或重放执行
1422:执行(原始或重放)过程、线程或程序
1424:获取用户对源代码语句或表达式的选择
1426:用户对源代码语句或表达式的选择
1428:调试过程、线程或程序
1430:向前执行过程、线程或程序
1432:向后执行过程、线程或程序
1434:设置大断点范围;当涵盖跟踪中的至少一千个连续地址或指令时,该断点范围为“大”
1436:大断点范围
1438:记录来自实时过程的跟踪数据
1440:对所跟踪的指令分组,即,创建或指明组822
1442:清除断点或断点范围
操作环境
参考图1,用于一个实施例的操作环境100包括至少一个计算机系统102。计算机系统102可以是多处理器计算机系统,也可以不是。操作环境可以包括给定计算机系统中的一个或多个机器,这些机器可以在云中被群集、被进行客户端服务器联网和/或被进行对等联网。个体机器是计算机系统,一组协作机器也是计算机系统。给定计算机系统102可以被配置用于例如具有应用的最终用户、用于管理员、作为服务器、作为分布式处理节点、和/或是其他方式。
人类用户104可以经由键入的文本、触摸、语音、移动、计算机视觉、手势、和/或其他形式的I/O,通过使用显示器、键盘和其他外围设备106与计算机系统102交互。屏幕126可以是可移动外围设备106,或者可以是系统102的组成部分。用户接口可以支持一个实施例与一个或多个人类用户之间的交互。用户接口可以包括命令行接口、图形用户界面(GUI)、自然用户界面(NUI)、语音命令界面、和/或其他用户界面(UI)呈现,它们可以作为不同的选项呈现或者可以集成。
系统管理员、网络管理员、软件开发者、工程师和最终用户都是特定类型的用户104。代表一个或多个人的自动代理、脚本、回放软件等也可以是用户104。存储设备和/或网络设备在一些实施例中可以被视为外围设备,而在一些其他实施例中可以被视为系统102的一部分,这取决于它们与处理器110的可分离性。例如,图1中未示出的其他计算机系统可以使用经由网络接口设备与网络108的一个或多个连接以技术性方式与计算机系统102或与另一系统实施例交互。
每个计算机系统102包括至少一个处理器110。与其他合适的系统一样,计算机系统102也包括一个或多个计算机可读存储介质112。介质112可以是不同的物理类型。介质112可以是易失性存储器、非易失性存储器、就地固定介质、可移动介质、磁性介质、光学介质、固态介质、和/或其他类型的物理持久性存储介质(与仅传播介质信号相反)。具体地,当插入或以其他方式安装时,诸如便携式(即,外部的)硬盘驱动器、CD、DVD、存储棒或其他可移动非易失性存储介质的经配置介质114可以在功能上成为计算机系统的技术性部分,使其内容是可访问的,以用于与处理器110交互并且由处理器110使用。可移动地配置的介质114是计算机可读存储介质112的示例。计算机可读存储介质112的其他一些示例包括内置的RAM、ROM、硬盘、以及由用户104不随时可拆卸的其他存储器存储设备。为了符合当前的美国专利要求,在美国未决或已批准的任何权利要求下,计算机可读介质、计算机可读存储介质、或计算机可读存储器都不是信号本身、或者仅能量。
例如,介质114配置有由处理器110可执行的二进制指令116;“可执行的”在本文中在广义上使用以包括机器代码、可解释代码、字节代码、和/或在虚拟机上运行的代码。介质114还配置有数据118,数据118通过指令116的执行而被创建、被修改、被引用、和/或以其他方式用于技术效果。指令116和数据118配置它们驻留在其中的存储器或其他存储介质114;当该存储器或其他计算机可读存储介质是给定计算机系统的功能部分时,指令116和数据118也配置该计算机系统。在一些实施例中,数据118的一部分代表真实世界项,诸如产品特性、库存、物理测量、设置、图像、读数、目标、体积(volume)等。这样的数据还会通过备份、还原、提交、中止、重新格式化、和/或其他技术性操作被转换。
尽管可以将一个实施例描述为由计算设备(例如,通用计算机、服务器或群集)中的一个或多个处理器执行的软件指令来实现,但是这种描述并不表示穷尽所有可能的实施例。本领域技术人员将理解,相同或相似的功能通常也可以直接在硬件逻辑中全部或部分地被实施以提供相同或相似的技术效果。备选地,或除了软件实现以外,本文中描述的技术功能性可以至少部分由一个或多个硬件逻辑组件执行。例如,并且在不排除其他实现的情况下,一个实施例可以包括硬件逻辑组件110、128,诸如现场可编程门阵列(FPGA)、专用集成电路(ASIC)、专用标准产品(ASSP)、系统片上组件(SOC)、复杂可编程逻辑设备(CPLD)和类似组件。例如,可以基于一个实施例的组件的输入、输出和/或它们的技术效果将它们分组为交互功能模块。
除了处理器110(例如,CPU、ALU、FPU和/或GPU)、存储器/存储介质112和显示器126以外,操作环境还可以包括其他硬件128,例如,诸如电池、总线、电源耗材、有线和无线网络接口卡。名词“屏幕”和“显示器”在本文中可互换使用。显示器126可以包括一个或多个触摸屏、响应于来自笔或平板电脑的输入的屏幕、或仅用于输出的屏幕。在一些实施例中,诸如人类用户I/O设备(屏幕、键盘、鼠标、平板电脑、麦克风、扬声器、运动传感器等)等的外围设备106将与一个或多个处理器110及存储器可操作通信。软件过程可以是用户104。
在一些实施例中,该系统包括由网络108连接的多个计算机。联网接口设备可以使用诸如分组交换网络接口卡、无线收发器、或电话网络接口的组件(例如,它可以存在于给定计算机系统中)来来提供对网络108的访问权。然而,一个实施例还可以通过直接存储器访问、可移动非易失性介质、或其他信息存储检索和/或传输方法来传送技术数据和/或技术指令。
本领域技术人员将理解,本文中在“操作环境”下呈现的前述方面和其他方面可以形成一个给定实施例的一部分。本文档的标题并非旨在将特征严格分类为实施例和非实施例特征集。
一个或多个项在附图中以虚线形式示出,或者在括号内列出,以强调它们不一定是所示操作环境的一部分或所有实施例的一部分,而是可以与操作环境中的项或本文中讨论的一些实施例互操作。在任何附图或任何实施例中,并不必然要求非虚线或括号形式的项是必需的。特别是,图1是为了方便起见而提供的;在图1中包括项并不表示该项或该项的所描述的用途是在本发明之前已知的。
调试环境
图2示出了实时过程调试环境,其是操作环境100的一个示例。调试器200包含各种组件,很多组件未在这里示出,因为很多是众所周知的。如本文中教导的执行控制的主要用途可以是在其中实时过程调试不可行或至少不被期望的环境中。尽管如此,仍针对上下文以及因为它可以与利用本文教导的执行控制的基于跟踪的调试组合而示出了实时过程调试。
调试器200可以是传统调试器,或者可以被适配于执行本文中教导的执行控制。所示的调试器包括数据访问组件208(DAC)。在该实时调试1428环境中,通过使用对运行时的主请求214和来自运行时的主响应216,DAC 208与调试对象过程202的运行时204通信,以获取状态信息206。然后,调试器相应地更新其用户界面210。用户界面在相对高级别(例如就在源代码212中定义的工件方面)处呈现状态信息。然而,本领域技术人员将理解,如本文中教导的执行控制不需要DAC 208或其他适配器。
图3示出了转储调试环境,其是操作环境100的另一示例。调试器200使用其数据访问组件208或功能性相似的代码从转储文件302或快照304或这两者读取存储器内容以及在调试对象的执行中的特定时间点的其他状态信息。
图4示出了基于跟踪的调试环境,其是操作环境100的另一示例。所示的调试器200与技术性适配配合使用或包括(因为调试器的范围可以例如由给定开发者定义为包括重放适配器408)技术性适配,该技术性适配准许调试器或多或少地与跟踪418交互,就如同调试器正在与运行时交互一样。例如,在该示例中,相同的格式可以被用于在图2的实时过程调试环境中使用的主请求214和主响应216。然而,基于跟踪的调试1428可以为开发者提供比实时过程调试少的灵活性,因为通过运行时可访问的变量和其他存储器内容不一定是从跟踪可读取的。利用熟悉的基于跟踪的调试器的执行控制粒度也可以大于通过本文所提供的教导可获取的粒度。更精细的粒度可以在调试期间提供更好的控制,从而可以加快缺陷位置标识和对缺陷的理解。
具有合适的执行控制402代码、重放代码406、以及跟踪数据与源代码212之间的映射404的基于跟踪的调试可以以所跟踪的执行的反向重放的形式来支持反向执行1422。相反,在实时调试中,调试对象通常不会反向执行。
所示的重放适配器408包括与调试器的接口410,在该示例中,该接口向调试器呈现API,该API与由运行时204呈现给传统调试器的API的至少子集相匹配,以支持实时过程调试1428。其他实现方法也是可能的。而且,如图4中的重放适配器408周围的虚线所示,在一些实现中,一些或全部重放适配器可以被认为是调试器200的一部分,因为调试器是包含利用一个或多个跨级别映射404的代码的适配调试器200。例如,与使用外部消息相反,一个变型将主请求214和主响应216以及接口410实施为调试器内的函数调用、返回以及接口。在一些变型中,调试器包含并且利用跨级别映射404,并且不存在单独的重放适配器408。调试器DAC 208可以用于将地址448映射到高级别对象512。调试器跨级别映射404及其相关联的代码(即,执行控制器402、重放组件406和重放适配器408中的一个或多个)可以用于将源代码语句218或表达式220或这两者映射到特定本机指令434或本机指令组822。在一些实施例中,类似于转储调试,DAC208具有运行时的内部知识,并且可以读取运行时数据结构以确定JIT原始代码对于给定的IL指令的集合被定位于何处。在其上运行调试对象的机器架构可以与在其上运行调试器的机器架构显著不同,但是DAC可以被设计为读取运行时的数据结构并且处理硬件/运行时差异。
图4以机器级别请求414和响应416的形式示出了重放组件406与跟踪418之间的通信。这是一种可能的实现,作为示例,其可以使用跟踪读取器(未示出)来接收并且响应于请求。然而,在另一种实现中,机器级别请求414和响应416采用重放适配器408内的函数调用的形式,其中包括从跟踪418读取并且传递回在跟踪中找到的其调用者信息的函数,因此,重放组件可以维持当前状态信息,诸如由当前指令指针704标识的跟踪418中的哪个位置。
如图所示,跟踪418可以被存储在一个或多个文件420中,并且可以包括各种类型的跟踪数据、以及支持或界定对跟踪数据的搜索的元数据。跟踪418的部分或全部也可以驻留在RAM中。跟踪数据的一些示例包括精确到位的跟踪数据422(诸如低级别指令及其操作数(也称为“本机指令”)的副本)、可以用于使跟踪数据项相对于彼此而排序的时间码424、存储器快照304或转储302、到原始跟踪数据中的索引430、以所指明的间隔被插入到原始跟踪数据中的关键帧432、由调试对象在跟踪期间执行1422的代码434的副本、堆栈活动436、由调试对象在跟踪时读取或写入的数据流438、以每个核心440或每个插槽(多个核心)442为基础的处理器活动、在跟踪时的线程活动444、在跟踪时的寄存器读取和写入446、将存储器地址448与指令450和一个或多个值452以及可选地还与时间码424相关联的元组456、以及在跟踪中捕获的其他454读取或写入或值或操作码。在一些实施例中,项216、422、434、436、438、440、442、444、446、456中的任何一个项的实例都符合跟踪“条目”458。在一些中,本身表示所跟踪的程序的状态改变的跟踪数据454的任何最小部分符合跟踪“条目”458。跟踪中缺少一些数据也可以被认为是状态信息,例如时间码序列中的间隙428。
图5示出了根据本文中的教导的可以被跟踪并且因此受制于值或分配状态的变化的各种存储器112,值或分配状态的变化在执行1422控制下由本机指令的执行来进行。所示的存储器单元502的示例包括堆栈504(包括诸如其基地址506和所分配的堆栈帧508的数据)、诸如对象512的堆内容510、或诸如垃圾收集数据的元数据、高速缓存514、处理器寄存器516、诸如属性518的对象成员、ROM 520或RAM 524中的可寻址单元、可移动或第三层存储器522、本地存储器526和全局存储器528。存储器单元可以具有一个或多个特性530,特性530增加或减少存储器单元的可访问性,例如,存储器可以在内核空间中、可以被共享、可以进行DMA、等等。
图6示出了机器级别请求414的内容。如上所述,这些请求可以使用通信数据结构而被实施,或者他们可以被实施为例程的参数。机器级别请求414中的内容的一些示例是存储器单元规定602和一个或多个执行时间点616的规定608。存储器单元502可以被指明为例如单个地址448、地址的范围606、或者寄存器名称604。时间码424可以被指明为例如指令计数610或者系统时钟值612,并且该规定可以针对单个特定执行时间点616(跟踪期间的点,或特定本机指令)或执行时间的范围614(即,跟踪期间的执行1422时间的跨度或期间或间隔,或者一组连续本机指令)。
图7示出了机器级别请求响应416的内容。如上所述,这些请求响应可以使用通信数据结构而被实施,或者他们可以被实施为例程的函数返回值或副作用。机器级别请求响应416中的内容的一些示例是:针对在对应的请求414中所指明的一个或多个存储器单元的值702;指示接下来哪个指令将执行(或哪个指令刚刚完成执行1422)的指令指针704;以及状态码706,其包含例如与指令、或者错误、或者条件(诸如文件结束符(end-of-file))相关联的标志。每个线程可以具有相应指令指针704。
一些跟踪重放执行控制系统
图8示出了跟踪重放执行控制系统800,每个跟踪重放控制系统800是根据本文中提供的执行教导而配置的系统102。如果执行控制系统在实时调试环境中操作,则它包含具有可调用运行时204的调试对象程序124。尽管以调试为例,但是执行控制也可以如本文中在其他上下文中所教导的那样执行,例如,用于性能分析或软件运行状况监测。调试对象或其他被重放的程序包括一个或多个过程802,每个过程可以包括一个或多个线程804。本领域技术人员可以理解,术语“过程”和“线程”以不同的方式被使用,例如有时用作彼此的同义词,有时具有不同的含义。无论哪种方式,都可以应用本文中提供的执行控制教导,因为在“过程”和“线程”这两个含义的任何一个含义下,过程802和线程804都具有对应的源代码212和对应的所跟踪的指令434。
无论重放执行是否在实时调试环境中进行,都随着重放执行“进行”来维护和更新被重放的程序的状态信息。从这个意义上讲,进行操作包括向前执行、向后执行或这两者。状态信息包括例如指示跟踪418中的(多个)执行时间点的一个或多个指令指针值、以及在跟踪418中所捕获的所跟踪的程序变量值变化。为了指示状态信息的存在,针对(多个)过程802的框在图8中在调试对象程序124框内部以实线而不是虚线示出。然而,本领域技术人员将认识到,状态信息也可以被维持在执行控制器402内部或系统800中的一个或多个其他位置处。
执行控制器402本身包括使用处理器110和存储器112所执行的软件。所跟踪的程序124是具有源代码212和元数据808的其他软件。执行控制器402使用源中间映射810在源代码212与该源代码的中间表示826之间进行映射。执行控制器402还使用中间本机映射812在中间表示826与跟踪418(包括从跟踪收集的本机指令的记录814)之间进行映射。这些映射810、812在本文中统称为“跨级别映射”。注意,一个给定实施例可以包括一个或多个跨级别映射404,例如,可以将源到中间和中间到本机的功能性集成到单个源到本机映射404中。
在一些情况下,例如在.NET语言的情况下,由编译器创建源到IL映射810。然而,可以直接执行源语言的运行时204是存在的;其中一个示例是
Figure BDA0002753400150000361
(甲骨文美国公司的商标)。在这种情况下,运行时本身会将语言编译为中间格式,并且同时创建源到IL映射。在与.NET语言类似的被管理语言的情况下,高级别语言编译器不执行IL本机映射;相反,运行时204中的JIT编译器这样做。编译为本机代码的编译器也不会进行IL本机映射。实际上,如果这样的编译器具有任何形式的IL,则很可能是该编译器的实现细节。在一些实施例中,执行控制利用由运行时生成的IL本机映射812。
一些实现从跟踪本机指令获取所生成的IL。例如,一些实现通过仿真模拟CPU来工作,并且使用本机指令来回放跟踪。在一些情况下,IL独身不是足以重新创建本机指令的信息。在一些中,本机指令本身不足以实现IL步进或IL断点。另外,本机指令与IL指令之间的映射被使用。一些实施例在不依赖于本机指令(甚至可能不存在于跟踪中)的情况下使用映射,以使用不依赖于了解本机指令的跟踪重放器来实现支持逐步通过IL代码的调试器。这样的实现可以通过在映射中所提供的范围或者通过所指明的项的任何连续或非连续收集来追踪指令指针。
关于跨级别映射的补充
为了进一步说明跨级别映射404,考虑以下示例:一些源代码212、用作中间表示826的一些对应中间语言代码的一部分、以及一些本机指令的一部分。由于专利局对专利文件中包含计算机代码的限制,并且由于示出一部分足以在本文中提供的其他信息和本领域普通技术人员知识的上下文中说明映射404,因此这里仅示出中间语言代码和本机指令的部分。
原始C#源代码:
Figure BDA0002753400150000371
样本源到IL映射。该样本是手工生成的。实际实现通常是人类不可读的。也就是说,源到IL映射通常将以二进制格式而不是文本格式被实施。尽管如此,下面的材料还是向本领域技术人员说明了源到IL映射功能性。映射不是一对一映射,源代码行的一些部分在IL代码中的不同位置结束。对于单个源程序,有很多正确生成的IL转换。
Figure BDA0002753400150000381
Figure BDA0002753400150000391
Figure BDA0002753400150000401
样本IL到本机映射。与源到IL映射一样,这是手工生成的,并且实现将作为数据结构存在,例如在运行时中。对于单个生成的IL,有很多正确生成的本机代码转换。由于JIT编译器可能会因特定于处理器的优化而增加复杂性,并且由于使用跟踪的程序的调试1428可能不会在同一处理器类型上执行(即,将应用不同的优化),因此不能简单地在IL上运行JIT并且不能确保与在跟踪418的生成期间运行的结果相同。在该示例中,IL以“IL”开头,并且本机被表示为<memory address><hexadecimal representation of native code><assembly mnemonic>。
IL_0000:nop
0334093F 90 nop
IL_0001:ldc.i4.0
IL_0002:stloc.0
IL_0003:br.s IL_003a
03340940 33 D2 xor edx,edx
03340942 89 55 C0 mov dword ptr[ebp-40h],edx
03340945 90 nop
03340946 E9 AD 00 00 00 jmp 033409F8
IL_0005:nop
0334094B 90 nop
IL_0006:ldarg.0
IL_0007:ldloc.0
IL_0008:ldelem.i4
IL_0009:stloc.1
0334094C 8B 45 C0 mov eax,dword ptr[ebp-40h]
0334094F 8B 55 C4 mov edx,dword ptr[ebp-3Ch]
03340952 3B 42 04 cmp eax,dword ptr[edx+4]
03340955 72 05 jb 0334095C
03340957 E8 84 1E 7A 70 call 73AE27E0
0334095C 8B 44 82 08 mov eax,dword ptr[edx+eax*4+8]
03340960 89 45 BC mov dword ptr[ebp-44h],eax
IL_000a:ldloc.0
IL_000b:ldc.i4.1
IL_000c:sub
IL_000d:stloc.2
03340963 8B 45 C0 mov eax,dword ptr[ebp-40h]
03340966 48 dec eax
03340967 89 45 B8 mov dword ptr[ebp-48h],eax
IL_0010:nop
0334096A 90 nop
IL_000e:br.s IL_001e
0334096B EB 34 jmp 033409A1
IL_0011:ldarg.0
IL_0012:ldloc.2
IL_0013:ldc.i4.1
IL_0014:add
IL_0015:ldarg.0
IL_0016:ldloc.2
IL_0017:ldelem.i4
IL_0018:stelem.i4
0334096E 8B 45 B8 mov eax,dword ptr[ebp-48h]
03340971 8B 55 C4 mov edx,dword ptr[ebp-3Ch]
03340974 3B 42 04 cmp eax,dword ptr[edx+4]
03340977 72 05 jb 0334097E
03340979 E8 62 1E 7A 70 call 73AE27EO
0334097E 8B 44 82 08 mov eax,dword ptr[edx+eax*4+8]
03340982 89 45 A8 mov dword ptr[ebp-58h],eax
03340985 8B 45 B8 mov eax,dword ptr[ebp-48h]
03340988 40 inc eax
03340989 8B 55 C4 mov edx,dword ptr[ebp-3Ch]
0334098C 3B 42 04 cmp eax,dword ptr[edx+4]
0334098F 72 05 jb 03340996
03340991 E8 4A 1E 7A 70 call 73AE27E0
03340996 8B 4D A8 mov ecx,dword ptr[ebp-58h]
03340999 89 4C 82 08 mov dword ptr[edx+eax*4+8],ecx
通常,存在内核120,并且在图8中明确示出了内核120,以帮助防止运行时204与内核120之间的混淆。本文所述的跨级别映射和执行控制假定在大多数(如果不是全部)配置中当执行被跟踪以创建跟踪418时存在运行时。
系统800和相关系统的附加方面
系统800的一些实施例包括用于动态地编译所跟踪的程序124的代码的JIT编译器816。执行控制的一些方面例如通过支持断点范围830来解决由JIT编译所创建的挑战,即使尚未由编译生成跨越断点的位置的本机代码,只要知道将包含所生成的代码的地址范围,上述断点范围830就允许断点被遇到。例如,断点范围830可以被指明为范围606或614,而个体断点828被指明为跟踪418中的特定单个位置。
继续参考图8,系统800的一些实施例包括调用818的返回地址820。例如,当执行其在反向执行中步进退出调用例程的反向步进退出执行控制操作时,可以使用该返回地址820。
一些实施例通过提供源代码语句或表达式与实现它们的所跟踪的指令之间的更精确的对应关系来提高执行控制的准确性。例如跟踪重放的一些熟悉的方法步进进入与给定源代码语句218或表达式220相对应的所跟踪的指令的中间,这可能造成混乱。本文所述的一些实施例肯定地定义了与给定源代码语句218或表达式220相对应的(例如,由编译而生成以实现)的一组822所跟踪的指令。然后,执行控制器设置指向该组822的边缘824处的位置的指令指针,而不是像以前那样在中间某处。哪个边缘824被选择可以取决于执行是向前重放还是向后重放,例如,选择第一向前边缘用于向前重放,并且选择第一向后边缘用于向后重放。备选地,可以始终使用相同的边缘,而不管重放方向如何,例如,始终将指令指针设置在第一向前边缘处。
图9示出了若干执行控制操作618。例如,由用户通过调试器接口210将控制操作请求806呈现给调试器200或其他工具122。执行控制器402将控制操作请求806转换为过程802的状态的变化。所示的操作包括向前步进902、向前步进进入904、向前步进跳过906、向前步进退出908、继续向前910、向后步进912、向后步进进入914、向后步进跳过916、向后步进退出918、继续向后920、设置断点范围922、以及设置断点924。在这些操作名称中,“向前”表示向前执行重放,并且“向后”表示向后执行重放。
各种步进操作902-920可以被实现,以便从开发者的角度来看,以与熟悉的相似或相同命名的操作相似或相同的方式操作。然而,例如,在内部,它们可以通过用于使用跨级别映射404、指令组822和特定断点放置将源代码与跟踪对准的创新来被实现。继续操作910、920也可以被实现,以便从开发者的角度来看,以与熟悉的继续操作相似或相同的方式操作,而在内部,它们利用跨级别映射404或指令组822或这两者。设置断点操作924也可以被实现,以便从开发者的角度来看,以与开发者设置断点的熟悉操作相似或相同的方式操作,而在内部,它利用跨级别映射404或指令组822或这两者。
图10示出了可以在给定跟踪418中被捕获的线程804活动信息444。示出了线程标识符1004、线程状态指示1006、线程的可执行代码1008、以及存储器单元502状态信息1010诸如线程局部变量及其标识符。
图11示出了中间表示826的一些示例。所示出的示例包括符号表1102,符号表1102将源代码标识符1104(变量名、函数名、对象成员和方法名等)与数据类型1106(例如整数、浮点、字符串、布尔值和用户定义的类型)相关联。另一示例是抽象语法树1108。其他一些示例包括以一种或多种中间语言1110编写的代码1112。更一般地,一些实施例使用中间表示826,该中间表示826共享由编译器创建的中间表示的结构或甚至是其副本。然而,中间表示826被放置在与编译器的上下文相反的执行控制器的上下文中。而且,中间表示826被用于先前生成的代码的执行跟踪418的跟踪重放,而不是首先用于生成该代码。
技术人员将认识到,给定源代码212可以潜在地用于生成对应的IL的很多不同版本。然而,这些版本中只有一个版本会在程序中被使用,并且由编译器发出的符号信息将与所发出的IL相对应。调试器可以被设计为仅加载对应的符号信息,因此将仅存在一个映射。在一些系统中,运行时可以包括针对给定例程的本机代码的多个版本,例如,用于调试的本机代码的优化生产版本和非优化版本可以都存在,或者多层JIT功能性可以提供存储器中的本机代码的多个版本。在这样的多本机版本系统中,重放仍然可以被完成。例如,当断点被设置时,其可以在本机代码的所有现存版本中被设置。一些实施例使用由JIT生成的本机代码以及IL代码,它们是从或经由跟踪418所获取的。一些实施例还使用对应的符号信息用于源/IL映射,该映射可以或可以不被包含在同一跟踪文件420中。
图12是图2的变型。在图12的环境中,实时调试和重放执行两者被支持。重放由滚动跟踪418支持,滚动跟踪418实时记录实时调试对象的向前执行,而调试对象按照调试器200的提示执行。为了提高效率,仅使用例如一对缓冲器来跟踪最新指令。跟踪418被写入一个缓冲器直到其满,然后再被写入另一缓冲器直到其满,然后再被写回第一缓冲器(覆写较早的跟踪),以此类推。备选地,代替滚动窗口,调试1428会话期间的所有执行活动可以被跟踪。作为另一替代,可以在实时调试会话期间访问先前所记录的跟踪418。
一些附加系统示例
本文中提供了示例以帮助说明技术的各个方面,但是本文档内给出的示例并未描述所有可能的实施例。实施例不限于本文中提供的特定实现、布置、显示、特征、方法或场景。给定实施例可以包括例如附加的或不同的技术特征、机制、序列或数据结构,并且可以以其他方式背离本文中提供的示例。
参考图1-2,一些实施例使用或提供跟踪重放执行控制系统800。该系统包括处理器110、与处理器可操作通信的存储器112、以及结合运行时204和内核120在程序124的执行期间被记录的跟踪418。跟踪包括由在程序的至少一个线程804中执行的本机代码指令116的记录814。还存在程序的至少一部分的源代码212。
系统800还包括在源代码与源代码的中间表示826之间进行映射的源中间映射810、以及在中间表示826与跟踪418之间进行映射的中间本机映射812。
系统800还包括软件工具122中的执行控制器402。执行控制器被配置为在利用处理器执行时响应于请求806而控制跟踪418的重放执行。在重放执行中,源代码通过源中间映射和中间本机映射与跟踪本机代码指令或其他跟踪条目相关联。
在一些实施例中,执行控制器402被配置为将针对至少以下操作618的请求转换为跟踪本机代码指令的对应执行:向前执行步进进入904操作、向前执行步进退出908操作、以及向前执行步进跳过906操作。
在一些实施例中,执行控制器402被配置为将针对至少以下操作618的请求转换为跟踪本机代码指令的对应执行:向后执行步进进入914操作、向后执行步进退出918操作、以及向后执行步进跳过916操作。
在一些实施例中,执行控制器402被配置为将针对至少以下操作618的请求转换为跟踪本机代码指令的对应执行:在跟踪中继续向前执行910直到断点范围830中的任何位置被到达,以及在跟踪中继续向后执行920直到断点范围内的位置被到达。
在一些实施例中,系统800被配置为步进进入源代码的一部分,源代码的一部分在重放执行期间尚未被编译为本机代码指令。
在一些实施例中,中间表示826包括以下至少一项:将在源代码中使用的至少两个标识符1104与数据类型1106相关联的符号表1102、从源代码的至少一部分导出的抽象语法树1108、或源代码212的至少一部分到中间语言1110的转换1112。
在一些实施例中,跟踪418不包含运行时204的任何执行实例,并且系统418未被配置为调用跟踪以执行特定于运行时的任何代码。
在一些实施例中,系统800包括具有运行时的可调用实例的程序124的实时过程202。在一些实施例中,跟踪418从实时过程被记录并且系统被配置为重放跟踪的执行。
在一些实施例中,系统800被配置为略过跟踪418的一部分的重放执行,因为执行控制器402将重放执行从跟踪的第一执行时间点移动到跟踪的第二执行时间点,而系统没有执行本会通过从第一位置到第二位置的继续执行而被执行的跟踪本机代码指令或其他跟踪条目。
本领域技术人员将理解,一些其他系统也在这里所呈现的教导的范围内。特别地,一些其他系统可以执行跨级别映射404、使用断点范围830、以及实现本文中提供的其他教导,同时背离本文中叙述的特定示例。使用这里教导的执行控制教导中的任何一个执行控制的系统或装置都在本公开内,无论它们是否在所提供的特定示例中。
一些方法示例
图13示出了执行控制方法1300,该执行控制方法1300是由执行控制器402、跨级别映射404或本文中讨论的其他项执行或辅助的方法的示例。该示例方法包括标识1302所跟踪的被管理程序为所跟踪的被管理程序。将程序标识为所跟踪的是简单的;如果程序正在被跟踪,或者之前已经被跟踪,则该程序是所跟踪的程序。在某种程度上更多地涉及将程序标识为被管理,因为当程序依赖于运行时204进行实时执行时其被管理并且运行时204可以在不同实现中提供不同的服务。在很多情况下,运行时204通过基于可达性分析或引用计数或其他机制的垃圾收集来提供堆存储器的自动管理。然而,在本申请中更令人感兴趣的是使用运行时204来执行中间语言代码1112。在一些运行时中,从源到本机指令的转换没有被模块化为源到中间语言阶段,随后是中间语言到本机代码阶段。例如,一些
Figure BDA0002753400150000481
平台直接执行源代码(甲骨文美国公司的商标)。仅出于本申请的目的,“被管理”程序是依赖于运行时204来产生本机指令的程序。被管理程序还可以受制于或者不受制于由运行时进行的垃圾收集。
所示的方法1300还包括接收1304对某个跟踪重放执行控制操作的请求。该请求可以是通过用户界面直接来自用户的请求806,或者是来自调试器的对跟踪重放层组件402、406或408的请求214。
所示的方法1300还包括从源代码到中间表示的映射1306和从中间表示到本机代码的映射1308。这可以如指示的在两个阶段中完成,或者在一些其他实施例中,可以在从源代码到本机指令的单个组合阶段中完成。然而,与编译本身不同,无论是在两个阶段中还是一个阶段中,映射1306、1308都不是为了生成用于执行的代码,而是使源代码位置与先前所生成和所执行的指令的跟踪中的位置相关联。
一些实现通过使用包含与源相对应的IL的哈希值、校验和或其他标识符的符号文件,来从源代码映射1306到中间表示。如果标识符对应,则调试器将加载符号文件。该符号文件还包含用于编译IL的每个源文件的标识符。在调试器将要加载源文件并且将IL代码映射到源之前,它将利用符号文件中所包含的标识符来验证源文件的标识符。
当IL被即时编译(JIT)时,一些实现使用由运行时生成的映射从IL映射1308到本机代码。在一些实现中,运行时可能不能保证保留关于JIT将如何发生的向后兼容性,因此可以随时自由地对JIT过程进行改变。在这样的实现中,调试器可能不能对由JIT过程输出的本机代码将包含什么进行假定。因此,调试器可以要求运行时提供本机代码与IL之间的映射。
所示的方法1300的一些变型包括将本机指令组与源代码语句或表达式对准1318,这些本机指令是通过编译从这些源代码语句或表达式被生成的。
所示的方法1300包括控制1310重放,也就是完成“执行控制”。控制1310的一个示例正在执行1312与步进、步进进入、步进跳过、步进退出或继续操作相对应的本机指令或其他跟踪条目,从而更改过程802状态。控制1310的另一示例是设置1314个体断点或断点范围。本领域技术人员将认识到,执行步进、步进进入、步进跳过、或者步进退出操作涉及设置断点,但是也能够在不执行本机指令或其他跟踪条目的情况下设置断点,例如,为继续操作做准备时。在一些实施例中,代码本身未被修改为在跟踪中设置断点。技术人员会认识到,处理器可以经由指令(例如,一些Intel架构中的int3)或经由硬件断点(说了要监测哪个地址的寄存器)来设置执行断点。在一些实施例中,重放引擎800提供类似的能力。一些实现不修改代码流,并且支持任意大数目的断点。
最后,所示的方法1300包括发送1316对请求的响应,诸如响应416或者包含指令指针704或状态码706的另一消息或数据结构。
图14示出了在一些实施例中可以执行的一些附加的执行控制步骤。一些熟悉的调试器不支持向后步进退出操作918。然而,一些实施例标识1402对向后步进退出操作918的请求,并且如本文中教导的那样实现该操作。
调试器可以实现一些通常熟悉的断点操作,即,用于设置1314断点的操作。然而,一些实施例在所指明的位置之前紧接设置1314、1404断点。一些实施例在指令组边缘824处设置1314、1406断点。一些实施例在例如被指定用于接收被即时编译的代码(由JIT编译器生成的代码)的地址范围上设置1314、1408断点范围830。特别地,一些实施例设置1434、1314、1408大断点范围1436、830。一些实施例设置1314、1410断点作为实现步进跳过操作的一部分,以步进跳过开发者可能不太感兴趣的运行时例程。例如,这样的运行时例程可以执行垃圾收集、JIT编译、反恶意软件或其他安全检查、或者运行时204管家功能。图14所示的其他步骤在本文中其他地方讨论,或者为了完整性而被包括在内,例如,不仅可以设置断点,还可以清除1442断点。
除非另外指出,否则附图中示出或以其他方式公开的技术方法将由例如系统800自动地执行。在牵涉到人类管理员或其他人类的动作的范围内,方法也可以部分自动地和部分手动地执行,例如,人可以选择1426源代码语句或表达式,然后使用工具122用户界面来请求步进操作或断点操作。然而,这里没有考虑作为创新的方法是完全手动的。在一个给定实施例中,方法的零个或更多个示例步骤可以被重复,可能具有不同的参数或要操作的数据。一个实施例中的步骤也可以以与图中所示不同的顺序进行。步骤可以顺序地、以部分重叠的方式或完全并行地执行。在给定方法期间执行步骤的顺序可以从一种方法的执行到另一种方法的执行而变化。如果所执行的方法是可操作的并且符合至少一项权利要求,则步骤也可以被省略、组合、重命名、重新分组、或以其他方式偏离所示出的流程。
一些实施例使用或提供用于跟踪重放执行控制方法的计算机实现的方法。一个示例方法包括标识1302所跟踪的被管理程序,即被配置为结合对运行时的调用来执行、并且被配置为要被跟踪的程序。该示例还包括在计算系统上运行的软件工具中接收1304跟踪重放执行控制请求。基于跟踪重放执行控制请求,该示例方法在所跟踪的被管理程序的源代码与源代码的中间表示之间自动地进行映射1306,并且在中间表示与跟踪418之间自动地进行映射1308。跟踪包括当所跟踪的被管理程序被执行时被跟踪的本机代码指令的记录。跟踪418不包括运行时的任何执行实例。该示例方法还执行1312与跟踪重放执行控制请求相对应的跟踪本机代码指令,从而重放跟踪的一部分。
在一些实施例中,跟踪重放执行控制请求标识1402向后执行步进退出操作,以步进退出例程,并且该方法包括在跟踪本机代码指令上设置1314、1404断点,该断点具有紧接在对例程的调用的返回地址的位置之前的位置。出于该方法的目的,当在跟踪的向前执行期间在B之前遇到1412A并且A与B之间存在至多五个跟踪本机代码指令时,在跟踪中位置A“紧接”在位置B“之前”。出于该方法的目的,当执行源级别的调试时,对准1318可以将指令组边缘824与在调用当前函数之前所执行的最近执行的源文件行号、语句或表达式相关联。一些实施例在例程的调用位置处设置断点,例如,一些实施例在当前函数的调用位置处设置断点。
通常,源代码包含语句218和表达式220。在一些实施例中,该方法包括在跟踪本机代码指令116上设置1406、1314断点,该断点在包括全部跟踪本机代码指令的组822边缘824上,全部跟踪本机代码指令由该方法映射到源代码中的给定语句或给定表达式。在一些实现中,该组仅包含全部跟踪本机代码指令,并且还可以包含其他指令。
在一些实施例中,所接收的跟踪重放执行控制请求806、214、414根据以下之一来命名、标识或以其他方式调用重放性能:向前执行步进跳过906操作,以向前步进跳过例程;向后执行步进跳过916操作,以向后步进跳过例程;向前执行步进进入904操作,以向前步进进入例程;或者向后执行步进进入914操作,以向后步进进入例程。
在一些情况下,所接收的跟踪重放执行控制请求806、214、414根据向前执行步进进入904操作来命名、标识或以其他方式调用重放性能,以步进进入用户代码例程,并且用户代码例程的重放执行包括对运行时204例程的至少一个调用818的重放执行,并且对运行时例程的调用在源代码中没有对应的调用语句或调用表达式。在该上下文中,一些实施例包括以下至少一项:设置1408指明被指定为接收动态编译代码的整个存储器范围的断点范围,或者设置1410断点,以对运行时例程的调用执行步进跳过操作。
在一些实施例中,向前步进进入步骤904操作如下进行。根据本文中的教导配置的调试器200将源行范围映射1306到中间语言范围,并且将中间语言范围映射1308到本机范围。然后,调试器使用低级别原语执行该步骤;这可以使用指令级别单步步进或断点来完成。当遇到调用818指令时,调试器确定目标是在源级别表示步进进入的高级别源步骤,还是不应当步进进入的运行时实现的明细,因为在源代码中未明确表示。例如,这个确定可以通过查询运行时或通过在源代码中搜索调用例程的名称来完成。如果调用是针对不同的高级别(在源代码中示出)例程,则调试器查询运行时204(例如,经由DAC 208)以确定调用例程是否已经被JIT编译。如果调用例程已经被JIT编译,则调试器使用指令级别单步步进进入调用或通过在目标例程内部设置断点来对调用执行步进进入904。如果尚未对调用例程进行JIT编译,则调试器将使用DAC 208或另一机制在JIT编译器上或在使用(多个)数据断点的JIT编译写入的目标地址区域上设置断点。调试器允许运行跟踪重放,直到JIT编译完成。调试器在JIT编译目标上设置断点并且运行。这样继续直到本机指令不再落入上述从初始动作映射的本机步进范围内,或者程序退出。例外是一种应当落在捕获(catch)的目标上的特殊情况。
在一些实施例中,跟踪重放执行控制请求调用以下操作至少之一:在跟踪中向前910继续跟踪重放执行,直到到达断点828;在跟踪中向前910继续跟踪重放执行,直到到达断点范围830中的位置;在跟踪中向后920继续跟踪重放执行,直到到达断点828;或在跟踪中向后920继续跟踪重放执行,直到到达断点范围830中的位置。一些实施例还包括可能在请求中被调用的其他操作,包括例如以下中的一个或多个:向后执行步进进入914操作;向后执行步进退出918操作;向后执行步进跳过916操作;向前执行步进进入904操作;向前执行步进退出908操作;向前执行步进跳过906操作。更一般地,一个给定实施例可以限于本文中教导的操作的任何子集。
在一些情况下,在执行所跟踪的被管理程序以创建跟踪418的期间,断点的最大数目受到处理器能够一次监测至多N个地址这一硬件断点约束的约束。然而,在一些实施例中,该方法在跟踪的重放执行期间设置1314多于N个断点,从而超出1414硬件断点约束。
本领域技术人员将理解,其他方法也在这里所呈现的教导的范围内。特别地,其他系统可以执行跨级别映射404、使用断点范围830、以及实现本文中提供的其他教导,同时背离本文中叙述的特定示例。使用这里教导的任何执行控制教导的方法都在本公开内,而无论它们是否在所提供的特定示例中。
一些配置的介质示例
一些实施例包括所配置的计算机可读存储介质112。介质112可以包括磁盘(磁性的、光学的或以其他方式)、RAM、EEPROMS或其他ROM和/或其他可配置的存储器,尤其包括计算机可读介质(其不仅仅是传播信号或能量)。被配置的存储介质尤其可以是可移动存储介质114,诸如CD、DVD或闪存。通用存储器(可以是可移动的或不可移动的,并且可以是易失性的或非易失性的)可以被配置为如下实施例:以从可移动介质114和/或诸如网络连接的另一源读取的数据118和指令116的形式使用诸如执行控制器402、重放适配器408、指令组822、跨级别映射404、机器级别请求414和响应416以及断点范围830的项,以形成所配置的介质。如本文中公开的,所配置的介质112能够引起计算机系统执行技术性处理步骤以供进行水平交叉(工具122中的高级别到跟踪418中的低级别)重放执行控制。因此,附图帮助说明所配置的存储介质实施例和过程实施例、以及系统和过程实施例。特别地,图4、13或14或本文中另外教导的任何处理步骤可以用于帮助将存储介质配置为形成所配置的介质实施例。
一些实施例使用或提供配置有代码的计算机可读存储介质112、114,该代码在由计算机处理器110执行时执行跟踪重放执行控制方法。在该示例中,跟踪重放执行控制方法包括接收1304在计算系统上运行的软件工具中的跟踪重放执行控制请求。该方法包括基于跟踪重放执行控制请求,在所跟踪的被管理程序的源代码与源代码的中间表示之间进行映射1306,并且在中间表示与跟踪418之间进行映射1308。跟踪418包括处理器活动的记录,处理器活动诸如当所跟踪的被管理程序被执行时被跟踪的本机代码指令,因为跟踪不包括运行时的任何执行实例。在该示例中,跟踪重放执行控制方法还包括执行1312与跟踪重放执行控制请求相对应的跟踪本机代码指令或其他跟踪条目,或者在跟踪本机代码指令上设置1314断点,从而控制1310跟踪的重放。
一些实施例与调试器代码200相组合操作,并且在这些情况中的一些情况下,所跟踪的被管理程序包括实时过程和执行运行时204。在没有1416终止1418所跟踪的被管理程序的情况下,调试器代码200与所跟踪的被管理程序的执行运行时204通信,并且该方法使用跟踪418控制1310向后执行重放。也就是说,在该示例中,反向调试与实时过程调试交织。
一些实施例执行特别感兴趣的以下活动中的一个或两个或三个或全部四个。一个特别有趣的活动是使用跟踪418中的机器级别信息在高级别控制1420运行时204的执行。在该上下文中,“在高级别”控制是指基于用户选择1426来控制(通过用户界面从用户104获取1424),该用户选择1426指明源代码中的标识符或语句或表达式。在该上下文中,“机器级别”信息是指特定于处理器架构的信息,例如特定指令集合或特定微架构。
另一特别有趣的活动是调试200所跟踪的被管理程序的过程202、802的向前执行和向后执行两者。
另一特别有趣的活动是至少部分通过设置1434大断点范围1436来步进进入源代码中所示的调用。在这种情况下,当断点范围涵盖跟踪418中的至少一千个连续地址或指令时,断点范围是“大”的。
另一特别有趣的活动是在调试200所跟踪的被管理程序的实时过程202的同时,记录418来自实时过程的跟踪数据,并且然后使用所记录的跟踪数据中的至少一些跟踪数据对实时过程执行反向执行调试。
本领域技术人员将理解,其他配置的介质实施例也在本发明的教导范围内。特别地,一些其他实施例可以包括配置有用于在执行时执行跨级别映射404、使用断点范围830以及实现本文中提供的其他教导的代码的法定介质,同时背离本文中叙述的特定示例。被配置为使用这里教导的任何执行控制教导来执行方法的介质都在本公开内,而不管它们是否在所提供的特定示例中。
具有JIT代码的示例
假定源代码包括类似于如下所示的C#中的类的类:
Figure BDA0002753400150000561
如果将语言用作C++,则开发者将合理地期望Squid.Swim()中对WiggleLeg()的调用可以编译为以下形式(类似于汇编代码):
CALL 0x0c84fabd;0x0c84fabd是Squid::WiggleLeg()的地址
在这种情况下,0x0c84fabd将开始Squid::WiggleLeg()的实现。但是在运行时204中执行的被管理软件中,不是这样的。运行时204运行的代码被“及时”编译,又称“jit”。如果这是第一次调用Squid::WiggleLeg(),则将没有针对Squid::WiggleLeg()的机器指令116。它尚未被编译。因此,与其让机器指令实现Squid::WiggleLeg(),不如让0x0c84fabd具有一些看起来像这样的指令(以伪代码形式):
Figure BDA0002753400150000571
这一点代码称为“预桩”。编译过程是漫长且复杂的,因此通常,试图通过跟踪应用并且使用跟踪来分析或调试应用的开发者不想详细记录编译过程。然而,跟踪418可能会记录该桩的至少一部分,即使这些所跟踪的指令都可能不会引起调试代码的人员的兴趣。在实时过程调试中,运行时通常会略过代码的这部分。然而,当仅从跟踪418进行调试时,调试对象的运行时204不会执行,因此不能略过预桩。相反,一个实施例可以利用通常用于读取转储302中的数据的过程外调试实用(out-of-process debugging utility)的功能性、以及可以一起用于在运行时中找到全部JITTED代码的地址范围的创新的跟踪重放功能性。在接收到步进进入方法调用的请求之后,一个实施例可以在JITTED代码范围上暂时设置1314断点,并且虚拟地向前执行(即,向前重放),直到第一JITTED代码范围被读取。一旦被读取,实施例就可以去除断点。这样,开发者可以略过所有这些不感兴趣的“桩”代码。一些实施例还通过将断点的地址范围瞄准(target)为仅是Squid::WiggleLeg_implementation的范围来优化该方法。
一些附加的组合和变型
代码、数据结构、逻辑、组件、通信和/或其功能等价物的这些组合中的任何组合也可以与上述任何系统及其变型组合。过程可以以可操作的任何子集或组合或序列包括本文中描述的任何步骤。每个变型可以单独出现,或者与其他任何一个或多个其他变型组合出现。每个变型可以与任何过程一起出现,并且每个过程可以与任何一个或多个其他过程组合。每个过程或过程组合(包括变型)可以与上述介质组合和变型中的任何一个组合。
在一些实施例中,跟踪重放组件使用源-IL映射和IL-机器映射在跟踪文件420位置(例如,由时间码424所指明)和源代码212中的位置(例如,指明为行号)之间转换。
在一些实施例中,在跟踪重放组件406中提供了运行时功能性的一部分。但是,运行时不是像在图2的实时过程中那样在调试器、用户代码和操作系统之间中介,而是该运行时功能性在调试器与(多个)跟踪文件420之间进中介。
一些跟踪记录过程仅记录两种数据。所记录的一种数据是代码指令116的执行,这些代码指令有可能在多个线程上并行执行。所记录的另一种数据是在执行时间的离散点处拍摄的存储器的特定块的快照304,例如以捕获堆栈的一部分。然而,其他跟踪过程会记录不同或附加类型的数据,如图4所示。在一些情况下,跟踪包含所有记录指令及其所有输入和输出的有效表示。通过依赖于(多个)处理器110的确定性并且主要记录基于该确定性不能推断的信息以及已经记录在跟踪418中的信息,可以使跟踪418的记录高效地进行。在一些实现中,大部分跟踪418是数据,而不是所执行的代码指令;这样的数据通常是不确定的。跟踪可以主要是种子数据加上不确定信息。在一些情况下,仅将进入被跟踪的(多个)处理器的高速缓存的信息记录到跟踪418中,例如,将值V读入处理器高速缓存被输入到跟踪中,但是从处理器的寄存器向存储器位置X写入值V不一定被输入到跟踪中。如果对X的写操作在所跟踪的程序的行为方面有所不同,那是因为在某个时刻,写入值从X返回到处理器寄存器,此时,如果跟踪仍被启用,则在跟踪418中的条目可以被实现。
在此使用示例、图示、定义和其他描述性材料描述了来自过程跟踪的高级别程序的执行控制。技术人员会认识到,可以使用各种技术在机器级别创建过程的跟踪,各种技术诸如在运行Microsoft
Figure BDA0002753400150000591
环境的系统上进行跟踪的Windows事件跟踪(ETW)或“时间旅行跟踪”、在运行
Figure BDA0002753400150000592
环境的系统上进行跟踪的
Figure BDA0002753400150000593
(分别为Efficios公司和Linus Torvalds的商标)、针对类似
Figure BDA0002753400150000594
环境进行跟踪的
Figure BDA0002753400150000595
(分别为甲骨文美国公司和X/Open公司的商标)、以及其他跟踪技术。然后可以使用硬件的仿真模拟来重放跟踪。有时,该过程是用高级别语言编写的,该语言需要运行时框架才能实际执行该过程。其一个示例是在公共语言运行库(CLR)中运行的.NET应用。在跟踪中向前或向后移动这本身对高级别程序的开发者没有帮助,因为跟踪的视图是运行时或即时编译的代码的视图而不是高级别程序的视图。本文档介绍了一种将跟踪中的机器级别指令映射到程序中高级别操作的方法。这允许设置和达到断点以及高级别语言中的向前和反向步进。
可以通过将复杂度抽象为三层来实现在高级别运行时中步进通过代码的过程。在最低层(第0层)是过程跟踪418。该跟踪包含足够的信息以允许在硬件级别仿真模拟所记录的过程执行。
在第1层,适当配置的系统可以应用一些非常基本的硬件调试支持来重放跟踪。这种支持可以包括:能够向前或向后播放过程、读取过程存储器、读取线程上下文(每个线程的)、设置硬件断点以及每个线程的单步步进机器指令。
在第2层,提供了用于将机器指令的范围映射到高级别虚拟机(VM)指令的范围或另一种代码的支持。第1层中的操作可以用于调试高级别代码。在一些配置中,要支持的操作是向前运行、向后运行、设置断点、步进进入、步进退出、以及步进跳过。在示例中,以下给出关于每个操作的实现的细节。
关于向前和向后运行,在该示例中,它们在高级别和机器级别运行时中是等效的,因此这完全在第1层中进行处理。
关于断点,在该示例中,通过使用在层2中定义的映射来设置断点,以将高级别断点映射到硬件断点。当遇到硬件断点时,实现可以使用该映射将该硬件断点映射回高级别断点。
关于向前和反向步进退出,通过使用堆栈跟踪,实现可以在函数的返回地址处设置硬件断点。为了实现反向步进退出,断点被设置在返回地址之前的指令上。
关于向前和反向步进跳过,可以通过查看要执行的下一指令来实现步进跳过。依赖于指令,实现可以使用第1层来或者执行单步步进或者设置断点并且运行直到其被达到。“调用”指令是需要断点的指令的示例。大多数其他指令可以使用单步步进。与一些熟悉的方法不同,该示例调试器实现可以使用第2层中的映射来重复步进操作,直到指令指针或代码执行时间点位于高级别运行时中的适当停止点处。这激发了本文中其他地方对指令组822的讨论。
关于反向步进进入,为了执行反向步进进入,该实现使用在层1中定义的单步步进操作。如果机器刚从调用指令返回,则该使用将把执行时间点返回到前一调用的返回指令。如果机器不是刚从调用返回,则机器将简单地退回到前一指令。与步进跳过一样,实现可以使用第2层中的映射来知道执行何时在停止点处,并且可能需要单步步进多几次才能执行跟踪与源代码的对准1318。
关于向前步进进入,在这种实现中,向前步进进入与反向步进进入相似。然而,如果高级别运行时需要执行与正在运行的高级别代码不直接相关的工作,则可能会出现困难。一些示例是实时编译、运行时内务处理、以及需要由运行时进行某种解决的步进操作(.NET中的透明代理是该解决挑战的一个示例)。可以实现以下中的任一个或全部以解决这些困难。一个选项是在开始步进进入时为所有经即时编译的代码设置很大的断点范围。如果在步进进入之后遇到该断点,则实现可以在到达下一停止点时完成该步骤。另一选项是在步进引擎中实现逻辑以充分理解运行时,从而知道何时要步进跳过调用以及何时要单步步进通过调用,使得实现可以在高级别运行时中的适当点处停止步进。
在一些实施例中,过程外执行控制通过使用例如由重放组件406提供的功能和IL到地址映射812来控制IL指令的执行。用于执行控制的重放组件406或其他重放层组件402、408提供的功能包括:
获取所有线程的状态(寄存器值)
向前或向后步进一条指令
向前或向后运行,直到指令指针到达所指明的地址集。
IL到地址映射存在于过程或跟踪的存储器图像中,并且重放层可以将其提供给过程外执行控制调试器。一种观点认为,该示例包括将IL级别的调试转换为机器级别的调试。
通过步进个体指令,或者在跟踪中向前和向后运行直到到达特定指令地址,一些实现支持使用源到IL映射810、IL到本机映射812、本机样式的过程外执行控制、以及在跟踪418中向前和反向行进的能力,来将高级别执行控制应用于跟踪。
考虑鉴于实时过程调试的示例
作为基于跟踪的执行控制的进一步说明,考虑特定实施例可以类似于实时调试或不同于实时调试的一些方式。以下引用了几个组件,并且本领域技术人员将理解它们与本文中提供的其他示例的关系,并且特别地理解,为了理解或易于实现,可以将功能分组为不同的组件,而不必背离本文中提供的执行控制教导。本示例中讨论的系统800组件包括:
用户界面(UI)。用户界面,其以图形方式向用户显示调试器的程序状态的表示。程序状态的示例是线程的列表、要在每个线程上执行的下一行源代码、针对每个线程的调用栈、调用栈的每一帧中的变量的集合、这些变量的值等。
源转换。源代码转换部分,其负责在运行时抽象与源代码级别抽象之间进行转换。例如,CLR运行时使用以二进制文件格式编码的IL指令来表示代码,而C#源代码具有文本语句的语法。作为一个示例,调试器的这一层可以在运行时的抽象层(例如,在ECMA-335标准中,通用语言架构(CLI)第6版(2012年6月)或其后续版本中定义的)与C#抽象层(例如,在C#语言规定版本5.0或其后续版本中定义)之间进行转换。
运行时转换。调试器的运行时转换部分负责在低级别概念(诸如存储器和寄存器)与运行时抽象之间进行转换。运行时抽象的示例包括线程的列表、针对每个线程的调用栈、以及接下来将要被执行的IL指令。注意,抽象的运行时层处的调用栈不必与抽象的源代码级别处的调用栈相同。仅在实时调试的情况下,为了协助完成一些任务,该层使用过程间通信机制来请求正在被调试的过程内的运行时执行工作。例如,为了在偏移为28的方法Foo中的IL指令处设置断点,该层将向运行时发送消息以要求其在偏移为28的Foo处设置断点。然后,运行时内的线程将接收该消息,将Foo IL偏移28转换为驻留于存储器地址0x4567123512395处的机器指令,然后在该位置写入断点指令。可以合理地将服务于那些请求的运行时的部分视为在功能上也位于调试器的这一层内,即使它是在不同的过程中实现的。
基础。调试器的低级别部分负责使用内核、或者转储文件、或者跟踪来产生将由运行时转换部分读取的存储器和寄存器。对于内核过程,这在一些环境中是通过API(诸如ReadProcessMemory)实现的。对于跟踪文件,它支持解析文件并且在时间t和当时所记录的一些存储器和寄存器内容的集合之间建立映射。
考虑到这些组件,考虑设置断点并且向前执行程序直到到达断点的情况。一种观点认为,实时过程调试大致涉及以下动作。
动作1.用户界面。用户在显示的源代码行上单击鼠标,以指示应当在何处设置断点。
动作2.源转换。源代码行被转换为特定方法和IL指令偏移。
动作3.运行时转换。将消息发送到运行时,然后在运行时内,方法+IL指令偏移被转换为存储器地址。然后,断点操作码被写入该处。
动作4.用户界面。用户单击UI中的按钮,指示他们希望过程运行。
动作5.源转换。转发要运行的请求。
动作6.运行时转换。消息被发送到运行时204,请求其向前执行。在接收到消息时,运行时将向前执行,然后到达早前设置的特定存储器地址处的断点。断点的存储器地址被转换回方法和IL偏移,然后通知消息被发送回调试器,指示已经达到特定方法/IL偏移的断点。
动作7.源转换。到达断点的消息从方法和IL偏移被转换回源行,并且继续向UI发送关于该源行处的断点被到达的通知。
动作8.用户界面。UI请求有关过程的新状态的其他信息,使得它可以向用户显示当前状态信息,诸如针对每个线程的当前调用栈。
动作9.源转换。为了提供调用栈的源抽象,该组件首先请求接收调用栈的运行时抽象。
动作10.运行时转换。为了提供调用栈的运行时抽象,该组件首先请求接收存储器和寄存器的状态。
动作11.基础。确定当前时间处的存储器和寄存器。
动作12.运行时转换。使用存储器和寄存器,计算调用栈的运行时抽象。
动作13.源转换。使用调用栈的运行时抽象,计算调用栈的源代码抽象。
动作14.用户界面。使用调用栈的源代码抽象,UI现在可以向用户显示被调试的过程的当前状态。
在一些实施例中,当使用跟踪动作3、6和11时,不再以相同的方式操作。对于动作3和6,没有过程可以接收消息以设置断点、以向前执行、或者以当断点被到达时发送回通知。对于动作11,没有过程可以使用内核API来查询以确定存储器或寄存器。
因此,在一些实施例中,为了实现上述动作3,源转换代码要求运行时转换代码指示哪个存储器地址X具有针对应当在该处设置断点的给定方法+IL偏移的机器代码。该地址X被保存以备后用。
为了实现上述动作6,在一些实施例中,源转换代码直接指导调试器或(多个)其他工具的低级别基础部分将跟踪推进到新的时间t',t'是地址X处的机器指令将在该处被模拟或被仿真模拟以执行的下一时间点。对于动作6,一个实施例可以使用在转储调试中通常使用的相同过程来从IL偏移转换为过程存储器偏移。然而,该实施例使用经转换的存储器偏移来在跟踪重放引擎内部设置虚拟断点。当重放引擎在虚拟执行期间读取该存储器地址时,虚拟过程(重放执行)将停止。的确,如果跟踪包含相同功能的多于一个的版本(经由重新即时编译(re-jitted)),则运行时转换可能会要求跟踪提供多个地址来涵盖单个断点。对于跟踪中的不同时间范围,该地址可以是不同的地址,也可以是运行时函数(如jitting函数)的地址,以便运行时转换能够定位函数的新重新即时编译的位置。
为了实现上述动作11,代替从实时过程中进行读取,跟踪文件418被读取,并且提供与时间t'相对应的存储器和寄存器。
重放调试场景
通过在调试时提供对向前和向后执行的访问权,系统800可以增强调试效率。例如,一些实施例支持如下的调试场景。
通过上下文的方式,技术人员将认识到生产调试是困难的。假定客户在网站上报告了问题。开发者如何调试它?一些熟悉的方法依赖于诸如日志和转储等信息,它们仅提供时间点信息。因此,如果问题没有在日志或转储中捕获的特定时刻重现或发生,则开发者必须再次尝试在执行的不同点捕获有用的信息,这表示要花费更长的时间来解决问题。
相反,想象一下,环境可以逐行确切地告诉开发者生产应用程序中发生了什么。使用Microsoft时间旅行调试或其他反向执行重放的实施例允许团队成员收集应用行为的高保真记录。然后,开发者可以在通常熟悉的环境(诸如Microsoft
Figure BDA0002753400150000641
环境或其他调试或集成开发环境)中脱机调试应用。
作为一个具体示例,假定SmartHotels360网站出现问题;这是一个演示网站,其代码通过GitHub.com网站从Microsoft公司公开可获取。运行该SmartHotels360网站的公司的开发者从用户处获取一份报告,该报告显示BestHotels的功能不再显示数据。然而,它之前运行良好,并且该问题并未在公司的测试或登台环境中重现。操作团队或工程团队的成员在运行为故障功能提供动力的代码时,已经收集了该应用的记录(跟踪418)。可以通过命令行工具将跟踪418收集到文件420中,或者在满足某个条件时由云环境(
Figure BDA0002753400150000651
或另一云环境)自动触发记录,某个条件诸如抛出超出预期的更多异常的方法。
开发者打开调试器并且加载SmartHotels360代码和跟踪文件420。在返回BestHotels的API中,执行在28行的断点处停止。现在,即使这是一个记录文件,在该示例中,开发者也可以使用很多熟悉的命令,利用开发者通常熟悉的调试器对其进行导航。开发者想知道调用该API时发生了什么。开发者步进跳过28行和29行,并且从Locals窗口看到在步进跳过29行后,bestHotels具有零项。如果调试器支持数据提示,则至少在该示例中,开发者也可以查看它们。
现在,开发者已经确定问题的原因在BestHotels()例程中。因此,开发者希望调查BestHotels()中发生了什么。以另一种调试方法,为了回头看看发生了什么,开发者可以点击继续,再次点击断点,然后步进进入下一BestHotels()的调用,尽管值、对象和存储器地址可能会与被部分地调试的调用有所不同。或者,当调试器状态难以重现时,开发者可以重新启动应用,这可能会花费很多时间。但是在该示例中,环境支持时间旅行调试。因此,开发者使用反向继续按钮(请求向后继续920操作)将应用倒带到先前断点的状态。倒带的一个结果是,在上述步进进行之前,局部将在28行重置为之前的状态。现在,通过确保来自被部分地调试的调用中的所有值、对象和存储器地址相同,开发者可以步进跳过Load()例程并且步进进入BestHotels()。
此时,开发者决定步进通过BestHotels(),并且深入研究GetBestHotels()。因此,开发者希望步进跳过36行,然后步进进入37行。假定开发者不小心多次按下了步进跳过按钮。通过时间旅行调试,开发者可以快速返回并且查看GetBestHotels()中发生了什么。实际上,开发者可以使用向后步进按钮(请求向后步进进入914操作),该按钮会将执行带入GetBestHotels()中,并且向后播放。开发者发现,在GetBestHotels()的末尾,局部变量bestHotels的值(对应于计数)为零。显然,所有等级都被过滤掉了。
因此,开发者决定通过检查以查看所有酒店的等级,从而检验假定。请记住,该跟踪是生产中发生的,因此这些值是实际值。开发者可以使用调试器的即时窗口来评估表达式,这可以通过实时调试过程来实现。开发者在调试器的即时窗口中评估表达式“AllHotels.Select(h=>h.rating)”,并且发现等级是浮点的,而代码正在检查等于整数4或5的等级值。数据类型不匹配,生产中的数据形状与应用期望之间不匹配。
现在假定开发者已经完成了刚刚描述的调试,并且想与同事讨论并且详细向同事展示发生了什么。开发者希望在调查开始时再次开始,并且希望有一种方法可以快速回到特定兴趣点。因此,开发者在21行设置了断点,然后倒回该断点。然后,重放将允许开发者重新再现调试步骤。如果开发者想跳到最后,则开发者可以继续前进,直到开发者设定的最后断点。
简而言之,开发者能够使用应用的高保真记录418快速调试问题,该记录捕获了生产中实际出了什么问题。借助被适配于这里所述的重放的调试器的权力,开发者能够使用熟悉的调试器用户界面进行调试,并且能够向前和向后进行调试,从而节省了大量的开发者时间。
结论
尽管在此将特定实施例明确地示出和描述为过程、所配置的介质或系统,但是应当理解,对一种类型的实施例的讨论通常还扩展到一些其他实施例类型。例如,结合图13和14进行的过程描述也有助于描述配置的介质,并且有助于描述与结合其他附图所讨论的那些类似的系统和制造的技术效果和操作。并非必然地,必须将来自一个实施例的限制读入另一实施例。特别地,过程不必限于在讨论诸如配置的存储器等系统或制造时所呈现的数据结构和布置。
本领域技术人员将理解,实现细节可以与特定代码有关,诸如特定API、特定领域、和特定样本程序,并且因此不一定在每个实施例中都出现。本领域技术人员还将理解,在讨论细节时使用的程序标识符和一些其他术语是特定于实现的,因此不一定与每个实施例有关。尽管如此,尽管这里不一定要求它们存在,但是这样的细节可以通过提供上下文来帮助一些读者,和/或可以说明本文中讨论的技术的很多可能的实现中的一些实现。
本文中对具有一些特征X的一个实施例的引用以及本文中其他地方对具有一些特征Y的实施例的引用并不排除同时具有特征X和特征Y的实施例,除非本文中明确指出了这种排除。所有可能的否定权利要求限制都在本公开的范围内,因为即使在本文中的任何示例中未给出特定排除,也可以将被规定为一个实施例的一部分的任何特征从一些其他实施例中明确删除。术语“实施例”在本文中仅用作“过程、系统、制品、配置的计算机可读介质和/或以与适用法律相一致的方式应用的本文中的教导的其他示例”的更方便形式。因此,给定“实施例”可以包括本文中公开的特征的任何组合,只要该实施例与至少一个权利要求相一致。
在每个实施例中,并非图中所示的每个项都必须被呈现。相反,一个实施例可以包含未在图中明确示出的项。尽管这里通过特定示例在文本和附图中示出了一些可能性,但是实施例可以脱离这些示例。例如,示例的特定技术效果或技术特征可以被省略,重命名,不同地分组,重复,在硬件和/或软件中不同地实例化,或者是出现在两个或更多个示例中的效果或特征的混合。在一些实施例中,在一个位置处示出的功能也可以在不同的位置处提供;例如,本领域技术人员认识到,可以在给定实现中以各种方式定义功能模块,而不必从被视为一个整体的交互模块集合中忽略所需要的技术效果。
在全文中通过引用标号对附图进行了引用。在附图或文本中,与给定附图标记相关的措词中的任何明显不一致之处应当被理解为简单地扩大了该数字所引用的范围。即使使用相同的附图标记,给定附图标记的不同实例也可以指代不同的实施例。类似地,给定附图标记可以用于指代动词、名词和/或每个的对应实例,例如,处理器110可以通过执行指令来处理110指令。
如本文中使用的,诸如“一个”和“该”等术语包括所指示的项或步骤中的一个或多个。特别地,在权利要求中,对项的引用通常是指存在至少一个这样的项,而对步骤的引用表示执行该步骤的至少一个实例。
标题仅是为了方便;可以在标题表明该主题的部分之外找到有关给定主题的信息。
所提交的所有权利要求书和摘要是说明书的一部分。
尽管已经在附图中示出并且在上面描述了示例性实施例,但是对于本领域的普通技术人员很清楚的是,在不脱离权利要求中阐述的原理和概念的情况下,可以进行多种修改,并且这样的修改不一定包含整个抽象概念。尽管以特定于结构特征和/或程序动作的语言描述了主题,但应当理解,所附权利要求书中定义的主题不必限于权利要求书中所述的特定技术特征或动作。在给定定义或示例中标识的每个手段或方面或技术效果不必在每个实施例中都呈现或被利用。而是,所描述的特定特征以及作用和效果作为示例被公开,以在实现权利要求时考虑。
在法律允许的最大范围内,所有落入整个抽象概念但落入权利要求等同含义和范围之内的改变都应当被包含在其范围之内。

Claims (15)

1.一种跟踪重放执行控制系统,包括:
处理器;
与所述处理器可操作通信的存储器;
结合运行时和内核在程序的执行期间被记录的跟踪,所述跟踪包括跟踪条目,所述跟踪条目包括由在所述程序的至少一个线程中执行的本机代码指令进行的活动的记录;
所述程序的至少一部分的源代码;
源中间映射,其在所述源代码与所述源代码的中间表示之间进行映射;
中间本机映射,其在所述中间表示与所述跟踪之间进行映射;以及
软件工具中的执行控制器,所述执行控制器被配置为在利用所述处理器执行时响应于请求而控制所述跟踪的重放执行,其中所述源代码通过所述源中间映射和所述中间本机映射与所述跟踪条目相关联。
2.根据权利要求1所述的跟踪重放执行控制系统,其中所述执行控制器被配置为将针对至少以下操作的请求转换为跟踪本机代码指令的对应执行:
向后执行步进进入操作,
向后执行步进退出操作,以及
向后执行步进跳过操作。
3.根据权利要求1所述的跟踪重放执行控制系统,其中所述系统被配置为步进进入所述源代码的一部分,所述源代码的一部分在所述重放执行期间尚未被编译为本机代码指令。
4.根据权利要求1所述的跟踪重放执行控制系统,其中所述中间表示包括以下至少一项:将在所述源代码中使用的至少两个标识符与数据类型相关联的符号表、从所述源代码的至少一部分导出的抽象语法树、或所述源代码的至少一部分到中间语言的转换。
5.根据权利要求1所述的跟踪重放执行控制系统,其中所述跟踪不包含所述运行时的任何执行实例,因为所述系统未被配置为调用所述跟踪以执行特定于所述运行时的任何代码。
6.根据权利要求1所述的跟踪重放执行控制系统,还包括具有所述运行时的可调用实例的所述程序的实时过程,其中所述跟踪从所述实时过程被记录并且所述系统被配置为重放所述跟踪的执行。
7.根据权利要求1所述的跟踪重放执行控制系统,其中所述系统被配置为略过所述跟踪的一部分的重放执行,因为所述执行控制器将所述重放执行从所述跟踪的第一执行时间点移动到所述跟踪的第二执行时间点,而所述系统没有执行本会通过从所述第一位置到所述第二位置的继续执行而被执行的跟踪本机代码指令。
8.一种跟踪重放执行控制方法,包括:
标识所跟踪的被管理程序,即被配置为结合对运行时的调用来执行、并且被配置为要被跟踪的程序;
接收跟踪重放执行控制请求,所述跟踪重放执行控制请求在计算系统上运行的软件工具中被接收;
基于所述跟踪重放执行控制请求,在所述所跟踪的被管理程序的源代码与所述源代码的中间表示之间自动地进行映射,并且在所述中间表示与跟踪之间自动地进行映射,其中所述跟踪包括:由至少一个处理器进行的活动的记录、当所述所跟踪的被管理程序被执行时被跟踪的所述活动,并且其中所述跟踪不包括所述运行时的任何执行实例;以及
执行与所述跟踪重放执行控制请求相对应的跟踪本机代码指令,从而重放所述跟踪的一部分。
9.根据权利要求8所述的跟踪重放执行控制方法,其中所述跟踪重放执行控制请求标识向后执行步进退出操作,以步进退出例程,并且所述方法包括在跟踪本机代码指令上设置断点,所述断点具有紧接在对所述例程的调用的返回地址的位置之前的位置,其中当在跟踪的向前执行期间在B之前遇到A并且A与B之间存在至多五个跟踪本机代码指令时,在所述跟踪中位置A紧接在位置B之前。
10.根据权利要求8所述的跟踪重放执行控制方法,其中所述源代码包含语句和表达式,并且其中所述方法包括在跟踪本机代码指令上设置断点,所述断点在一组全部跟踪本机代码指令的边缘上,所述全部跟踪本机代码指令由所述方法映射到所述源代码中的给定语句或给定表达式,其中当X满足以下条件中的至少一个条件时,跟踪中的一组指令G中的指令X在G的边缘上:X是在所述跟踪的向前执行期间遇到的G的第一指令,X是在所述跟踪的向前执行期间遇到的G的最后指令,X是在所述跟踪的向后执行期间遇到的G的第一指令,或者X是在所述跟踪的向后执行期间遇到的G的最后指令。
11.根据权利要求8所述的跟踪重放执行控制方法,其中所述跟踪重放执行控制请求标识向前执行步进进入操作,以步进进入用户代码例程,其中所述用户代码例程的重放执行包括对运行时例程的至少一个调用的重放执行,其中对所述运行时例程的所述调用在所述源代码中没有对应的调用语句或调用表达式,并且其中所述方法包括以下至少一项:
设置断点范围,所述断点范围指明被指定为接收动态编译代码的整个存储器范围;或者
设置断点,以对所述运行时例程的所述调用执行步进跳过操作。
12.根据权利要求8所述的跟踪重放执行控制方法,其中所述跟踪重放执行控制请求调用以下操作中的至少一个操作:
在所述跟踪中向前继续跟踪重放执行,直到断点被达到;
在所述跟踪中向前继续跟踪重放执行,直到断点范围内的位置被达到;
在所述跟踪中向后继续跟踪重放执行,直到断点被达到;或者
在所述跟踪中向后继续跟踪重放执行,直到断点范围内的位置被达到;
向后执行步进进入操作;
向后执行步进退出操作;
向后执行步进跳过操作;
向前执行步进进入操作;
向前执行步进退出操作;
向前执行步进跳过操作。
13.根据权利要求8所述的跟踪重放执行控制方法,其中在所述所跟踪的被管理程序的执行期间,断点的最大数目受处理器能够一次监测至多N个地址这一硬件断点约束的约束,并且其中所述方法还包括在所述跟踪的所述重放执行期间设置多于N个断点,从而超出所述硬件断点约束。
14.一种计算机可读存储介质,所述计算机可读存储介质配置有数据和指令,以在所述数据和所述指令使用与存储器可操作通信的处理器执行时执行跟踪重放执行控制方法,所述跟踪重放执行控制方法包括:
接收跟踪重放执行控制请求,所述跟踪重放执行控制请求在计算系统上运行的软件工具中被接收;
基于所述跟踪重放执行控制请求,在所跟踪的被管理程序的源代码与所述源代码的中间表示之间进行映射,并且在所述中间表示与跟踪之间进行映射,其中所述跟踪包括当所述所跟踪的被管理程序被执行时被跟踪的本机代码指令的记录,并且其中所述跟踪不包括所述运行时的任何执行实例;以及
执行与所述跟踪重放执行控制请求相对应的跟踪本机代码指令,或者在跟踪本机代码指令上设置断点,从而控制所述跟踪的重放。
15.根据权利要求14所述的计算机可读存储介质,其中所述方法包括以下执行控制活动中的至少三个执行控制活动:
使用所述跟踪中的机器级别信息来在高级别控制所述运行时的执行,其中在高级别控制是指基于用户选择来控制,所述用户选择指明所述源代码中的标识符或语句或表达式,并且机器级别信息是指特定于处理器架构的信息;
调试所述所跟踪的被管理程序的过程的向前执行和向后执行两者;
至少部分通过设置大断点范围来步进进入所述源代码中示出的调用,其中当断点范围涵盖所述跟踪中的至少一千个连续地址或指令时,所述断点范围是大的;
当所述跟踪包括例程的本机代码的至少两个版本时,映射到所述例程的本机代码的特定版本;或者
在调试所述所跟踪的被管理程序的实时过程的同时,记录来自所述实时过程的跟踪数据,并且然后使用所记录的所述跟踪数据中的至少一些跟踪数据对所述实时过程执行反向执行调试。
CN201980029543.7A 2018-05-02 2019-04-25 具有跨级别跟踪映射的执行控制 Pending CN112074817A (zh)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US15/969,721 2018-05-02
US15/969,721 US10698792B2 (en) 2018-05-02 2018-05-02 Execution control with cross-level trace mapping
PCT/US2019/029028 WO2019212839A1 (en) 2018-05-02 2019-04-25 Execution control with cross-level trace mapping

Publications (1)

Publication Number Publication Date
CN112074817A true CN112074817A (zh) 2020-12-11

Family

ID=66821335

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201980029543.7A Pending CN112074817A (zh) 2018-05-02 2019-04-25 具有跨级别跟踪映射的执行控制

Country Status (12)

Country Link
US (1) US10698792B2 (zh)
EP (1) EP3788490B1 (zh)
JP (1) JP7328255B2 (zh)
KR (1) KR20210002701A (zh)
CN (1) CN112074817A (zh)
AU (1) AU2019262864B2 (zh)
BR (1) BR112020020917A2 (zh)
CA (1) CA3097009A1 (zh)
MX (1) MX2020011496A (zh)
PH (1) PH12020551826A1 (zh)
SG (1) SG11202010390QA (zh)
WO (1) WO2019212839A1 (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112861609A (zh) * 2020-12-30 2021-05-28 中国电子科技集团公司信息科学研究院 一种多线程的内容关键帧识别效率提高方法
CN113626324A (zh) * 2021-08-04 2021-11-09 北京航空航天大学 一种面向Move语言虚拟机的模糊测试方法

Families Citing this family (33)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11080164B2 (en) 2018-01-08 2021-08-03 Ozcode Ltd. Time travel source code debugger incorporating redaction of sensitive information
US11128563B2 (en) * 2018-06-22 2021-09-21 Sorenson Ip Holdings, Llc Incoming communication routing
JP6961553B2 (ja) * 2018-08-30 2021-11-05 株式会社東芝 情報処理装置、システム及び方法
US10831503B2 (en) * 2018-11-06 2020-11-10 International Business Machines Corporation Saving and restoring machine state between multiple executions of an instruction
US10831478B2 (en) 2018-11-06 2020-11-10 International Business Machines Corporation Sort and merge instruction for a general-purpose processor
US10846197B1 (en) * 2018-12-13 2020-11-24 Facebook, Inc. Systems and methods for debugging mixed-language applications
IT201800011169A1 (it) * 2018-12-17 2020-06-17 Carel Ind Spa Procedimento di verifica della stabilità funzionale di un controllore di una macchina frigorifera
US11449356B2 (en) * 2019-01-18 2022-09-20 GalaxE.Solutions, Inc. Systems and methods for transaction tracing within an IT environment
US11537504B2 (en) * 2019-01-28 2022-12-27 Xepic Corporation Limited Realization of functional verification debug station via cross-platform record-mapping-replay technology
JP6978458B2 (ja) * 2019-02-28 2021-12-08 ファナック株式会社 シーケンスプログラムのトレースに用いるシーケンスプログラム処理装置
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
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
US10719477B1 (en) * 2019-06-20 2020-07-21 Semiconductor Components Industries, Llc Methods and system for an integrated circuit
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
US11093366B2 (en) * 2019-08-28 2021-08-17 Intel Corporation Generating different traces for graphics processor code
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
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
US11537503B2 (en) * 2020-01-31 2022-12-27 Salesforce.Com, Inc. Code editor for user interface component testing
US11501046B2 (en) * 2020-03-24 2022-11-15 International Business Machines Corporation Pre-silicon chip model of extracted workload inner loop instruction traces
US11307966B2 (en) * 2020-04-06 2022-04-19 Red Hat, Inc. Shared software debugging service
US11238214B1 (en) 2020-07-28 2022-02-01 Georgetown Software House, Inc. Systems and techniques for securely processing disparate data sets in spreadsheets
US11599342B2 (en) * 2020-09-28 2023-03-07 Red Hat, Inc. Pathname independent probing of binaries
CN112000584B (zh) * 2020-10-27 2021-01-29 北京智芯微电子科技有限公司 基于ide调试框架的用于cpu程序的调试方法及调试系统
US11347523B2 (en) 2020-11-05 2022-05-31 International Business Machines Corporation Updated shared library reloading without stopping the execution of an application
CN112416790B (zh) * 2020-11-30 2023-04-14 中国航空工业集团公司西安航空计算技术研究所 一种嵌入式软件离线重放调试方法和装置
US11656973B2 (en) * 2021-01-26 2023-05-23 International Business Machines Corporation Visual declarative debugger
CN113238937B (zh) * 2021-05-11 2023-02-03 西北大学 一种基于代码精简与误报过滤的编译器模糊测试方法
CN113282513B (zh) * 2021-06-28 2022-11-29 平安消费金融有限公司 接口测试案例的生成方法、装置、计算机设备及存储介质
US20230252133A1 (en) * 2022-02-10 2023-08-10 Cisco Technology, Inc. Application Security Context from Traces and Snapshots
US11947445B2 (en) * 2022-02-18 2024-04-02 Mckinsey & Company, Inc. Adjustment of operating parameters of arranged software assets
US20230281107A1 (en) * 2022-03-04 2023-09-07 Woven By Toyota, Inc. Apparatus and method for debugging autonomous driving application with conditional breakpoint

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20070294679A1 (en) * 2006-06-20 2007-12-20 Konstantin Bobrovsky Methods and apparatus to call native code from a managed code application
US20130185523A1 (en) * 2012-01-12 2013-07-18 National Chiao Tung University Decoupled method for tracking information flow and computer system thereof
CN104011719A (zh) * 2011-12-22 2014-08-27 艾玛迪斯简易股份公司 消息跟踪和检查的方法和系统
US20150378870A1 (en) * 2014-06-30 2015-12-31 Microsoft Corporation Time travel debugging in managed runtime

Family Cites Families (42)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6665688B1 (en) * 1998-12-23 2003-12-16 Cray Inc. Method and system for automatically regenerating data on-demand
US20060046854A1 (en) 2004-08-31 2006-03-02 Microsoft Corporation Method and apparatus for developing an electronic game using automatic user feedback
US7716650B2 (en) 2005-06-01 2010-05-11 Microsoft Corporation Non-destructive debugging for add-ins
US7676811B2 (en) 2006-03-23 2010-03-09 Microsoft Corporation Ensuring thread affinity for interprocess communication in a managed code environment
US8079019B2 (en) 2007-11-21 2011-12-13 Replay Solutions, Inc. Advancing and rewinding a replayed program execution
US20080127055A1 (en) 2006-09-07 2008-05-29 Microsoft Corporation Application proxy
US7908580B2 (en) 2006-09-07 2011-03-15 Microsoft Corporation Connecting an integrated development environment with an application instance
US8291381B2 (en) 2007-09-27 2012-10-16 Microsoft Corporation Call stack parsing in multiple runtime environments
US8219975B2 (en) 2007-10-26 2012-07-10 Microsoft Corporation Real-time analysis of performance data of a video game
JP4966904B2 (ja) 2008-03-31 2012-07-04 株式会社エヌ・ティ・ティ・データ プログラム診断装置及びプログラム診断方法ならびにそのプログラム
US8429454B2 (en) 2009-12-16 2013-04-23 Microsoft Corporation Coordination of error reporting among multiple managed runtimes in the same process
US8972955B2 (en) 2011-05-27 2015-03-03 Microsoft Technology Licensing Llc Reducing network trips for remote expression evaluation
US8572438B2 (en) 2011-06-24 2013-10-29 Microsoft Corporation N-way runtime interoperative debugging
US9262298B2 (en) 2012-02-16 2016-02-16 Microsoft Technology Licensing, Llc Debugging object abstractions
US9710357B2 (en) 2012-08-04 2017-07-18 Microsoft Technology Licensing, Llc Function evaluation using lightweight process snapshots
US8909990B2 (en) 2012-08-04 2014-12-09 Microsoft Corporation Historical software diagnostics using lightweight process snapshots
US9135145B2 (en) 2013-01-28 2015-09-15 Rackspace Us, Inc. Methods and systems of distributed tracing
US8977532B2 (en) 2013-02-22 2015-03-10 Microsoft Technology Licensing, Llc Estimating time remaining for an operation
US10289411B2 (en) 2013-11-18 2019-05-14 Microsoft Technology Licensing, Llc Diagnosing production applications
US10325099B2 (en) 2013-12-08 2019-06-18 Microsoft Technology Licensing, Llc Managing sensitive production data
US9424163B2 (en) 2014-01-15 2016-08-23 Microsoft Technology Licensing, Llc Exception and debugging behaviors for JavaScript debugging using just my code
US9239774B2 (en) 2014-01-15 2016-01-19 Microsoft Technology Licensing, Llc Classification of JavaScript code for debugging using just my code
US9703681B2 (en) 2014-05-29 2017-07-11 Microsoft Technology Licensing, Llc Performance optimization tip presentation during debugging
US9208060B1 (en) 2014-05-30 2015-12-08 Microsoft Technology Licensing, Llc Emulation-based expression evaluation for diagnostic tools
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
US9612939B2 (en) 2014-10-29 2017-04-04 Microsoft Technology Licensing, Llc. Diagnostic workflow for production debugging
US9632915B2 (en) 2014-10-29 2017-04-25 Microsoft Technology Licensing, Llc. Historical control flow visualization in production diagnostics
US9886366B2 (en) * 2016-03-25 2018-02-06 Microsoft Technology Licensing, Llc Replay-suitable trace recording by service container
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
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
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
US10198341B2 (en) * 2016-12-21 2019-02-05 Microsoft Technology Licensing, Llc Parallel replay of executable code
US10180799B2 (en) * 2017-02-02 2019-01-15 Microsoft Technology Licensing, Llc Efficient retrieval of memory values during trace replay
US10185645B2 (en) * 2017-03-08 2019-01-22 Microsoft Technology Licensing, Llc Resource lifetime analysis using a time-travel trace
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
US20190042390A1 (en) * 2017-08-01 2019-02-07 Microsoft Technology Licensing, Llc Focused execution of traced code in a debugger
US10592396B2 (en) * 2018-04-23 2020-03-17 Microsoft Technology Licensing, Llc Memory validity states in time-travel debugging
US20190324891A1 (en) * 2018-04-23 2019-10-24 Microsoft Technology Licensing, Llc Visualizing last/next known data values in time travel traces
US10747645B2 (en) * 2018-04-27 2020-08-18 Microsoft Technology Licensing, Llc Selectively tracing portions of computer process execution

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20070294679A1 (en) * 2006-06-20 2007-12-20 Konstantin Bobrovsky Methods and apparatus to call native code from a managed code application
CN104011719A (zh) * 2011-12-22 2014-08-27 艾玛迪斯简易股份公司 消息跟踪和检查的方法和系统
US20130185523A1 (en) * 2012-01-12 2013-07-18 National Chiao Tung University Decoupled method for tracking information flow and computer system thereof
US20150378870A1 (en) * 2014-06-30 2015-12-31 Microsoft Corporation Time travel debugging in managed runtime

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112861609A (zh) * 2020-12-30 2021-05-28 中国电子科技集团公司信息科学研究院 一种多线程的内容关键帧识别效率提高方法
CN112861609B (zh) * 2020-12-30 2024-04-09 中国电子科技集团公司信息科学研究院 一种多线程的内容关键帧识别效率提高方法
CN113626324A (zh) * 2021-08-04 2021-11-09 北京航空航天大学 一种面向Move语言虚拟机的模糊测试方法
CN113626324B (zh) * 2021-08-04 2023-09-26 北京航空航天大学 一种面向Move语言虚拟机的模糊测试方法

Also Published As

Publication number Publication date
JP7328255B2 (ja) 2023-08-16
KR20210002701A (ko) 2021-01-08
BR112020020917A2 (pt) 2021-01-26
AU2019262864A1 (en) 2020-10-22
US10698792B2 (en) 2020-06-30
PH12020551826A1 (en) 2021-05-17
WO2019212839A1 (en) 2019-11-07
AU2019262864B2 (en) 2023-10-19
JP2021523444A (ja) 2021-09-02
SG11202010390QA (en) 2020-11-27
US20190340103A1 (en) 2019-11-07
MX2020011496A (es) 2020-12-07
EP3788490B1 (en) 2023-06-28
CA3097009A1 (en) 2019-11-07
EP3788490A1 (en) 2021-03-10

Similar Documents

Publication Publication Date Title
AU2019262864B2 (en) Execution control with cross-level trace mapping
US11249881B2 (en) Selectively tracing portions of computer process execution
US10621068B2 (en) Software code debugger for quick detection of error root causes
US10541042B2 (en) Level-crossing memory trace inspection queries
EP3785125B1 (en) Selectively tracing portions of computer process execution
US9063766B2 (en) System and method of manipulating virtual machine recordings for high-level execution and replay
JP7148802B2 (ja) 解析プログラム、解析方法および解析装置
US20120151450A1 (en) Platform-Agnostic Diagnostic Data Collection and Display
Watson Writing high-performance. NET code
US10929126B2 (en) Intercepting and replaying interactions with transactional and database environments
Gligoric Regression test selection: Theory and practice
CN109284222B (zh) 软件单元、数据处理系统中的项目测试方法、装置及设备
Goldshtein et al. Pro. NET Performance
Leija Leveraging System Call Interposition for Low-Level Process Manipulation
Getz Wasm-R3: creating executable benchmarks of WebAssembly binaries via record-reduce-replay
Julino Lightweight introspection for full system simulations
Vilk Righting Web Development
Orwick et al. Developing Drivers with the Windows Driver Foundation: Dev Driver Win Driver Fou_p1
Sanders Application of VMware VProbes to debugging of a segmentation based separation kernel
Vennaro iOS Development at Scale
Hanna et al. An Intel x86 CPU, IBM BIOS, and Hardware Emulator

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
REG Reference to a national code

Ref country code: HK

Ref legal event code: DE

Ref document number: 40035552

Country of ref document: HK