CN114981783A - 将主题可重放执行跟踪与比较可重放执行跟踪进行区分 - Google Patents
将主题可重放执行跟踪与比较可重放执行跟踪进行区分 Download PDFInfo
- Publication number
- CN114981783A CN114981783A CN202080093060.6A CN202080093060A CN114981783A CN 114981783 A CN114981783 A CN 114981783A CN 202080093060 A CN202080093060 A CN 202080093060A CN 114981783 A CN114981783 A CN 114981783A
- Authority
- CN
- China
- Prior art keywords
- groups
- comparison
- execution
- function
- group
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3636—Software debugging by tracing the execution of the program
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/3003—Monitoring arrangements specially adapted to the computing system or computing system component being monitored
- G06F11/302—Monitoring arrangements specially adapted to the computing system or computing system component being monitored where the computing system component is a software system
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/34—Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment
- G06F11/3466—Performance evaluation by tracing or monitoring
-
- 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/3648—Software debugging using additional hardware
-
- 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)
- Physics & Mathematics (AREA)
- Quality & Reliability (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Computing Systems (AREA)
- Mathematical Physics (AREA)
- Debugging And Monitoring (AREA)
Abstract
将主题可重放跟踪与比较可重放跟踪进行区分包括标识记录在主题跟踪中的第一指令序列内的第一多个函数,并且标识记录在比较跟踪中的第二指令序列中的第二多个函数。标识第一多个函数的第一多个组和第二多个函数的第二多个组。比较第一多个组和第二多个组,包括基于每个组的身份和与该组相对应的(多个)函数确定第一多个组中的每个第一组是否是以下至少一项:等于第二多个组中的第二组、是第二多个组中的第二组的替换、从第二多个组中被删除、或者插入第二多个组中。
Description
背景技术
跟踪和校正不期望的软件行为是软件开发中的核心活动。不期望的软件行为可以包括很多事情,诸如执行崩溃、运行时异常、执行性能缓慢、数据结果不正确、数据损坏等。不期望的软件行为可能由各种各样的因素触发,诸如数据输入、用户输入、竞争条件(例如,当访问共享资源时)等。鉴于触发器的多样性,不期望的软件行为可能很少见并且看似随机,并且极难重现。因此,开发人员标识给定的不期望的软件行为可能非常耗时并且困难。一旦标识出不期望的软件行为,确定其(多个)根本原因可能很耗时并且困难。
开发人员通常使用多种方法来标识不期望的软件行为,然后标识应用的代码中导致不期望的软件行为的(多个)位置。例如,开发人员可能会针对不同输入来测试应用的代码的不同部分(例如,单元测试)。作为另一示例,开发人员可能会推断应用的代码在调试器中的执行(例如,在代码执行时、通过设置断点/观察点、通过单步执行代码行、等等)。作为另一示例,开发人员可能会在分析器中观察代码执行行为(例如,时序、覆盖率)。作为另一示例,开发人员可能会将诊断代码(例如,跟踪语句)插入应用的代码中。
虽然常规的诊断工具(例如,调试器、分析器等)已经用于“实时”前向执行代码,但新兴形式的诊断工具能够实现“历史”调试(也称为“时间旅行”或“反向”调试),其中程序的(多个)线程的至少部分的执行被记录到一个或多个跟踪文件(即,执行跟踪)中。使用一些跟踪技术,执行跟踪可以包含“位准确”的历史执行跟踪数据,这使(多个)跟踪线程的(多个)记录部分能够被虚拟地“重放”(例如,经由仿真)到个体指令(例如,机器代码指令、中间语言代码指令等)的粒度。因此,使用“位精确”的跟踪数据,诊断工具可以使开发人员能够推断主题代码的记录的先前执行,而不是该代码的“实时”前向执行。例如,使用执行跟踪,历史调试器可能会提供如下用户体验,该用户体验启用前向和反向断点/观察点两者,使得代码能够向前和向后单步执行,等等。另一方面,历史分析器可能能够从先前执行的代码中导出代码执行行为(例如,时间、覆盖率)。
由于现代微处理器通常以数万到数十万MIPS(每秒数百万条指令)的速率执行,因此执行跟踪可以捕获大量信息,即使仅捕获线程执行的几分之一秒。因此,分析和呈现有关执行跟踪的信息可能会带来重大的技术障碍。
发明内容
本文中描述的至少一些实施例区分可重放执行跟踪。这可以包括将单个主题执行跟踪与单个比较执行跟踪(例如,1:1)进行区分,将单个主题执行跟踪与多个比较执行跟踪(例如,1:N)进行区分,和/或将多个主题执行跟踪与多个比较执行跟踪(例如,M:N)进行区分。本文中的实施例通过对相关可执行指令的序列进行分组,并且基于这些组的属性执行区分来操作以确定这些组是否等效地执行,即使这些组中的特定指令不同。因此,本文中的实施例可以区分跟踪的指令集,即使那些指令从具有不同二进制文件的应用执行(例如,由于代码改变、编译器改变、编译器设置改变、处理器指令集架构(ISA)改变等)。此外,本文中的实施例可以以不同的细节等级来区分跟踪指令的不同部分,从而使得处理资源能够专用于那些特别感兴趣的区域。
在一些实施例中,用于将主题可重放执行跟踪与比较可重放执行跟踪进行区分的方法、系统和计算机程序产品访问第一主题可重放执行跟踪,该第一主题可重放执行跟踪表示作为第一执行实体的部分而被执行的第一可执行指令序列、访问第二比较可重放执行跟踪,该第二比较可重放执行跟踪表示作为第二执行实体的部分而执行的第二可执行指令序列。这些实施例还标识第一可执行指令序列内的第一多个函数、并且第二可执行指令序列内的第二多个函数。每个函数对应于作为函数的部分而执行的一个或多个可执行指令序列。这些实施例还标识第一多个函数的第一多个组、以及第二多个函数的第二多个组。每个组包括一个或多个相关函数的序列。这些实施例还将第一多个组和第二多个组进行比较。比较包括基于每个组的身份和与组相对应的一个或多个函数来确定第一多个组中的每个第一组是否是以下至少一项:等于第二多个组中的第二组、是第二多个组中的第二组的替换、从第二多个组中被删除或插入到第二多个组中。这些实施例还向计算机系统处的软件组件或者向另一计算机系统提供比较的结果的一个或多个标记。标记指示每个第一组是否是以下至少一项:等于第二多个组中的第二组、是第二多个组中的第二组的替换、从第二多个组中被删除或者插入到第二多个组中。
在其他实施例中,用于将主题可重放执行跟踪与多个比较可重放执行跟踪进行区分的方法、系统和计算机程序产品访问主题可重放执行跟踪和多个比较可重放执行跟踪。每个可重放执行跟踪表示对应可执行指令序列,对应可执行指令序列作为对应执行实体的部分而被执行。这些实施例还标识多个比较可重放执行跟踪之间的映射集。每个映射标识等效执行的多个比较可重放执行跟踪内的连续可执行指令的两个或更多个对应比较部分。每个映射中的每个比较部分来自多个比较可重放执行跟踪中的不同一个比较可重放执行跟踪。基于该映射集,这些实施例还标识多个比较可重放执行跟踪内的多个不同比较部分。每个不同比较部分要么(i)缺少该映射集中的映射,要么(ii)是来自该映射集中的不同映射的代表性比较部分。这些实施例还比较主题可重放执行跟踪和多个比较可重放执行跟踪。比较包括:将主题执行跟踪内的连续可执行指令的多个主题部分中的每个主题部分与多个不同比较部分中的一个或多个不同比较部分进行比较。基于比较,这些实施例还确定多个主题部分中的每个主题部分的比较状态。该确定包括确定每个主题部分是否是以下至少一项:(i)等于至少一个对应不同比较部分,或者(ii)不同于多个不同比较部分。至少一个特定主题部分相对于至少一个特定对应不同比较部分的所确定的比较状态被应用于该映射集中至少一个特定不同比较部分被映射到的每个附加比较部分。这些实施例还向计算机系统处的软件组件或向另一计算机系统提供确定的结果的标记。
在又一实施例中,用于将多个主题可重放执行跟踪与多个比较可重放执行跟踪进行区分的方法、系统和计算机程序产品访问多个主题可重放执行跟踪和多个比较可重放执行跟踪。每个可重放执行跟踪表示对应可执行指令序列,该对应可执行指令序列作为对应执行实体的一部分而被执行。针对多个主题可重放执行跟踪,这些实施例标识多个主题可重放执行跟踪之间的第一映射集,并且基于第一映射集,标识多个主题可重放执行跟踪内的多个不同主题部分。第一映射集中的每个映射标识等效执行的多个主题可重放执行跟踪内连续可执行指令的两个或更多个对应主题部分,并且每个映射中的每个主题部分来自多个主题可重放执行跟踪中的不同的一个主题可重放执行跟踪。每个不同主题部分或者(i)在第一映射集中缺少映射,或者(ii)是来自第一映射集中的不同映射的代表性主题部分。针对多个比较可重放执行跟踪,这些实施例标识多个比较可重放执行跟踪之间的第二映射集,并且基于第二映射集,标识多个比较可重放执行跟踪内的多个不同比较部分。第二映射集中的每个映射标识等效执行的多个比较可重放执行跟踪内连续可执行指令的两个或更多个对应比较部分,并且每个映射中的每个比较部分来自多个比较可重放执行跟踪中的不同的一个比较可重放执行。每个不同比较部分或者(i)在第二映射集中缺少映射,或者(ii)是来自第二映射集中的不同映射的代表性比较部分。这些实施例还比较多个主题可重放执行跟踪和多个比较可重放执行跟踪。比较包括:将多个不同主题部分中的每个不同主题部分与多个不同比较部分中的一个或多个不同比较部分进行比较。基于比较,这些实施例确定多个不同主题部分中的每个不同主题部分的比较状态。该确定包括确定每个不同主题部分是否是以下至少一项:(i)等于至少一个对应不同比较部分,或(ii)不同于多个不同比较部分。至少一个特定不同主题部分相对于至少一个特定对应不同比较部分的所确定的比较状态被应用于(i)第二映射集中至少一个特定不同比较部分被映射到的每个附加比较部分、以及(ii)第一映射集中至少一个特定不同主题部分被映射到的每个附加主题部分。实施例还向计算机系统处的软件组件或向另一计算机系统提供确定的结果的标记。
提供该“发明内容”以便以简化形式介绍概念的选择,这些概念将在下面的“具体实施方式”中进一步描述。本“发明内容”并非旨在标识所要求保护的主题的关键特征或基本特征,也不旨用于帮助确定所要求保护的主题的范围。
附图说明
为了描述能够获取本发明的上述和其他优点和特征的方式,将通过参考附图所示的具体实施例来对上文简要描述的本发明进行更具体的描述。理解这些附图仅描述本发明的典型实施例并且因此不应当被认为是对其范围的限制,将通过使用附图以附加的具体性和细节来描述和解释本发明,在附图中:
图1A示出了便于区分可重放执行跟踪的示例计算环境;
图1B示出了区分可重放执行跟踪的示例调试组件;
图2示出了其中图1A的计算机系统通过一个或多个网络连接到一个或多个其他计算机系统的示例计算环境;
图3示出了可执行实体的记录执行的示例;
图4A示出了用于由调试组件进行区分的两个记录的可执行指令序列;
图4B示出了将图4A的可执行指令分组为相关连续可执行指令的部分;
图4C示出了将图4B所示的连续可执行指令的部分进一步分组为更高等级的组;
图5A示出了用于图4C的更高等级组的示例差分符号;
图5B示出了基于图5A的差分符号的组比较状态的示例;
图5C示出了利用代码仿真和输入/输出比较来确定不同跟踪的指令序列上的函数是否等效执行的示例;
图5D示出了利用代码仿真和输入/输出比较来确定不同跟踪指令序列上的函数是否等效执行的示例;
图6示出了用于将主题可重放执行跟踪与比较可重放执行跟踪进行区分的示例方法的流程图;
图7A示出了一对多(1:N)跟踪比较的示例;
图7B示出了包括部分跟踪的一对多(1:N)跟踪比较的示例;
图7C示出了多对多(M:N)跟踪比较的示例;
图7D示出了包括部分跟踪的多对多(M:N)跟踪比较的示例;
图8示出了用于将主题可重放执行跟踪与多个比较可重放执行跟踪进行区分的示例方法的流程图;以及
图9示出了用于将多个主题可重放执行跟踪与多个比较可重放执行跟踪进行比较的示例方法的流程图。
具体实施方式
本文中描述的至少一些实施例区分可重放执行跟踪。这可以包括:将单个主题执行跟踪与单个比较执行跟踪(例如,1:1)进行区分,将单个主题执行跟踪与多个比较执行跟踪(例如,1:N)进行区分,和/或将多个主题执行跟踪与多个比较执行跟踪(例如,M:N)进行区分。本文中的实施例通过对相关可执行指令的序列进行分组,并且基于这些组的属性执行区分来操作以确定这些组是否等效地执行,即使这些组中的特定指令不同。因此,本文中的实施例可以区分跟踪指令集,即使那些指令从具有不同二进制文件的应用执行(例如,由于代码改变、编译器改变、编译器设置改变、处理器ISA改变等)。此外,本文中的实施例可以在不同的细节等级区分跟踪指令的不同部分,从而使处理资源能够专用于那些特别感兴趣的区域。
本文中的实施例使用的执行跟踪可以由各种历史调试技术生成。通常,历史调试技术在不同时间记录或重构实体的执行状态,以便使得该实体的执行能够在以后从该执行状态至少部分重新执行或仿真。该虚拟执行的保真度取决于可用的跟踪执行状态。
例如,一类历史调试技术(本文中称为时间旅行调试)连续记录实体执行的位精确跟踪。然后可以稍后使用该位精确跟踪来忠实地重放该实体的先前执行,直到个体代码指令的保真度。例如,位精确跟踪可能会记录足以重现针对线程的先前执行中的至少一个点的初始处理器状态的信息(例如,通过记录处理器寄存器的快照),以及线程的指令在该时间点之后执行时读取的数据值(例如,存储器读取)。然后,基于向指令提供记录的读取,可以使用该位精确跟踪来重放线程的代码指令的执行(从初始处理器状态开始)。
另一类历史调试技术(本文中称为分支跟踪调试)依赖于基于从转储或快照(例如,线程的崩溃转储)向后工作来重构实体的执行状态的至少部分,包括处理器分支跟踪(即,其包括是否采用分支的记录)。这些技术从该转储或快照中的值(例如,存储器和寄存器)开始,并且使用分支跟踪至少部分地确定代码执行流程,迭代地重放实体的代码指令并且向后和向前以重构由该代码使用的中间数据值(例如,寄存器和存储器),直到这些值达到稳定状态。这些技术可能会在它们可以在多远之前重构数据值以及可以重构多少数据值方面受到限制。尽管如此,重构的历史执行数据可以用于历史调试。
另一类历史调试技术(本文中称为重放和快照调试)在实体执行时周期性地记录实体的存储器空间和处理器寄存器的完整快照。如果实体依赖于来自实体自身存储器以外的来源的数据,或者来自非确定性来源的数据,则这些技术可能还会将这样的数据与快照一起记录。然后,这些技术使用快照中的数据在快照之间重放实体代码的执行。
图1A示出了便于区分可重放执行跟踪的示例计算环境100。如图所示,计算环境100可以包括或利用专用或通用计算机系统101,计算机系统101包括计算机硬件,例如一个或多个处理器102、系统存储器103、持久存储104和/或(多个)网络设备105,它们使用一个或多个通信总线106通信耦合。
在本发明的范围内的实施例可以包括用于携带或存储计算机可执行指令和/或数据结构的物理和其他计算机可读介质。这样的计算机可读介质可以是可以由通用或专用计算机系统访问的任何可用介质。存储计算机可执行指令和/或数据结构的计算机可读介质是计算机存储介质。携带计算机可执行指令和/或数据结构的计算机可读介质是传输介质。因此,作为示例而非限制,本发明的实施例可以包括至少两种截然不同的计算机可读介质:计算机存储介质和传输介质。
计算机存储介质是存储计算机可执行指令和/或数据结构的物理存储介质(例如,系统存储器103和/或持久存储104)。物理存储介质包括计算机硬件,诸如RAM、ROM、EEPROM、固态驱动器(“SSD”)、闪存、相变存储器(“PCM”)、光盘存储、磁盘存储或其他磁存储设备、或者可以用于以计算机可执行指令或数据结构的形式存储程序代码并且可以由通用或专用计算机系统访问和执行以实现本发明的所公开的功能的(多个)任何其他硬件存储设备。
传输介质可以包括可以用于以计算机可执行指令或数据结构形式承载程序代码并且可以由通用或专用计算机系统访问的网络和/或数据链路。“网络”被限定为能够在计算机系统和/或模块和/或其他电子设备之间传输电子数据的一个或多个数据链路。当信息通过网络或其他通信连接(硬连线、无线或硬连线或无线的组合)传输或提供到计算机系统时,计算机系统可以将该连接视为传输介质。上述各项的组合也应当被包括在计算机可读介质的范围内。
此外,在到达各种计算机系统组件时,计算机可执行指令或数据结构形式的程序代码可以从传输介质自动传输到计算机存储介质(反之亦然)。例如,通过网络或数据链路接收的计算机可执行指令或数据结构可以缓存在网络接口模块(例如,(多个)网络设备105)内的RAM中,然后最终传输到计算机系统RAM(例如,系统存储器103)和/或计算机系统处的弱易失性计算机存储介质(例如,持久存储104)。因此,应当理解,计算机存储介质可以被包括在也(或甚至主要)利用传输介质的计算机系统组件中。
例如,计算机可执行指令包括当在一个或多个处理器处执行时引起通用计算机系统、专用计算机系统或专用处理设备执行特定功能或功能组的指令和数据。例如,计算机可执行指令可以是机器代码指令(例如,二进制文件)、中间格式指令(诸如汇编语言)或甚至源代码。
本领域技术人员将理解,本发明可以在具有多种类型的计算机系统配置的网络计算环境中实践,包括个人计算机、台式计算机、膝上型计算机、消息处理器、手持设备、多处理器系统、基于微处理器或可编程的消费电子产品、网络PC、小型计算机、大型计算机、移动电话、PDA、平板计算机、寻呼机、路由器、交换机等。本发明还可以在分布式系统环境中实践,其中通过网络链接(通过硬连线数据链路、无线数据链路或通过硬连线和无线数据链路的组合)的本地和远程计算机系统都执行任务。因此,在分布式系统环境中,计算机系统可以包括多个组成计算机系统。在分布式系统环境中,程序模块可以位于本地和远程存储器存储设备两者中。
本领域技术人员还将理解,本发明可以在云计算环境中实践。云计算环境可以是分布式的,但这不是必需的。当分布式时,云计算环境可以在一个组织内国际分布和/或具有跨多个组织拥有的组件。在本描述和以下权利要求中,“云计算”被限定为用于实现对可配置计算资源(例如,网络、服务器、存储、应用和服务)的共享池的按需网络访问的模型。“云计算”的定义不限于在正确部署时可以从这样的模型中获取的任何其他众多优势。
云计算模型可以由各种特性组成,诸如按需自助服务、广泛的网络访问、资源池、快速弹性、可测量的服务等。云计算模型也可以以各种服务模型的形式出现,例如软件即服务(“SaaS”)、平台即服务(“PaaS”)和基础设施即服务(“IaaS”)。云计算模型也可以使用不同的部署模型来部署,诸如私有云、社区云、公共云、混合云等。
一些实施例(诸如,云计算环境)可以包括系统,该系统包括一个或多个主机,各自能够运行一个或多个虚拟机。在操作期间,虚拟机仿真可操作计算系统,以支持操作系统,也许还支持一个或多个其他应用。在一些实施例中,每个主机包括管理程序,该管理程序使用从虚拟机的视图中抽象出来的物理资源来仿真虚拟机的虚拟资源。管理程序还提供虚拟机之间的适当隔离。因此,从任何给定虚拟机的角度来看,管理程序提供关于虚拟机与物理资源接口的错觉,即使虚拟机仅与物理资源的外观(例如,虚拟资源)接口。物理资源的示例包括处理能力、存储器、磁盘空间、网络带宽、媒体驱动器等。
如图1A所示,每个处理器102可以包括(除其他外)一个或多个处理单元107(例如,处理器核)和一个或多个高速缓存108。每个处理单元107经由高速缓存108来加载和执行机器代码指令。在这些机器代码指令在一个或多个执行单元107b处的执行期间,指令可以使用内部处理器寄存器107a作为临时存储位置,并且可以经由高速缓存108来读取和写入系统存储器103中的各个位置。通常,高速缓存108临时高速缓存系统存储器103的部分;例如,高速缓存108可以包括高速缓存存储应用代码的系统存储器103的部分的“代码”部分、以及高速缓存存储应用运行时数据的系统存储器103的部分的“数据”部分。如果处理单元107需要尚未存储在高速缓存108中的数据(例如,代码或应用运行时数据),则处理单元107可以发起“高速缓存未命中”,从而导致从系统存储器103中获取所需要的数据——同时潜在地将一些其他数据从高速缓存108“驱逐”回系统存储器103。
如图所示,持久存储104可以存储计算机可执行指令和/或表示可执行软件组件的数据结构;相应地,在该软件在(多个)处理器102处的执行期间,这些计算机可执行指令和/或数据结构的一个或多个部分可以加载到系统存储器103中。例如,持久存储104被示出为潜在地存储与调试组件109、跟踪器组件110、仿真组件111和一个或多个应用112相对应的计算机可执行指令和/或数据结构。持久存储104还可以存储数据,诸如至少一个执行跟踪113(例如,使用上述一种或多种历史调试技术生成的)。
通常,调试组件109利用仿真组件111以便基于从至少一个执行跟踪113获取的执行状态数据来仿真可执行实体(诸如,(多个)应用112)的代码的执行。因此,图1A示出了调试组件109和仿真组件111被加载到系统存储器103(即,调试组件109'和仿真组件111')中,并且(多个)应用112正在仿真组件111'(即,(多个)应用112')内被仿真。如将结合图1B更详细解释的,调试组件109可以提供用于区分可重放执行跟踪的函数。调试组件109可以对应于使用执行跟踪113作为分析应用112的先前执行的部分的任何类型的工具。例如,调试组件109可以是调试器、分析器、云服务等。
通常,跟踪器组件110将(多个)应用112中的一个或多个应用的执行记录或“跟踪”到至少一个执行跟踪113中(例如,使用一种或多种类型的上述历史调试技术)。跟踪器组件110可以记录(多个)应用112的执行,无论该执行是否是直接在(多个)处理器102上的“实时”执行,该执行是否是经由受管理的运行时的在(多个)处理器102上的“实时”执行,和/或该执行是否是经由仿真组件111进行的仿真的执行。因此,图1A还示出了跟踪器组件110也被加载到系统存储器103(即,跟踪器组件110')中。跟踪器组件110'与执行跟踪113'之间的箭头指示跟踪器组件110'可以将跟踪数据记录到执行跟踪113'中(然后可以将其作为执行跟踪113持久存储到持久存储104中)。
计算机系统101可以附加地或备选地从另一计算机系统接收至少一个执行跟踪113(例如,使用(多个)网络设备105)。例如,图2示出了示例计算环境200,其中图1A的计算机系统101通过一个或多个网络201连接到一个或多个其他计算机系统202(即,计算机系统202a至202n)。如示例200中所示,每个计算机系统202包括跟踪器组件110和(多个)应用112。因此,计算机系统101可以通过(多个)网络201接收(多个)应用112中的一个或多个应用在这些(多个)计算机系统202处的至少一个先前执行的至少一个执行跟踪113。
注意,虽然调试组件109、跟踪器组件110和/或仿真组件111每个可以是独立的组件或应用,但它们可以备选地集成到同一应用(诸如,调试套件)中,或者可以集成到另一软件组件中——诸如操作系统组件、管理程序、云结构等。因此,本领域技术人员也将理解,本发明可以在云计算环境中实践,计算机系统101该云计算环境的部分。例如,虽然这些组件109至111可以采用在用户的本地计算机处执行的一个或多个软件应用的形式,但它们也可以采用由云计算环境提供的服务的形式。
之前提到过,调试组件109可以提供用于区分可重放执行跟踪的函数。为了说明调试组件109可以如何完成前述内容,图1B示出了图1A的调试组件109的附加细节。图1B所描绘的调试组件109包括各种组件(例如,数据访问114、分组115、对准116、区分117、输出118等),该组件表示调试组件109可以根据本文中描述的各种实施例来实现的各种功能。应当理解,所描绘的组件——包括它们的身份、子组件和布置——仅作为描述本文中描述的调试组件109的各种实施例的帮助而呈现,并且这些组件不限于软件和/或硬件如何实现本文中描述的调试组件109或其特定功能的各种实施例。
如图所示,数据访问组件114包括跟踪访问组件114a和代码访问组件114b。跟踪访问组件114a访问执行跟踪,例如应用112的先前执行的执行跟踪113。图3示出了可能被跟踪访问组件114a访问的可执行实体(例如,应用112)的执行跟踪300的一个示例,其中执行跟踪300可能已经使用时间旅行调试技术生成。注意,执行跟踪300只是一个示例,并且跟踪可以采用多种格式,只要它们提供从记录中恢复每个线程的方法。值得注意的是,术语“线程”在本文中应当被一般地视为指代任何线性代码执行,即使该代码将由多个单独的操作系统线程分派。
在图3的示例中,执行跟踪300包括多个数据流301(即,数据流301a至301n)。在实施例中,每个数据流301表示从应用112的代码执行的不同线程的执行。例如,数据流301a可以记录应用112的第一线程的执行,而数据流301n记录应用112的第n个线程。如图所示,数据流301a包括多个数据分组302。由于记录在每个数据分组302中的特定数据可以不同,因此它们被示出为具有不同的大小。通常,当使用时间旅行调试技术时,数据分组302可以将输入(例如,寄存器值、存储器值等)记录到作为应用112的该第一线程的部分而执行的一个或多个可执行指令。如图所示,数据流301a还可以包括一个或多个关键帧303(例如,关键帧303a和303b),各自记录足够的信息,诸如寄存器和/或存储器值的快照,该信息使得线程的先前执行能够由仿真组件111从关键帧的点处向前开始重放。
在实施例中,执行跟踪113还可以包括作为应用112的部分而执行的实际代码。因此,在图3中,每个数据分组302被示出为包括非阴影数据输入部分304和阴影代码部分305。在实施例中,每个数据分组302的代码部分305(如果存在的话)可以包括基于对应数据输入而执行的可执行指令。然而,在其他实施例中,执行跟踪113可以省略实际执行的代码,而不是依赖于对应用112的代码的单独访问(例如,来自持久存储104)。在这些其他实施例中,每个数据分组可以例如指定应用二进制镜像中(多个)适当可执行指令的地址或偏移。尽管未示出,但执行跟踪300也可以包括存储代码执行的输出中的一个或多个输出的数据流301。注意,使用数据分组的不同数据输入和代码部分仅用于说明目的,并且可以以多种方式存储相同的数据,例如通过使用多个数据分组。
如果存在多个数据流301,各自记录不同线程的执行,则这些数据流可以包括排序事件。每个排序事件记录跨线程可排序的事件的发生。例如,排序事件可以对应于线程之间的交互,诸如对由线程共享的存储器的访问。因此,例如,如果被跟踪到第一数据流(例如,301a)的第一线程写入同步变量,则第一排序事件可以被记录到该数据流(例如,301a)中。稍后,如果被跟踪到第二数据流(例如,301b)的第二线程从该同步变量中被读取,则第二排序事件可以被记录到该数据流(例如,301b)中。这些排序事件本质上可以是有序的。例如,每个排序事件可以与单调递增的值相关联,其中单调递增的值限定排序事件之间的总顺序。例如,记录到第一数据流中的第一排序事件可以被赋予值“1”,记录到第二数据流中的第二排序事件可以被赋予值“2”等等。
返回到图1B,代码访问组件114b可以获取应用112的代码。如果由跟踪访问组件114a获取的(多个)执行跟踪113包括跟踪的代码(例如,代码部分305),则代码访问组件114b可以从执行跟踪113中提取该代码。备选地,代码访问组件114b可以从持久存储104(例如,从应用二进制镜像)获取应用112的代码。
分组组件115标识先前执行的可执行指令序列的逻辑分组(或部分),该指令的执行被记录在由跟踪访问组件114a访问的跟踪中。在实施例中,分组组件115利用可执行代码通常被组织成逻辑结构(例如,库、模块、名称空间、类、函数等)的事实来标识逻辑相关的连续可执行指令的分组/部分。例如,指令序列可以属于对应函数、类、模块等。由于可执行代码通常可以分层组织,因此在实施例中,分组组件115可以标识分组/部分的分层布置。
图4A至图4C示出了分组组件115的示例操作。从图4A开始,示例400a象征性地示出了用于由调试组件109进行区分的两个记录的可执行指令序列,包括用于与右侧的序列401b比较/区分的左侧的序列401a。这些序列400可以是作为一个或多个可执行实体(例如,从应用112执行的(多个)进程或(多个)线程)的部分而执行的可执行指令序列,并且其执行被记录在由跟踪访问组件114a访问的对应的可重放执行跟踪113中。例如,序列401a可能对应于应用112的进程执行的一个或多个第一部分,而序列401b可能对应于同一应用112的进程执行的一个或多个第二部分。在该第一示例中,执行的(多个)第一部分可能对应于进程/线程实例的第一执行时间段,而执行的(多个)第二部分可能对应于进程/线程的同一实例的第二执行时间段。备选地,执行的(多个)第一部分可能对应于进程/线程的第一实例的执行,而执行的(多个)第二部分可能对应于进程/线程的第二实例的执行(例如,在同一计算机系统处,或在另一计算机系统处)。在另一示例中,序列401a可能对应于应用112的一个版本的进程/线程的一个或多个第一执行部分,而序列401b可能对应于同一应用112的另一版本的进程/线程的一个或多个第二执行部分。在该第二示例中,由于代码改变、编译器改变、编译器设置改变、处理器ISA改变等中的一项或多项,应用112的版本可能不同。如在下文中将变得清楚的,序列400可以表示使用相同的输入数据集/条件或完全不同的数据集/条件来执行应用112。
转向图4B,示例400b示出了分组组件115可以将可执行指令的每个序列400分组为相关连续可执行指令的不同组/段。在示例400b中,分组组件115最初将序列400分组为作为公共函数的部分一起被执行的可执行指令的部分。在示例400b中,在序列401a上,分组组件115已经标识出作为函数402a的部分而执行的可执行指令序列,而在序列401b上,分组组件115已经标识出作为函数402b的部分而被执行的可执行指令序列。在示例400b中,函数402由函数名称(即,a、b、c等)连同函数参数被标识,这些函数参数被符号表示为“(…)”。因此,在示例400b中,分组组件115已经利用代码的逻辑结构来标识在逻辑上相关的连续可执行指令的分组/段,因为它们已经作为公共函数一起执行。
在实施例中,分组组件115在标识作为公共函数而执行的指令序列时可以是灵活的。例如,分组组件115可以定义“函数”以对应于在可执行实体的源代码中定义的那些函数。如果调试符号可用于调试组件109,则该定义可能特别有用,因为函数名称和参数通常在调试符号内是可标识的。然而,分组组件115可以附加地或备选地更灵活地将“函数”定义为从定义的起点到定义的终点执行的任何指令序列。例如,这可能是从进入源代码函数到退出源代码函数、在两个跟踪事件之间(例如,Windows的事件跟踪、或类似的跟踪技术)、在不同的函数调用之间(例如,openwindow()到closewindow())、从线程开始到线程退出等。当使用更灵活的函数定义时,分组组件115可以合成函数名称(例如,使用计数器、按指令计数、按堆栈帧计数等)并且将函数的指令序列所消耗的任何输入标识为函数的参数。当调试符号可用和不可用时,都可以使用函数的灵活定义。例如,如果调试符号对于可执行实体不可用,则分组组件115可以将函数定义为实体的导出函数。
如上所述,在实施例中,分组组件115标识分组/部分的分层布置。转向图4C,示例400c示出了分组组件115可以利用代码的层次结构将示例400c中所示的函数402进一步分组为更高等级的组403。例如,在示例400c中,函数402a被分组为模块A、B和K,并且函数402b被分组为模块A、B、X和K。更具体地,函数402a被分组为:组403a-1,其包括作为模块A的部分而执行的函数序列(即,a、b和c);组403a-2,其包括作为模块B的部分而执行的函数序列(即,a、x和y);组403a-3,其包括作为模块A的一部分而执行的函数序列(即,a、z和x);以及组403a-4,其包括作为模块K的部分而执行的函数序列(即,a和b)。类似地,函数402b被分组为:组403b-1,其包括作为模块A的部分而执行的函数序列(即,a、z和c);组403b-2,其包括作为模块B的部分而执行的函数序列(即,a、x和z);组403b-3,其包括作为模块X的部分而执行的函数序列(即,a、z和x);以及组403b-4,其包括作为模块K的部分而执行的函数序列(即,a和b)。虽然示例400c示出了两级层次结构(即,模块和函数),但在实施例中,分组组件115可以创建具有任何级数。
图4A至图4C示出了用于区分的两个可执行指令序列400(即,左侧的序列401a和右侧的序列401b),包括示例分组。在这些示例中,调试组件109将执行一对一(1:1)区分(即,一侧的一个指令序列与另一侧的另一指令序列)。在实施例中,调试组件109可以执行一对多(1:N)区分(即,一侧的一个指令序列与另一侧的N个指令序列)和/或多对多(M:N)区分(即,一侧的M个指令序列与另一侧的N个指令序列)。当执行1:N或M:N区分时,调试组件109可能会使用对准组件116,这将在后面讨论。
至少基于由分组组件115标识的分组,区分组件117将一个或多个第一指令序列与一个或多个第二指令序列进行比较,以标识那些指令之间的共同点和差分。在实施例中,区分组件117不是比较确切的指令序列,而是比较由分组组件115标识的指令的逻辑分组。因此,在很多方面,区分组件117比较作为组的可执行指令序列总体表现如何,而不是比较执行的确切指令序列(例如,逐指令)。正如将要解释的,这种基于分组的区分极大地降低了区分的计算复杂性(例如,与逐指令比较执行的确切指令序列相比)。此外,如还将解释的,这种基于分组的区分使得区分组件117能够提供新的和独特的能力,诸如比较在完全不同的处理器ISA上执行的可执行指令序列(例如,作为应用112的x86构建的部分而执行的指令序列与作为应用112的ARM构建的部分而执行的指令序列)的能力。
如图所示,区分组件117包括差分组件117a,差分组件117a基于由分组组件115标识的那些序列内的分组来比较不同的指令序列。在实施例中,差分组件117a利用度量,例如编辑距离(例如,莱文斯坦(Levenshtein)距离),用于标识一个指令序列中的组与另一指令序列中的组相比如何。通常,编辑距离是衡量将一个序列变换为另一序列所需要的(多个)单项编辑(例如,插入、删除或替换)的最小成本的度量。例如,下面的表1和表2提供了两种考虑字符串FILES和FRIES的编辑距离的示例方法,其中被比较的个体项是字符串中的个体字符:
在这两个表中,可以认为“F”、“E”和“S”字符在两个字符串之间是相等的(=)。然而,在表1中,FILES中的第二和第三字符被认为被FRIES中的第二和第三字符替换(R)——即,FILES中的“I”和“L”字符分别被替换为“R”和FIRES中的“I”字符。另一方面,在表2中,FRIES中的“R”字符被认为是插入(+),而FILES中的“L”字符被认为是删除(-)。因此,在表2中,“I”字符被认为在两个字符串之间是相等的。
决定表1中的编辑还是表2中的编辑是两个字符串之间的“最小”编辑距离取决于每个编辑如何加权。例如,如果相等/等效字符的权重为0,如果添加和删除的各自权重为2,如果替换的权重为1(即,替换优先于添加和删除),则将选择表1的编辑。这是因为表1的编辑距离为2,而表2的编辑距离为4,因此表1的编辑距离较小。另一方面,如果添加和删除的权重分别为1,而替换的权重为2(即,添加和删除优先于替换),则将选择表2的编辑。这是因为针对表1的编辑距离为4,而针对表2的编辑距离为2,因此表2的编辑距离较小。
在实施例中,差分组件117a将以下属性中的一个或多个属性应用于编辑距离:
1.d(x,x)=0;即,相等/等效项之间的编辑距离为零。
2.d(x,y)=d(y,x);即,无论比较的方向如何,两个项之间的编辑差分都是相同的。例如,计算FILES与FRIES之间的编辑差分将产生与计算FRIES与FILES之间的编辑差分相同的值。
3.d(a,b)+d(b,c)>=d(a,c);即,第一项与第二项之间的编辑距离加上第二项与第三项之间的编辑距离等于或大于第一项与第三项之间的编辑距离。
在某些情况下,差分组件117a可能会放宽第二要求。在这些情况下,由差分组件117a计算的值可能不被严格地认为是“编辑距离”。然而,通过放宽第二要求,例如,差分组件117a可以考虑添加比删除更昂贵(即,使得删除优于添加)。将编辑距离应用于代码跟踪时,这可能表示添加行为(例如,回归)可能被认为比删除行为(例如,回归)更昂贵。
如上所述,差分组件117a可以基于由分组组件115标识的组来执行差分,而不是逐指令地区分指令流,这可以大大降低区分的计算复杂度。例如,如果差分组件117a将序列401a和401b中的每个指令视为个体项目以进行比较(例如,很像上面示例中的个体字符),并且使用标准技术计算这些指令之间的编辑距离,则算法复杂度将为O(Y*Z)(使用众所周知的“Big-O”算法复杂性符号和算法的标准实现),其中Y和Z是每个被比较的序列401中的指令数。通过限制搜索深度使得只有与阈值内相似的指令流可以成功比较,这种复杂性可能会改善到O(Y+Z)+d,其中d指示阈值。如前所述,由于现代微处理器通常以数万到数十万MIPS的速度执行,因此仅几秒钟的执行时间就可以记录数十亿条指令的执行。因此,在计算资源和所需时间方面,基于个体指令的区分可能很快变得异常昂贵。但是,通过基于组进行区分,分析可以将指令组一起区分,从而无需完全比较跟踪中的个体指令。此外,基于组来执行差分提供了智能地选择序列401的哪个(哪些)部分被实际比较以及在什么粒度等级上进行比较的机会,进一步减少了可能需要执行的工作量。因此,与逐指令区分相比,本文中的技术可能仅分析/比较跟踪数据量的小部分。
在实施例中,差分组件117a通过在可以应用编辑距离的对象符号中表示那些组来基于组执行区分。当存在组的层次结构时,差分组件117a可以在任何分组等级处执行该差分。为了演示这些概念,图5A至图5D示出了差分组件117a比较来自图4C的示例400c的组403的示例操作。从图5A开始,示例500a示出了来自图4C的每个组403的示例基于字符串的差分符号。在示例500a中,每个组403被表示为字符串,字符串包括模块名称、针对模块的入口函数的名称和针对模块的退出函数的名称,各自都由感叹号(!)分隔。因此,在序列401a中,组403a-1由字符串“A!a!c”表示,组403a-2由字符串“B!a!y”表示,组403a-3由字符串“A!a!x”,组403a-4由字符串“K!a!b”表示。在序列401b中,组403b-1由字符串“A!a!c”表示,组403b-2由字符串“B!a!z”表示,组403b-3由字符串“X!a!x”,组403b-4由字符串“K!a!b”表示。值得注意的是,示例500a中使用的符号仅是一个示例,并且可以理解可以使用多种符号。例如,组403a-1可以备选地表示为字符串“A!a:c”、字符串“A:a>c”、字符串“A:a:c”、字符串“A:a,c”等,同时捕获相同的信息。
基于这些组表示,差分组件117a在序列401a与401b之间确定一个序列401中的组403是否等于另一序列401中的对应组403、与另一序列401相比是否在一个序列401中插入/添加组403、与另一序列401相比是否在一个序列401中删除/减去组403、或者一个序列401中的组403是否是另一序列401中的对应组403的替换。在该上下文中,“相等”组不仅可以包括完全相同执行的组(即,每个组中的指令序列相同),而且还可以包括等效执行的组——即使每组中执行的精确指令序列不同。因此,即使这些指令来自不同的处理器ISA、来自应用的不同构建/版本等,也可以将两组指令视为“相等”(或“等效”)。
转向图5B,示例500b示出了基于这些差分符号的示例组比较状态。特别地,示例500b示出了差分组件117a可以确定——至少当在组403的水平上进行差分时——序列401a上的组403a-1等于(等效于)序列401b上的组403b-1,组403a-序列401a上的2被序列401b上的组403b-2替换,序列401a上的组403a-3被序列401b上的组403b-3替换,并且序列401a上的组403a-3等于(等效于)序列401b上的组403b-4。在该示例中,差分组件117a可能具有加权替换,因为其优于插入和删除。由于差分组件117a已经比较了组的符号表示,而不是组中的个体指令的序列,所以这种比较可能占用比比较个体指令的序列所需要的计算资源的小部分。
如本领域普通技术人员将认识到的,前述相等/等效的确定(例如,在组403a-1和403b-1与组401a-4和403b-4之间)仅表明每个组集以执行相同的模块和函数(即,A!a)开始,并且以执行相同的模块和函数(即,A!c)结束。虽然这可能是相等/等效的不精确指示(例如,组403a-1还执行函数b,而组403b-1改为执行函数z),但由于程序代码的结构化性质,表明该等级的相等/等效性可能足以提供应用112的一个跟踪与应用112的另一跟踪相比如何的行为概览。例如,即使组403a-1和403b-1可能在内部有所不同,但它们以相同的函数(即,A!a)开始并且以相同的函数(即,A!c)结束。当呈现程序执行流程的概述时,特别是作为更高等级的粒度(例如,在模块等级)时,这可能足以传达行为的相似性和差分。例如,如果模块A是存储器分配库,则在这两种实例中,该模块可能已经被调用(例如,使用导出的函数,a)并且请求特定数量的存储器,并且可能已经退出(例如,使用内部函数,c)并且具有成功指示和/或带有指针。因此,即使模块内部执行的特定工作存在分歧,两个跟踪中的模块的整体行为也是相似的。
在实施例中,当比较两个组的相等性/等效性时,差分组件117a还可以考虑数据,例如组的输入和输出。例如,返回组403a-1和403b-1的示例,除了比较组对象符号(例如,每个组的字符串“A!a!c”)之外,差分组件117a还可以标识和比较组的输入(如果有)和输出。例如,差分组件117a可以标识由组403a-1和403b-1中的指令读取的输入存储器值(如果有)、以及由组403a-1和403b-1中的指令写入的输出存储器值。然后,差分组件117a可以跨序列401比较这些值。如果组403a-1和403b-1两者都读取相同的输入值,并且如果组403a-1和403b-1都写入相同的输出值,则差分组件117a可能对基于比较对象符号(例如,每个组的字符串“A!a!c”)来确定这些组之间的相等/等效具有高置信度。注意,即使这些组执行不同的中间函数(例如,组403a-1b中的函数b与组403b-1中的函数z),这也可能是正确的。这是因为当给定相同的输入时,组403a-1和403a-1两者都产生相同的输出,即使这些组用于达到这些输出的处理可能已经发散。
如上所述,当存在组层次结构时,差分组件117a可以在任何分组等级执行差分。因此,例如,图5B所示的比较状态可能是由差分组件117a的第一通过(pass)产生的初始比较状态。基于该初始比较状态,差分组件117a可以使用层次结构中较低的分组进行一个或多个附加通过。例如,差分组件117a可以进一步比较组403a-1和403b-1内的子分组以确定相等/等效的初始确定是否准确。因此,例如,差分组件117a可以比较那些组内的个体函数序列。为了说明,差分组件117a可以确定,在组403a-1和403b-1内,序列401a上的函数A!a等于序列401b上的函数A!a,序列401a上的函数A!b被序列401b上的函数A!z替换,并且序列401a上的函数A!c等于序列401b上的函数A!c。由于在该第二通过中,差分组件117a确定序列401a上的函数A!b被序列401b上的函数A!z替换,差分组件117a可以将组403a-1和403b-1的比较状态更新为是替代,而不是相等/等效。可以以多种方式触发对组403a-1和403b-1的该附加通过的执行。例如,差分组件117a可以对最初确定为相等的任何组执行附加通过,以便验证该状态。在另一示例中,差分组件117a可以仅对用户特别请求的组执行附加通过。
图5A和图5B所示的示例只是差分组件117a可能进行比较的一种方式。例如,不同于最初仅使用组中的开始和结束函数作为比较的部分,差分组件117a可能已经使用了每个组中的所有函数。因此,例如,差分组件117a可能已经比较了针对组503a-1的字符串“A!a!b!c”与针对组503a-1的字符串“A!a!z!c”,可能已经比较了针对组503a-2的字符串“B!a!x!y”与针对组503a-2的字符串“B!a!x!z”等。此外,图5A和图5B中的示例展示了具有两级指令分组(即,模块->函数)的层次结构。然而,分组组件115可能已经标识出具有一个或多个附加等级的分组(例如,模块->类->函数)的层次结构,并且差分组件117a可能包括这些(多个)附加等级作为其分析的部分。例如,差分组件117a可以在模块等级进行第一通过,可以在类等级处进行第二通过(针对模块的至少一个子集),并且在函数等级处进行第三通过(针对至少一个类的子集)。此外,图5A和图5B中的示例仅使用函数名称作为比较的部分。在实施例中,差分组件117a还可以包括函数参数信息作为比较的部分(例如,参数名称、参数类型、参数计数等)。例如,用于表示组503a-1的符号可能是字符串“A!a[height,width]!b[status]”(即,使用参数名称)、字符串“A!a[int,int]!b[bool]”(即,使用参数类型)、字符串“A!a!b”(即,使用参数计数)等。
在实施例中,差分组件117a在进行编辑距离确定时将权重应用于不同的分类类型。例如,差分组件117a可能对插入和删除的权重不同于替换,甚至可能对插入和删除的权重不同。在实施例中,差分组件117a还可以将不同的权重应用于组的标识对象的不同组件。例如,当使用形式为module!entry!exit的字符串表示组时,差分组件117a可以比较这些字符串的个体组件(例如,模块与模块、入口函数与入口函数、以及退出函数与退出函数),并且对这些组件应用不同的权重。例如,差分化组件117a可能与它对函数分配的权重相比给模块分配更大的权重。然后,例如,如果针对两个组的模块相同,但函数存在差分,则可以使用该加权来确定应将编辑分类为替换还是插入/删除。这种加权甚至可以更精细地应用于诸如参数信息(例如,名称、类型、计数等)。
在实施例中,差分组件117a智能地适应在比较数据集之间标识的差分。例如,差分组件117被示出为包括变换组件117b。在实施例中,变换组件117b与差分组件117a互操作以在计算差分之前基于对至少一个指令序列的已知变化应用一个或多个变换。例如,假定在应用的已更新构建中,模块、类、函数等被全局重命名。虽然如果执行得当,这样的全局重命名不应当影响应用的执行行为,但是这种重命名可能导致差分组件117a标识从行为的角度来看实际上无关紧要的差分。因此,变换组件117b可以应用变换以避免这种“错误”差分。参考图5B,例如,组403a-3和403b-3被示出为具有替换状态。如将理解的,这是因为差分组件117a将A!a!x与X!a!x进行了比较。然而,如果已知在用于生成序列401b的跟踪应用112的构建中,模块A被重命名为模块X,则变换组件117b可能在差分组件117a进行比较之前将组403b-3的符号从X!a!x变换为A!a!x。因此,当在变换之后执行其分析时,差分组件117a会将这些组分类为相等,而不是替换。以这种方式,变换组件117b可以帮助减少“噪声”并且将所标识的差分集中在那些从行为的角度来看可能实际上很重要的差分上。
除了基于组身份和编辑距离来比较组之外,如已经描述的,差分组件117a还可以利用仿真比较组件117c来确定不同函数中的指令序列是否实际等效地执行。在实施例中,如果两个指令序列在给定相同输入时产生相同输出,则不同指令序列等效地执行。因此,作为比较函数的部分,仿真比较组件117c可以标识每个比较函数的零个或更多个输入、以及来自比较函数的零个或更多个输出。然后,基于向每个比较函数的输入提供另一比较函数的代码,仿真比较组件117c可以利用仿真组件111对该代码进行仿真以确定是否存在代码等效性。在实施例中,仿真比较组件117c利用在于2019年3月19日提交的题为“EMULATINGNON-TRACED CODE WITH A RECORDED EXECUTION OF TRACED CODE(利用已记录的跟踪代码执行来模拟非跟踪代码)”的申请人的共同未决申请美国专利No.5,500,45中描述的一种或多种技术。
图5C和图5D展示了仿真比较组件117c的操作,其基于利用代码仿真和输入/输出比较来确定不同被跟踪指令序列上的函数是否被等效地执行。参考图5C,示例500c表明,在序列401a上,来自组403a-1的函数A!b的代码405a具有输入404a和输出406a。此外,示例500c表明,在序列401b上,来自组403b-1的函数A!z的代码405b具有输入404b和输出406b。为了比较代码405a和405b的等效性,图5D中的示例500d演示了仿真比较组件117c可以使用输入404a(即,来自序列401a)来仿真代码405b(即,来自序列401b),这将导致一些输出407。示例500d还演示了仿真比较组件117c还可以使用输入404b(即,来自序列401b)来仿真代码405a(即,来自序列401a),这将导致一些输出408。仿真比较组件117c然后可以确定输出407和408是否指示代码405a与405b之间的等效性。例如,如果输出407与输出406a相同,并且如果输出408与输出406b相同,则代码405a和405b等效地执行。在这种情况下,差分组件117a可以确定组403a-1中的函数A!b和组403a-2中的函数A!z彼此等效(例如,而不是替换或插入/删除)。如果输出407与输出406a不同和/或输出408与输出406b不同,则代码405a和405b不是等效地执行。在这种情况下,差分组件117a可能确定组403a-1中的函数A!b和组403a-2中的函数A!z彼此不等效(例如,因此是替换或插入/删除)。
值得注意的是,仿真比较组件117c可以确定来自不同序列的不同代码是否等效,即使这些序列在不同处理器ISA上执行和/或这些序列是否从应用112的不同构建/版本执行。这是因为仿真比较组件117c基于比较指令序列的行为(即,它们如何变换输入数据以产生输出数据)而不是基于比较执行的实际指令来标识等效性。
使用所讨论的技术,仿真比较组件117c可以确定代码的不同部分是否等效地执行,即使该代码的输入不同。例如,仿真比较组件117c可以确定代码405a和405b是否等效地执行,即使输入404a不同于输入404b。如果输入不同,则调试组件109可以确定输入不同的原因。例如,调试组件109可以向后处理每个跟踪,以确定输入值的来源(即,它们被写入用作输入的存储器位置的位置)。
区分组件117也被示出为包括传递分析组件117d和排序/相关组件117e。在实施例中,这些组件在执行1:N或M:N区分时使用,并且将在后面讨论。
输出组件118可以提供由区分组件117进行的比较结果的一个或多个标记。这可以包括将一个或多个标记提供给计算机系统101处的软件组件,或者提供给另一计算机系统(例如,使用(多个)网络设备105)。标记可以指示由区分组件117针对由分组组件115标识的一个或多个组而确定的比较状态。在实施例中,基于由输出组件118产生的标记,软件组件在用户界面处呈现由区分组件117的比较结果。例如,用户界面可以提供每个序列401上组的并排可视的表示,以指示这些组在哪里相等、插入、删除等。例如,表3说明了图5B中的组可能通过对准相等的组并且指示哪些组是替换的而并排呈现。在表3中,替换使用括号表示,尽管用户界面可以以多种方式(例如,颜色、阴影、粗体等)提供这样的指示。
A!a!c | A!a!c |
(B!a!y) | (B!a!z) |
(A!a!x) | (X!a!x) |
K!a!b | K!a!b |
表3
在实施例中,用户界面可以视情况而在可视地应用移位。例如,假定组403b-3(即,X!a!x)在任何所示示例中都不存在。在这种情况下,组403a-2(即,B!a!y)和403a-3(即,A!a!x)的组合可以一起被认为是组403b-2(即,B!a!z)的替换。表4说明,在这种情况下,用户界面可能会在可视地将组403b-4(即,K!a!b)向下移位呈现的右侧以适应该替换。
A!a!c | A!a!c |
(B!a!y) | (B!a!z) |
(A!a!x) | |
K!a!b | K!a!b |
表4
通过以这种方式应用可视的移位,用户界面可以使用户能够快速标识两个序列401执行相似的区域、以及两个序列401执行不同的区域。在实施例中,为了提供更精简的视图,用户界面可以提供可视的扩展和折叠部分不相等的能力。
鉴于前述使用调试组件109执行1:1执行跟踪区分(即,一侧的指令序列与另一侧的另一指令序列)的讨论,图6示出了用于将主题可重放执行跟踪与比较可重放执行跟踪进行区分的示例方法600。现在将在图1至图5D的上下文中描述方法600。尽管为了便于描述,方法600的动作以特定的顺序示出,但是应当理解,这些动作中的一些可以以不同的顺序和/或并行实现。
如图6所示,方法600包括访问主题跟踪和比较跟踪的动作601。在一些实施例中,动作601包括访问第一主题可重放执行跟踪,该第一主题可重放执行跟踪表示作为第一执行实体的部分而执行的第一可执行指令序列,并且访问第二比较可重放执行跟踪,该第二比较可重放执行跟踪表示作为第二执行实体的部分而执行的第二可执行指令序列。例如,跟踪访问组件114a可以访问两个或更多个执行跟踪113、或同一执行跟踪113的两个不同部分,其记录应用112的一个或多个先前执行。如果存在多个执行跟踪113,则第一执行实体和第二执行实体可能已经从公共可执行代码(例如,应用112的相同版本)或从不同可执行代码(例如,应用112的不同版本或不同构建)执行。在实施例中,(多个)被访问的执行跟踪113表示先前执行的可执行指令序列,和/或可以表示可以执行的可执行指令序列(即,合成跟踪)。因此,本文中使用过去时术语“已执行”还可以指代可以执行的指令序列,即使它们之前实际上并未执行。例如,图4A说明了两个可执行指令序列——即序列401a和序列401b。序列401a和401b可以分别对应于被访问的第一可执行指令序列和第二可执行指令序列。
方法600还包括标识对象内的函数和比较跟踪的动作602。在一些实施例中,动作602包括:标识第一可执行指令序列内的第一多个函数、以及标识第二可执行指令序列内的第二多个函数,每个函数对应于作为函数的部分而执行的一个或多个可执行指令的序列。例如,对于序列401a和401b中的每个序列,分组组件115可以标识作为公共函数一起执行的连续指令的组或部分。例如,图4B示出了分组组件115可以标识序列401a上的第一多个函数402a和序列401b上的第二多个函数402a。在图4A中,这些函数402被示出为具有函数名称(例如,a、b、c等)和可能的一些函数参数(例如,指示为“(…)”)。因此,作为动作602的部分,标识第一多个函数和标识第二多个函数可以包括:针对第一多个函数和第二多个函数中的每个函数标识函数名称、函数参数名称、函数参数类型或函数参数计数中的至少一项。
方法600还包括:标识对象内的函数的分组和比较跟踪的动作603。在一些实施例中,动作603包括:标识第一多个函数的第一多个组,以及标识第二多个函数的第二多个组,每个组包括一个或多个相关函数的序列。例如,如图4C所示,分组组件115可以标识逻辑相关的函数组,诸如作为公共模块一起执行的函数。例如,图4C示出了序列401a上的第一多个组403a-1至403a-4、以及序列401b上的第二多个组403b-1至403b-4。虽然图4C的示例400c提供了基于模块的分组,但这些分组可以基于任何逻辑代码结构。例如,在动作603中,每个组可能对应于库、模块、命名空间或类中的一种;在这种情况下,每个相关函数都将作为对应库、模块、命名空间或类的部分来执行。如所讨论的,分组组件115可以标识包括任何数目的组的层次结构。例如,如果第一多个组和第二多个组对应于模块(如图4C所示),则更高等级的组可能对应于库,其中每个更高等级的组包括作为公共库的部分而一起执行的一个或多个模块的序列。
方法600还包括:比较分组以标识主题跟踪中的组的动作604,该组等于、替换、插入比较跟踪中的组中和/或从比较跟踪中的组中删除。在一些实施例中,动作604包括比较第一多个组和第二多个组,包括基于每个组的身份和与该组相对应的一个或多个函数来确定第一多个组中的每个第一组是否是以下至少一项:等于第二多个组中的第二组;是第二多个组中的第二组的替换;从第二多个组中被删除;或插入第二多个组中。例如,区分组件117可以利用差分组件117a将第一多个组中的组与第二多个组中的组进行比较,以将每个第一组分类为在第二组中具有相同的值,作为第二多个组中的第二组的替代,与第二多个组相比被插入第一多个组中,或者与第二多个组相比从第一多个组中删除。差分组件117a还可以以另一方式进行比较——即,通过将第二多个组中的组与第一多个组中的组进行比较,以将每个第二组分类为在第一组中具有相同的值,作为第一多个组中的第一组的替代,与第一多个组相比插入第二多个组中,或者与第一多个组相比从第二多个组中删除。在实施例中,差分组件117a针对每个组计算“编辑距离”,并且选择在两个多个组之间产生最小总编辑距离的单组编辑的组合。
在实施例中,比较第一多个组和第二多个组包括:创建第一多个对象,第一多个对象各自表示第一多个组中的一个组,以及创建第二多个对象,第二多个对象各自表示第二多个组中的一个组,每个对象标识该组和该组的一个或多个对应函数,并且在第一多个对象与第二多个对象之间应用差分算法。对象可以采用多种形式,例如层次结构、字符串等。在实施例中,对象可以分别表示模块、函数等,其方式使得这些个体组件能够跨两个不同对象进行比较(例如,对象A中的模块到对象B中的模块、对象A中的函数到对象B中的函数等),并且其方式使得个体组件能够单独加权。为简单起见,本文中的示例以字符串的形式呈现对象。例如,如图5A所示,差分组件117a可以通过模块名称和作为模块的部分而执行的一个或多个函数的名称来表示组(例如,组针对503a-1的字符串A!a!c、针对组503a-2的字符串B!a!y等)。在该示例中,每个对象标识组和该组的多个对应函数,其中多个对应函数按执行顺序排序。此外,在该示例中,多个对应函数各自仅包括按执行顺序执行的第一函数和最后的函数。比较第一多个组和第二多个组还可以包括比较以下至少一项:函数参数名称、函数参数类型或函数参数计数。因此,这些对象也可能包含参数信息。另外,当比较第一多个组和第二多个组时,该比较可能对每个组的身份的加权不同于与该组相对应的至少一个函数的身份。
如上所述,在用差分组件117a计算差分之前,差分组件117还可以利用变换组件117b基于对比较指令序列中的至少一个指令的已知变化应用一个或多个变换。例如,如果与用于生成序列401a的应用112的版本相比,在用于生成序列401b的应用112的版本中存在全局重命名,则在用差分组件117a进行比较之前,变换组件117b可以对序列401b或从其生成的数据应用变换。因此,动作604可以包括,当比较第一多个组和第二多个组时,将一个或多个变换应用于第一可重放执行跟踪或第二可重放执行跟踪中的至少一个的至少子集。
如还提到的,区分组件117还可以利用仿真比较117c来确定不同跟踪上的函数中的实际指令是否等效地执行。因此,动作604可以包括:确定与第一多个组中的第一组相对应的第一函数是否等效于与第二多个组中的第二组相对应的第二函数执行。如所讨论的,仿真比较117c可以基于使用针对一个指令序列中的函数的输入来仿真来自另一指令序列中的函数的代码,反之亦然,并且分析所产生的输出,来完成这样的确定。因此,确定第一函数(例如,组401a-1中的A!b)是否等效于第二函数(例如,组403b-1中的A!z)执行可能包括:标识第一函数(例如,代码405a)的零个或更多个第一输入(例如,输入404a)和来自第一函数的一个或多个第一输出(例如,输出406a),并且标识第二函数(例如,代码405b)的零个或更多个第二输入(例如,输入404b)和来自第二函数的一个或多个第二输出(例如,输出406b)。该确定还可以包括:基于向第二函数提供零个或更多个第一输入(例如,输入404a)以生成一个或多个第三输出(例如,输出407)来重放第二函数(例如,代码405b),并且基于向第一函数提供零个或更多个第二输入(例如,输入404b)以生成一个或多个第四输出(例如,输出408)来重放第一函数(例如,代码405a)。该确定还可以包括:将第一输出(例如,输出406a)与第三输出(例如,输出407)进行比较,以及将第二输出(例如,输出406b)与第四输出(例如,输出407)进行比较。
方法600还包括提供比较的结果的标记的动作605。在一些实施例中,动作605包括向计算机系统处的软件组件或向另一计算机系统提供比较结果的一个或多个标记,该一个或多个标记指示每个第一组是否是以下至少一项:等于第二多个组中的第二组,是第二多个组中的第二组的替换,从第二多个组中被删除,或插入到第二多个组中。例如,输出组件118可以向计算机系统101处的组件或向另一计算机系统提供由区分组件117产生的任何差分信息的标记(例如,使用(多个)网络设备105)。在实施例中,提供确定结果的一个或多个标记使软件组件在用户界面处呈现确定的结果。例如,如表3和表4所示,基于由分组组件115标识并且由区分组件117进行比较的组,用户界面可以提供两个指令序列的并排可视的比较。如上所述,这可能包括提供可视的扩展和折叠不相等部分的能力。因此,呈现比较的结果可以包括:在可视地折叠不等于第二多个组中的第二组的第一多个组的序列。
虽然到目前为止主要在执行1:1区分的上下文中描述了调试组件109(即,比较一侧的一个指令序列与比较另一侧的另一指令序列),如所指示的,在实施例中,调试组件109可以执行1:N区分(即,一侧的一个指令序列与另一侧的N个指令序列)和/或M:N区分(即,在一侧的M个指令序列与另一侧的N个指令序列)。例如,在1:N区分情况下,调试组件109可以将使用应用112的测试构建所捕获的单个跟踪与使用应用112的生产构建所捕获的多个跟踪进行比较,或者可以区分在测试环境中捕获的单个跟踪与在生产环境中捕获的多个跟踪。为了说明,图7A示出了1:N跟踪比较的示例700a,其中比较的左侧有单个指令序列,而比较的右侧有两个或更多个不同的指令序列。在M:N情况下,调试组件109可以将使用应用112的测试构建所捕获的多个跟踪与使用应用112的生产构建所捕获的多个跟踪进行区分,或者可以将测试环境中所捕获的多个跟踪与在生产环境中所捕获的多个跟踪进行区分。图7C示出了M:N跟踪比较的示例700c,其中比较的两侧存在多个指令序列。
当在比较的至少一侧涉及多个跟踪时,调试组件109可以在由区分组件117执行比较之前利用对准组件116。对准组件116使得能够在比较的一个或多个侧使用部分跟踪。图7A在右侧示出了两个完整的跟踪,图7C在左侧和右侧示出了两个完整的跟踪。在这些情况下,每个执行跟踪113记录可比较的执行覆盖率。例如,每个执行跟踪113可能每个都记录应用112从开始到结束的完整执行,在这种情况下,调试组件109可以比较该完整执行。在另一示例中,每个执行跟踪113可能各自都记录应用112的特定子组件从开始到结束的完整执行,在这种情况下,调试组件109可以比较该子组件的完整执行。然而,可能存在执行跟踪113记录应用执行的不同片段的情况,例如线程转变之间,从用户模式到内核模式的转变之间,仅针对特定模块或函数,仅针对跟踪计算机系统有足够的计算资源来允许跟踪记录的时间等。
对准组件116可以基于那些跟踪之间的共性(例如,可比较的分组序列)对准两个或更多个部分跟踪,以提供比那些部分跟踪中的每个部分跟踪个体地提供的更完整的跟踪覆盖。例如,图7B示出了1:N跟踪比较的示例700b,其中比较的右侧由对准组件116对准的多个部分跟踪组成,以便可以与比较左侧的指令序列进行完整比较。图7D示出了M:N跟踪比较的示例700d,其中在比较的两侧使用部分跟踪。值得注意的是,在比较的给定侧,部分跟踪可以与完整跟踪结合使用。例如,在图7D中,比较的右侧使用了一个完整跟踪和两个部分跟踪。
对准组件116被示出为包括精确匹配组件116a和近似匹配组件116b。这些组件116a、116b表明对准组件116可以利用多种技术来确定两个或更多个跟踪如何对准。例如,使用精确匹配组件116a,对准组件116可以利用最短公共超序列算法,该算法将两个序列作为输入,并且找到那些输入序列的最短可能公共超序列。另一方面,使用近似匹配组件116b,对准组件116可以利用在匹配输入序列时允许间隙的算法,例如尼德曼-翁施(Needleman-Wunsch)算法。不管使用的匹配类型如何,对准组件116都可以基于由分组组件115标识的指令组(例如,函数、模块等)而不是基于匹配个体指令来执行其匹配。
如上所述,区分组件117可以包括传递分析组件117d和排序/相关组件117e,它们在执行1:N和M:N区分时使用。在实施例中,传递分析组件117d利用等式的传递属性(即,如果A=B并且B=C,则A=C)以通过减少由差分组件117进行的复杂分析来减少由差分组件117执行的处理量。具体地,对于两个或更多个跟踪给定集,传递分析组件117d标识两个或更多个跟踪的哪些部分是等效的,以便传递分析组件117d对集中跟踪中的一个跟踪进行分析可以应用于集中的(多个)其他跟踪。以这种方式,区分组件117可以专注于分析跟踪的不同部分,而不是分析跟踪上的重复部分。为了说明,假定在比较的一侧有四个执行三个指令部分的跟踪(例如,函数),如表5所示:
T1 | T2 | T3 | T4 | |
1: | A | A | A | A |
2: | B | D | X | B |
3: | C | C | C | C |
表5
在表5中,具有相同标签(例如,A、B、C等)的部分等效执行。因此,在位置1处,跟踪T1上的部分A等效于跟踪T2上的部分A,跟踪T2上的部分A等效于跟踪T3上的部分A,跟踪T4上的部分A等效于跟踪T4上的部分A。通过等式的传递性质,跟踪T1上的部分A也等效于跟踪T3上的部分A和跟踪T4上的部分A,跟踪T2上的部分A也等效于跟踪T4上的部分A等等。在位置3处,部分C也是如此,因为它涉及跟踪T1、T2、T3和T4。在位置2处,唯一相等的是跟踪T1上的部分B和跟踪T4上的部分B。
该等式可以被视为一映射集,其中每个映射标识跨多个跟踪等效执行的对应部分。第一映射可能将位置1处的部分A映射到跟踪T1、T2、T3和T4,第二映射可能将位置2处的部分B映射到跟踪T1和T4,第三映射可能将位置3处的部分C映射到跟踪T1、T2、T3和T4。基于这些映射,可以标识不同的部分。例如,跨跟踪T1、T2、T3和T4的不同部分集可能是:跟踪T1上的部分A、跟踪T1上的部分B、跟踪T2上的部分D、跟踪T3上的部分X和跟踪T1上的部分C。因此,在实施例中,差分组件117可以将其分析集中在这些不同部分上,并且使用传递属性来跨跟踪应用该分析。
当执行1:N区分时,排序/相关组件117e可以基于在主题执行跟踪与多个比较执行跟踪之间出现这些差分的频率,对主题执行跟踪与多个比较执行跟踪之间的标识的差分进行排序。基于这些排序,排序/相关组件117e可以帮助标识哪些差分可能被认为比其他差分更重要。例如,如果发现主题执行跟踪中的第一部分/组不同于多个比较执行跟踪的所有对应的部分/组,并且如果发现主题执行跟踪中的第二部分/组不同于小于多个对应跟踪的所有对应部分/组,则第一部分/组与比较执行跟踪之间的第一差分可能比第二部分/组与比较执行跟踪之间的第二差分排序更高。因此,第一差分可能被认为比第二差分更重要。
当执行M:N区分时,排序/相关组件117e可以确定主题部分组(跨多个主题执行跟踪选择)与比较部分组(跨多个比较执行跟踪选择)之间的哪些差分与属于组的特定部分高度相关。如本文中使用的,“比较部分”是跟踪的任何子集,其大到足以包含一个或多个可区分事件。例如,比较部分可能是一个函数或函数组(例如,模块、类等)。为了说明,如果比较部分是从函数调用到它的返回,则包含函数调用或函数返回的任何代码都是可区分的部分。即使首先按模块分组也是如此。值得注意的是,给定事件可能属于多个比较部分。例如,参考表5,比较部分可以包括A中的指令加上B中的指令,或者比较部分可以包括A中的后半部分指令加上B中的前半部分指令。如果间隙被允许,则比较部分甚至可以包括A中的前半部分指令加上B中的后半部分指令。
图8示出了用于将主题可重放执行跟踪与多个比较可重放执行跟踪进行区分(即,1:N区分)的示例方法800的流程图。现在将在图1A至图7D的上下文中描述方法800。虽然为了便于描述,方法800的动作以特定的顺序示出,但是应当理解,这些动作中的一些动作可以以不同的顺序和/或并行实现。
如图8所示,方法800包括访问主题跟踪和多个比较跟踪的动作801。在一些实施例中,动作801包括:访问主题可重放执行跟踪,以及访问多个比较可重放执行跟踪,每个可重放执行跟踪表示作为对应执行实体的部分而执行的对应可执行指令序列。例如,类似于方法600的动作601,动作801可以利用跟踪访问组件114a来访问执行跟踪113。然而,在动作801中,跟踪访问组件114a可以访问执行跟踪113作为主题执行跟踪,并且访问两个或更多个执行跟踪113作为比较执行跟踪。例如,参考图7A和图7B,跟踪访问组件114a可以访问一个执行跟踪113用于比较的左侧,并且访问两个或更多个执行跟踪113用于比较的右侧。
如上所述,调试组件109可以利用对准组件116来对准部分跟踪,例如在图7B的比较的右侧所示。因此,在动作801中,多个比较可重放执行跟踪中的至少一个比较可重放执行跟踪可以是部分跟踪,并且方法800可以包括使用对准组件116将该部分跟踪与多个比较可重放执行跟踪中的至少一个其他跟踪对准。在实施例中,将部分跟踪与多个比较可重放执行跟踪中的至少一个其他跟踪对准包括应用最短公共超序列对准算法(例如,精确匹配组件116a)或近似字符串对准算法(例如,近似匹配组件116b)中的至少一种算法。
方法800还包括标识比较跟踪之间等效执行的部分的映射的动作802。在一些实施例中,动作802包括:标识多个比较可重放执行跟踪之间的映射集,该映射集中的每个映射标识多个比较可重放执行跟踪内等效执行的连续可执行指令的两个或更多个对应比较部分,每个映射中的每个比较部分来自多个比较可重放执行跟踪中的不同一个比较可重放执行跟踪。例如,传递分析组件117d可以分析多个比较可重放执行跟踪以标识跨这些可重放执行跟踪的等效执行的对应部分。参考表5,例如,如果多个比较执行跟踪包括跟踪T1至T4,则传递分析组件117d可以标识位置1处的第一映射集(即,跟踪T1至T4上的部分A)、位置2处的第二映射集(即,跟踪T1和T4上的部分B),并且标识位置3处的第一映射集(即,跟踪T1至T4上的部分C)。
方法800还包括基于映射来标识比较跟踪中的不同部分的动作803。在一些实施例中,动作803包括基于该映射集标识多个比较可重放执行跟踪内的多个不同比较部分,每个不同比较部分(i)在该映射集中缺少映射,或(ii)作为该映射集中不同映射的代表性比较部分。例如,基于在动作802中标识的映射,传递分析组件117d可以标识多个比较执行跟踪内的不同部分以与主题执行跟踪中的部分进行比较。例如,再次参考表5,传递分析组件117d可以(i)将部分D(跟踪T2)和X(跟踪T3)标识为在该映射集中缺少映射的部分,并且(ii)将跟踪T1上的部分A、B和C标识为作为来自该映射集中不同映射的代表性比较部分的部分。值得注意的是,对于代表性部分A、B和C,传递分析组件117d可能已经从其他跟踪中备选地选择了这些部分。
值得注意的是,在动作803中,传递分析组件117d可能选择少于所有可能的不同比较部分。例如,传递分析组件117d最初可能选择关注发生在多于一个跟踪上的部分。在这种情况下,传递分析组件117d可能(至少在第一通过中)从该映射集中仅选择代表性比较部分并且跳过该映射集中缺乏映射的部分。因此,在动作803中,多个不同比较部分可能包括多个比较可重放执行跟踪内的少于所有不同比较部分。
方法800还包括将主题跟踪中的部分与比较跟踪中的不同部分进行比较的动作804。在一些实施例中,动作804包括比较主题可重放执行跟踪和多个比较可重放执行跟踪,包括至少将主题执行跟踪内的连续可执行指令的多个主题部分中的每个主题部分与多个不同比较部分中的一个或多个比较部分进行比较。例如,类似于方法600的动作604,动作804可以利用差分组件117a将主题执行跟踪中的主题部分与比较执行跟踪中的比较部分进行比较。然而,差分组件117a可以将它们与仅由传递分析组件117d标识为不同部分的那些比较部分进行比较,而不是将主题部分与每个比较执行跟踪中的比较部分进行比较。
方法800还包括使用传递属性来确定主题跟踪的每个部分与比较跟踪中的比较部分的比较状态的动作805。在一些实施例中,动作805包括基于比较确定多个主题部分中的每个主题部分的比较状态,包括确定每个主题部分是否以下至少一项:(i)等于至少一个对应不同比较部分,(ii)不同于多个不同比较部分,其中至少一个特定主题部分相对于至少一个特定对应的不同比较部分的所确定的比较状态被应用于每个附加比较部分,至少一个特定不同比较部分在映射集中被映射到该附加比较部分。例如,作为动作804的结果,差分组件117a可以确定每个主题部分的比较状态,因为它与对应不同比较部分相关。例如,差分组件117a可以确定主题部分等于或不同于对应不同比较部分。然后,基于传递属性,传递分析组件117d可以将该比较状态应用于比较执行跟踪中的其他对应比较部分。参考表5,例如,假定差分组件117a确定第一对象部分等于跟踪T1中的部分A,第二对象部分不同于跟踪T1中的部分B,并且第三对象部分是等于跟踪T1中的部分C。使用传递属性,传递分析组件117d可以将该状态应用于跟踪T2、T3和T4。例如,传递分析组件117d可以确定第一对象部分也等于跟踪T2至T4中的部分A,第二对象部分也不同于跟踪T4中的部分B,并且第三对象部分也等于跟踪T2、T3和T4中的部分C。
在动作805中,主题部分可能不同于比较部分,因为它是替换、插入或删除。因此,在动作805中,确定主题部分不同于多个不同比较部分可以包括确定主题部分是以下至少一项:多个不同比较部分中的一个比较部分的替换、从多个不同比较部分中删除、或插入多个不同比较部分中。
方法800还包括提供确定的结果的标记的动作806。在一些实施例中,动作806包括向计算机系统处的软件组件或向另一计算机系统提供确定的结果的标记。例如,类似于方法600的动作605,在动作806中,输出组件118可以向计算机系统101处的组件或向另一计算机系统提供由区分组件117产生的任何差分信息的标记(例如,使用(多个)网络设备105)。如在动作605中,这可以包括使软件组件在用户界面处呈现确定的结果。
在实施例中,方法800包括在比较跟踪中的一个或多个比较跟踪中对被确定为不同于比较部分的每个主题部分进行排序。例如,如果第一主题部分不同于比较执行跟踪的所有对应部分,则与不同于比较执行跟踪中的所有对应部分的第二主题部分相比,排序/相关组件117e可以将这个差分排序更高(即,更重要)。因此,方法800可以包括:将排序分配给被确定为不同的每个主题部分,该排序基于主题部分与之不同的多个比较可重放执行跟踪的数目。基于该排序,在动作806中,提供确定的结果的标记可以包括指示软件组件或其他计算机系统基于关于一个或多个主题部分中的每个的对应排序来对在用户界面处被确定为不同的一个或多个主题部分进行可视的排序。
在方法800中,每个部分可以对应于由分组组件115标识的任何分组。因此,例如,每个部分可以对应于函数,在这种情况下,每个部分对应于作为单个函数而执行的一个或多个可执行指令的序列。在另一示例中,每个部分可以对应于函数序列,在这种情况下,其中每个部分包括一个或多个相关函数的序列,每个函数对应于作为函数而执行的一个或多个可执行指令的序列。类似于方法600,动作804中的比较可以基于组身份、函数身份、函数参数等。因此,在动作804中比较主题可重放执行跟踪和多个比较可重放执行跟踪可以包括:至少部分基于每个部分的身份将多个主题部分中的每个主题部分与多个不同比较部分中的一个或多个比较部分进行比较,至少基于每个部分内的至少一个函数的身份将多个主题部分中的每个主题部分与多个不同比较部分中的一个或多个比较部分进行比较,至少基于函数参数信息将多个主题部分中的每个主题部分与多个不同比较部分中的一个或多个比较部分进行比较等。
图9示出了用于将多个主题可重放执行跟踪与多个比较可重放执行跟踪进行区分(即,M:N区分)的示例方法900的流程图。现在将在图1至图8的上下文中描述方法900。尽管为了便于描述,方法900的动作以特定顺序示出,但是应当理解,这些动作中的一些动作可以以不同顺序和/或并行实现。
在实施例中,方法900以与方法800类似的方式发生,除了在方法900中,除了比较执行跟踪之外,还针对主题执行跟踪标识等效部分的不同映射,并且除了比较执行跟踪之外,还针对主题执行跟踪标识不同部分的不同集。然后,在比较的两侧使用这些不同部分,并且在主题执行跟踪和比较执行跟踪中应用传递属性。
如图9所示,方法900包括访问多个主题跟踪的动作901a和访问多个比较跟踪的动作901b。这些动作901可以串行或并行执行。在一些实施例中,动作901包括访问多个主题可重放执行跟踪,以及访问多个比较可重放执行跟踪,每个可重放执行跟踪表示作为对应执行实体的部分而执行的对应可执行指令序列。例如,类似于方法800的动作801,动作901可以利用跟踪访问组件114a来访问执行跟踪113。然而,在动作901中,跟踪访问组件114a可以访问两个或更多个执行跟踪113作为主题执行跟踪,以及访问两个或更多个执行跟踪113作为比较执行跟踪。例如,参考图7C和图7D,跟踪访问组件114a可以访问两个或更多个执行跟踪113用于比较的左侧,并且访问两个或更多个执行跟踪113用于比较的右侧。
调试组件109可以利用对准组件116来对准部分跟踪,例如图7D中比较的左侧和右侧所示。因此,在动作901中,多个主题可重放执行跟踪中的至少一个主题可重放执行跟踪可以是部分主题执行跟踪,和/或多个比较可重放执行跟踪中的至少一个比较可重放执行跟踪可以是部分比较执行跟踪。当多个主题可重放执行跟踪中的至少一个主题可重放执行跟踪是部分主题执行跟踪时,方法900可以包括将部分主题执行跟踪与多个主题可重放执行跟踪中的至少一个其他跟踪对准。当多个比较可重放执行跟踪中的至少一个比较可重放执行跟踪是部分比较执行跟踪时,方法900可以包括将部分比较执行跟踪与多个比较可重放执行跟踪中的至少一个其他跟踪对准。在实施例中,将部分主题或比较执行跟踪与至少一个其他部分或比较可重放执行跟踪对准包括:应用最短公共超序列对准算法(例如,精确匹配组件116a)或近似字符串对准算法(例如,近似匹配组件116b)中的至少一种算法。
方法900还包括标识主题跟踪之间的等效执行的部分的第一映射的动作902a和标识比较跟踪之间的等效执行的部分的第二映射的动作902b。这些动作902可以串行或并行执行。在一些实施例中,动作902a包括标识多个主题可重放执行跟踪之间的第一映射集,第一映射集中的每个映射标识多个主题可重放执行跟踪内的等效执行的连续可执行指令的两个或更多个对应主题部分,每个映射中的每个主题部分来自多个主题可重放执行跟踪中的不同一个主题可重放执行跟踪。例如,与在方法800的动作802中传递分析组件117d如何分析比较可重放执行跟踪以标识等效执行的对应比较部分的方式类似,在动作902a中,传递分析组件117d可以标识跨被访问的主题可重放执行跟踪的等效执行的对应主题部分之间的第一映射集。
在一些实施例中,动作902b包括标识多个比较可重放执行跟踪之间的第二映射集,第二映射集中的每个映射标识多个比较可重放执行跟踪内的等效执行的连续可执行指令的两个或更多个对应比较部分,每个映射中的每个比较部分来自多个比较可重放执行跟踪中的不同一个比较可重放执行跟踪。例如,动作902b可以以与方法800的动作802基本相同的方式发生,以标识跨被访问的比较可重放执行跟踪的等效执行的对应比较部分之间的第二映射集。
方法900还包括基于第一映射来标识主题跟踪中的不同部分的动作903a和基于第二映射来标识比较跟踪中的不同部分的动作903b。这些动作903可以串行或并行执行。在一些实施例中,动作903a包括基于第一映射集来标识多个主题可重放执行跟踪内的多个不同主题部分,每个不同主题部分(i)在第一映射集中缺少映射,(ii)是来自第一映射集中不同映射的代表性主题部分。例如,类似于在方法800的动作803中传递性分析组件117d如何使用映射集来标识多个比较执行跟踪内的不同部分以与主题执行跟踪中的部分进行比较,在动作903a中,传递性分析组件117d可以使用第一映射集来标识多个主题执行跟踪中的不同部分以与比较执行跟踪中的不同部分进行比较。
在一些实施例中,动作903b包括基于第二映射集来标识多个比较可重放执行跟踪内的多个不同比较部分,每个不同比较部分(i)在第二映射集中缺少映射,或(ii)是来自第二映射集中不同映射的代表性比较部分。例如,动作903b可以以与方法800的动作803基本相同的方式发生,通过使用第二映射集来标识多个比较执行跟踪内的不同部分以与主题执行跟踪中的不同部分进行比较。
值得注意的是,在动作903a和/或903b中,传递分析组件117d可能选择少于所有可能的不同主题和/或比较部分。例如,传递分析组件117d最初可能选择关注发生在多于一个跟踪上的部分。在这种情况下,传递分析组件117d可以(至少在第一通过中)从映射集中仅选择代表性部分并且跳过在该映射集中缺少映射的部分。因此,在动作903a中,多个不同主题部分可能包括多个主题可重放执行跟踪内的少于所有不同主题部分。在动作903b中,多个不同比较部分可能包括多个比较可重放执行跟踪内的少于所有不同比较部分。
方法900还包括将主题跟踪中的每个不同部分与比较跟踪中的不同部分进行比较的动作904。在一些实施例中,动作904包括比较多个主题可重放执行跟踪和多个比较可重放执行跟踪,包括至少将多个不同主题部分中的每个不同主题部分与多个不同比较部分中的一个或多个不同比较部分进行比较。例如,类似于在方法800的动作804中差分组件117a如何将来自单个主题执行跟踪的主题部分与来自多个比较执行跟踪的不同比较部分进行比较,在动作904中,差分组件117a可以将来自多个主题执行跟踪的不同主题部分(即,在动作903a中标识)与来自多个比较执行跟踪的不同比较部分(即,在动作903b中标识)进行比较。
方法900还包括动作905,该动作905使用传递属性来确定主题跟踪的每个不同部分与比较跟踪中的不同部分的比较状态,并且在主题跟踪中的映射部分之间应用该状态。在一些实施例中,动作905包括基于比较确定多个不同主题部分中的每个不同主题部分的比较状态,包括确定每个不同主题部分是否是以下至少一项:(i)等于至少一个对应不同比较部分,或(ii)不同于多个不同比较部分,其中至少一个特定不同主题部分相对于至少一个特定对应不同比较部分的所确定的比较状态被应用于(i)每个附加比较部分,至少一个特定不同比较部分在第二映射集中被映射到该附加比较部分,以及(ii)每个附加主题部分,至少一个特定不同主题部分在第一映射集中被映射到该附加主题部分。例如,类似于在方法800的动作805中传递分析组件117d如何将不同比较部分的所确定的比较状态应用于比较执行跟踪中的对应比较部分,在动作905中,传递分析组件117d可以将不同比较部分的所确定的比较状态应用于比较执行跟踪中的对应比较部分(即,基于第二映射)。然而,此外,在动作905中,传递分析组件117d还可以将不同主题部分的所确定的比较状态应用于主题执行跟踪中的对应主题部分(即,基于第一映射)。
在动作905中,主题部分可能不同于比较部分,因为它是替换、插入或删除。因此,在动作905中,确定不同主题部分不同于多个不同比较部分可以包括确定不同主题部分是以下至少一项:多个不同比较部分中的一个不同比较部分的替换、从多个不同比较部分中删除、或插入多个不同比较部分中。
方法900还包括提供确定的结果的标记的动作906。在一些实施例中,动作906包括向计算机系统处的软件组件或向另一计算机系统提供确定的结果的标记。例如,类似于方法800的动作806,在动作906中,输出组件118可以向计算机系统101处的组件或向另一计算机系统提供由区分组件117产生的任何差分信息的标记(例如,使用(多个)网络设备105)。如在动作806中,这可以包括使软件组件在用户界面处呈现确定的结果。
在实施例中,方法900包括,针对跨多个主题执行跟踪的第一组主题部分,确定跨多个比较执行跟踪的第一组与第二组比较部分之间的哪些差分与属于第一组的主题部分高度相关。基于这些相关性,在动作906中,提供确定的结果的标记可以包括指示软件组件或其他计算机系统标识与属于特定组的主题部分高度相关的一个或多个差分。
在方法900中,每个部分可以对应于由分组组件115标识的任何分组。因此,例如,每个部分可能对应于一个函数,在这种情况下,每个部分对应于作为单个函数而执行的一个或多个可执行指令的序列。在另一示例中,每个部分可以对应于函数序列,在这种情况下,每个部分包括一个或多个相关函数的序列,每个函数对应于作为函数而执行的一个或多个可执行指令的序列。类似于方法800,动作904中的比较可以基于组身份、函数身份、函数参数等。因此,在动作904中比较多个主题可重放执行跟踪和多个比较可重放执行跟踪可以包括:至少部分基于每个部分的身份将多个不同主题部分中的每个不同主题部分与多个不同比较部分中的一个或多个不同比较部分进行比较,至少基于每个部分内的至少一个函数的身份将多个不同主题部分中的每个不同主题部分与多个不同比较部分中的一个或多个不同比较部分进行比较,至少基于函数参数信息将多个不同主题部分中的每个不同主题部分与多个不同比较部分中的一个或多个不同比较部分进行比较等。
因此,本文中描述的实施例可以将单个主题执行跟踪与单个比较执行跟踪(例如,1:1)进行区分,可以将单个主题执行跟踪与多个比较执行跟踪(例如,1:N)进行区分,和/或可以将多个主题执行跟踪与多个比较执行跟踪(例如,M:N)进行区分。本文中的实施例通过对相关可执行指令的序列进行分组并且基于这些组的属性执行区分来操作以确定这些组是否等效地执行,即使这些组中的特定指令不同。因此,本文中的实施例可以区分跟踪指令集,即使那些指令从具有不同二进制文件的应用执行(例如,由于代码改变、编译器改变、编译器设置改变、处理器ISA改变等)。此外,本文中的实施例可以在不同的细节等级区分跟踪指令的不同部分,从而使得处理资源能够专用于那些特别感兴趣的区域。
尽管已经以特定于结构特征和/或方法动作的语言描述了主题,但是应当理解,在所附权利要求中定义的主题不必然限于上述描述的特征或动作或者上述动作的顺序。相反,所描述的特征和动作被公开作为实现权利要求的示例形式。
在不背离其精神或基本特征的情况下,本发明可以以其他特定形式实现。所描述的实施例在所有方面都被认为仅是说明性的而不是限制性的。因此,本发明的范围由所附权利要求而不是由前述描述指示。在权利要求的等效含义和范围内的所有变化都应当被包含在其范围内。当在所附权利要求中引入元素时,冠词“一个”、“一”、“该”和“上述”旨在表示存在一个或多个元素。术语“包括”、“包含”和“具有”旨在具有包括性,并且表示可以存在除所列元素之外的其他元素。
Claims (15)
1.一种在包括至少一个处理器的计算机系统处实现的方法,所述方法用于将主题可重放执行跟踪与比较可重放执行跟踪进行区分,所述方法包括:
访问第一主题可重放执行跟踪并且访问第二比较可重放执行跟踪,所述第一主题可重放执行跟踪表示作为第一执行实体的部分而被执行的第一可执行指令序列,所述第二比较可重放执行跟踪表示作为第二执行实体的部分而被执行的第二可执行指令序列;
标识所述第一可执行指令序列内的第一多个函数,并且标识所述第二可执行指令序列内的第二多个函数,每个函数对应于作为所述函数的部分而被执行的一个或多个可执行指令的序列;
标识所述第一多个函数的第一多个组,并且标识所述第二多个函数的第二多个组,每个组包括一个或多个相关函数的序列;
将所述第一多个组与所述第二多个组进行比较,包括:基于每个组的身份和与所述组相对应的一个或多个函数来确定所述第一多个组中的每个第一组是否是以下至少一项:
等于所述第二多个组中的第二组;
所述第二多个组中的第二组的替换;
从所述第二多个组中被删除;或者
被插入到所述第二多个组中;以及
向所述计算机系统处的软件组件或者向其他计算机系统提供所述比较的结果的一个或多个标记,所述一个或多个标记指示每个第一组是否是以下至少一项:等于所述第二多个组中的第二组、所述第二多个组中的第二组的替换、从所述第二多个组中被删除、或者被插入到所述第二多个组中。
2.根据权利要求1所述的方法,其中所述第一执行实体和所述第二执行实体从公共可执行代码被执行。
3.根据权利要求1所述的方法,还包括:确定与所述第一多个组中的第一组相对应的第一函数是否等效于与所述第二多个组中的第二组相对应的第二函数来执行。
4.根据权利要求3所述的方法,其中确定所述第一函数是否等效于所述第二函数来执行包括:
标识对所述第一函数的零个或更多个第一输入和来自所述第一函数的一个或多个第一输出,并且标识对所述第二函数的零个或更多个第二输入和来自所述第二函数的一个或多个第二输出;以及
基于向所述第二函数提供所述零个或更多个第一输入以生成一个或多个第三输出来重放所述第二函数,并且基于向所述第一函数提供所述零个或更多个第二输入以生成一个或多个第四输出来重放所述第一函数;以及
将所述第一输出和所述第三输出进行比较,并且将所述第二输出和所述第四输出进行比较。
5.根据权利要求1所述的方法,其中
每个组对应于库、模块、命名空间或类中的一项;以及
每个相关函数作为对应的库、模块、命名空间或类的部分而被执行。
6.根据权利要求1所述的方法,其中所述第一多个组包括第一多个第一级组,并且其中所述第二多个组包括第二多个第一级组,所述方法还包括:
标识所述第一多个第一级组中的第一多个第二级组,并且标识所述第二多个第一级组中的第二多个第二级组,每个第二级组对应于库、模块、命名空间或类中的一项,并且包括作为对应的库、模块、命名空间或类的部分而被执行的分组函数的一个或多个第一级组的序列。
7.根据权利要求1所述的方法,其中标识所述第一多个函数和标识所述第二多个函数包括:针对所述第一多个函数和所述第二多个函数中的每个函数标识以下至少一项:函数名称、函数参数名称、函数参数类型或函数参数计数。
8.根据权利要求1所述的方法,其中将所述第一多个组与所述第二多个组进行比较包括:
创建第一多个对象,所述第一多个对象各自表示所述第一多个组中的一个组,并且创建第二多个对象,所述第二多个对象各自表示所述第二多个组中的一个组,每个对象标识所述组和所述组的一个或多个对应函数;以及
在所述第一多个对象与所述第二多个对象之间应用差分算法。
9.根据权利要求8所述的方法,其中每个对象标识组和所述组的多个对应函数,所述多个对应函数以执行顺序而被排序。
10.根据权利要求9所述的方法,其中每个多个对应函数仅包括以所述执行顺序而被执行的第一函数和最后的函数。
11.根据权利要求1所述的方法,其中当将所述第一多个组和所述第二多个组进行比较时,所述比较对不同于与所述组相对应的至少一个函数的身份的每个组的身份进行加权。
12.根据权利要求1所述的方法,还包括:当将所述第一多个组与所述第二多个组进行比较时,将一个或多个变换应用于所述第一可重放执行跟踪或所述第二可重放执行跟踪中的至少一个可重放执行跟踪的至少子集。
13.根据权利要求1所述的方法,其中将所述第一多个组与所述第二多个组进行比较包括比较以下至少一项:函数参数名称、函数参数类型或函数参数计数。
14.根据权利要求1所述的方法,其中提供所述确定的所述结果的所述一个或多个标记使所述计算机系统处的所述软件组件或者所述其他计算机系统在用户界面处呈现所述确定的所述结果。
15.根据权利要求14所述的方法,其中呈现所述比较的所述结果包括:可视地折叠不等于所述第二多个组中的第二组的所述第一多个组的序列。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US16/743,903 US11698847B2 (en) | 2020-01-15 | 2020-01-15 | Diffing a subject replayable execution trace against a comparison replayable execution trace |
US16/743,903 | 2020-01-15 | ||
PCT/US2020/062102 WO2021145962A1 (en) | 2020-01-15 | 2020-11-24 | Diffing a subject replayable execution trace against a comparison replayable execution trace |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114981783A true CN114981783A (zh) | 2022-08-30 |
Family
ID=73856331
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202080093060.6A Pending CN114981783A (zh) | 2020-01-15 | 2020-11-24 | 将主题可重放执行跟踪与比较可重放执行跟踪进行区分 |
Country Status (4)
Country | Link |
---|---|
US (1) | US11698847B2 (zh) |
EP (1) | EP4091057B1 (zh) |
CN (1) | CN114981783A (zh) |
WO (1) | WO2021145962A1 (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
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 |
Family Cites Families (37)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6145121A (en) | 1997-04-17 | 2000-11-07 | University Of Washington | Trace based method for the analysis, benchmarking and tuning of object oriented databases and applications |
US8266595B2 (en) | 2004-02-12 | 2012-09-11 | International Business Machines Corporation | Removal of asynchronous events in complex application performance analysis |
US7506330B2 (en) | 2004-02-12 | 2009-03-17 | International Business Machines Corporation | Method and apparatus for identifying differences in runs of a computer program due to code changes |
US7496900B2 (en) | 2004-02-12 | 2009-02-24 | International Business Machines Corporation | Method for automatic detection of build regressions |
US7519961B2 (en) | 2004-02-12 | 2009-04-14 | International Business Machines Corporation | Method and apparatus for averaging out variations in run-to-run path data of a computer program |
US7793267B2 (en) | 2006-10-13 | 2010-09-07 | International Business Machines Corporation | Computer software test coverage analysis |
US20080126878A1 (en) * | 2006-11-28 | 2008-05-29 | International Business Machines Corporation | Highlighting anomalies when displaying trace results |
US7810079B2 (en) | 2007-01-23 | 2010-10-05 | Sas Institute Inc. | System and method for determining execution path difference in program |
US8336033B2 (en) | 2007-03-30 | 2012-12-18 | Sap Ag | Method and system for generating a hierarchical tree representing stack traces |
WO2011116987A1 (en) | 2010-03-26 | 2011-09-29 | Software Diagnostics Technology Gmbh | A method for automatically generating a trace data set for a software system, a computer system, and a computer program product |
TWI437390B (zh) | 2011-01-07 | 2014-05-11 | Ind Tech Res Inst | 混合模擬系統及方法 |
US8997057B1 (en) | 2011-11-04 | 2015-03-31 | Google Inc. | Using trace matching to identify and analyze application traces |
US8955114B2 (en) | 2011-12-14 | 2015-02-10 | Microsoft Corporation | Application monitoring through collective record and replay |
JP2015043198A (ja) | 2013-07-22 | 2015-03-05 | 株式会社東芝 | 解析システム、解析方法および解析プログラム |
US9311220B1 (en) | 2013-12-31 | 2016-04-12 | Google Inc. | System to uncover root cause of non-deterministic (flaky) tests |
US9183116B1 (en) * | 2014-04-23 | 2015-11-10 | Microsoft Technology Licensing, Llc | Call chain interval resource impact aggregation differencing |
US20160019133A1 (en) | 2014-07-15 | 2016-01-21 | 4D Soft Kft. | Method for tracing a computer software |
US10241901B2 (en) | 2014-10-06 | 2019-03-26 | Oracle International Corporation | Web application performance testing |
JP2017054380A (ja) | 2015-09-10 | 2017-03-16 | 株式会社東芝 | プログラム情報生成システム、方法、及びプログラム |
US10558549B2 (en) | 2015-11-26 | 2020-02-11 | Tata Consultancy Services Limited | Method and system for pre-deployment performance estimation of input-output intensive workloads |
WO2017205936A1 (en) | 2016-06-03 | 2017-12-07 | National Ict Australia Limited | Classification of log data |
US10042737B2 (en) | 2016-08-31 | 2018-08-07 | Microsoft Technology Licensing, Llc | Program tracing for time travel debugging and analysis |
US10481997B2 (en) * | 2016-11-27 | 2019-11-19 | Amazon Technologies, Inc. | Distributed code tracing system |
US10802945B2 (en) | 2016-12-07 | 2020-10-13 | Ab Initio Technology Llc | Differencing of executable dataflow graphs |
US10545738B1 (en) | 2018-07-13 | 2020-01-28 | Lzlabs Gmbh | Containerized deployment of microservices based on monolithic legacy applications |
US10481998B2 (en) | 2018-03-15 | 2019-11-19 | Microsoft Technology Licensing, Llc | Protecting sensitive information in time travel trace debugging |
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 |
US10698792B2 (en) | 2018-05-02 | 2020-06-30 | Microsoft Technology Licensing, Llc | Execution control with cross-level trace mapping |
US10503634B1 (en) | 2018-05-25 | 2019-12-10 | Microsoft Technology Licensing, Llc | Semantic comparison of computer compiler traces |
US11080166B2 (en) * | 2018-05-31 | 2021-08-03 | Sap Se | Database trace debugger |
US20200110687A1 (en) | 2018-10-05 | 2020-04-09 | Mobile Enerlytics LLC | Differential resource profiling with actionable diagnostics |
US20210218437A1 (en) | 2020-01-14 | 2021-07-15 | Qualcomm Incorporated | Physical uplink shared channel repetition with frequency hopping |
US11243869B2 (en) | 2020-01-15 | 2022-02-08 | Microsoft Technologly Licensing, LLC | Diffing of replayable execution traces |
US11316550B2 (en) | 2020-01-15 | 2022-04-26 | Skyworks Solutions, Inc. | Biasing of cascode power amplifiers for multiple power supply domains |
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 |
-
2020
- 2020-01-15 US US16/743,903 patent/US11698847B2/en active Active
- 2020-11-24 CN CN202080093060.6A patent/CN114981783A/zh active Pending
- 2020-11-24 EP EP20828446.3A patent/EP4091057B1/en active Active
- 2020-11-24 WO PCT/US2020/062102 patent/WO2021145962A1/en unknown
Also Published As
Publication number | Publication date |
---|---|
US11698847B2 (en) | 2023-07-11 |
EP4091057A1 (en) | 2022-11-23 |
US20210216436A1 (en) | 2021-07-15 |
WO2021145962A1 (en) | 2021-07-22 |
EP4091057B1 (en) | 2023-12-27 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10802946B2 (en) | Presenting differences between code entity invocations | |
CN115004161A (zh) | 将主题可重放执行跟踪与多个比较可重放执行跟踪进行区分 | |
US11237947B2 (en) | Diffing a plurality of subject replayable execution traces against a plurality of comparison replayable execution traces | |
US11669434B2 (en) | Diffing of replayable execution traces | |
EP4014119B1 (en) | Data race analysis based on altering function internal loads during time-travel debugging | |
US20200301815A1 (en) | Using synthetic inputs to compare execution of different code versions | |
US20200257614A1 (en) | Automatically identifying and highlighting differences between historic traces | |
CN114981783A (zh) | 将主题可重放执行跟踪与比较可重放执行跟踪进行区分 | |
WO2020190600A1 (en) | Using synthetic inputs during emulation of an executable entity from a recorded execution | |
CN113632067A (zh) | 利用跟踪代码的记录执行来仿真非跟踪代码 | |
US20200301808A1 (en) | Determining effects of a function's change on a client function | |
EP3953820A1 (en) | Cross-thread memory indexing in time-travel debugging traces | |
CN113678110A (zh) | 时间旅行调试追踪中的存储器值暴露 | |
LU500132B1 (en) | Automated root cause identification using data flow analysis of plural execution traces | |
CN114424171A (zh) | 使用差异图对时间旅行跟踪进行索引和重放 | |
Ho | Issues in debugging sequential and concurrent programs: methods, techniques, and implementation |
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 |