CN113785284A - 基于历史调试追踪来标识数据不一致和数据争用 - Google Patents

基于历史调试追踪来标识数据不一致和数据争用 Download PDF

Info

Publication number
CN113785284A
CN113785284A CN202080032369.4A CN202080032369A CN113785284A CN 113785284 A CN113785284 A CN 113785284A CN 202080032369 A CN202080032369 A CN 202080032369A CN 113785284 A CN113785284 A CN 113785284A
Authority
CN
China
Prior art keywords
thread
data
memory
value
previous
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
CN202080032369.4A
Other languages
English (en)
Inventor
D·迈尔斯
J·M·戴维斯
T·莱
A·R·斯特兰德
D·陈
P·L·尼尔森
J·莫拉
J·C·亚雷瓦罗·巴埃扎
J·M·平克顿
L·Y·理查森
K·W·塞克斯
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 CN113785284A publication Critical patent/CN113785284A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/23Updating
    • G06F16/2365Ensuring data consistency and integrity
    • 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
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/48Program initiating; Program switching, e.g. by interrupt
    • G06F9/4806Task transfer initiation or dispatching
    • G06F9/4843Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
    • G06F9/4881Scheduling strategies for dispatcher, e.g. round robin, multi-level priority queues

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Computer Security & Cryptography (AREA)
  • Data Mining & Analysis (AREA)
  • Databases & Information Systems (AREA)
  • Debugging And Monitoring (AREA)

Abstract

基于历史调试追踪来标识和报告潜在数据不一致和/或潜在数据争用。基于线程的重放,一些实现观察值到存储器单元的流入,并且确定从流入中观察的存储器单元的值是否与线程所已知的存储器单元的先前值不一致。如果是这样,则这些实现可以发起数据不一致的指示。基于多个线程的重放,其他实现标识在线程同步机制在第一线程上有效时由第一线程访问的存储器单元。然后,如果由第二线程在未使用线程同步机制的情况下对存储器单元进行了另一访问,则这些实现可以发起潜在数据争用的指示。

Description

基于历史调试追踪来标识数据不一致和数据争用
背景技术
追踪和校正软件代码(通常称为“调试”代码)中的错误是软件开发中的核心活动。软件错误会导致很多不希望的运行时行为(诸如,执行崩溃、运行时异常、执行性能缓慢、数据结果不正确、数据损坏等)。很多难以重现的软件错误会导致代码执行期间的数据不一致。导致这些错误的一些开发方错误包括忘记初始化变量,或引入竞争条件,其中各种线程修改数据而未使用线程同步/锁定机制来正确地保护该数据(例如,通过正确使用互斥器、事件、信号量、自旋锁、队列自旋锁等)。在代码执行期间,这些数据不一致错误表现为在特定线程的上下文中读取存储器中的值,而该线程本身并未将给定值写入存储器。在未被初始化的存储器的示例中,线程从先前未写入的存储器中读取。在竞争条件的情况下,线程读取它先前在存储器中未看到的值、或它未写入存储器的值。
一种开发方已经于调试代码的方法是使用“现场”调试器。通常,现场调试器附加至现场过程的执行,并且使开发方能够监测和指导该过程的前向执行。例如,现场调试器可以使开发方能够设置在它到达特定指令时中止程序执行的断点,以在它访问特定的存储器地址时设置中止程序执行的观察点,在它执行时通过代码行来单步执行等。
新兴形式的诊断工具启用“历史”调试(也称为“时间旅行”或“反向”调试),其中(多个)程序线程的至少部分的执行被记录/追踪到一个或多个追踪文件(即,追踪)中。使用一些追踪技术,追踪可以包含非常高保真“位准确”的历史追踪数据,这使得(多个)追踪线程的(多个)记录部分能够以极高的保真度虚拟“重放”—甚至低至单个指令的粒度(例如机器代码指令、中间语言代码指令等)。因此,使用位准确追踪数据,“历史”、“时间旅行”或“反向”调试器使开发方不仅能够监测和指导追踪代码的前向仿真(例如经由断点、观察点、单步执行等),而且还能够监测并指导追踪代码的反向仿真(例如经由反向断点、反向观察点、反向单步执行等)。因此,开发方可以在追踪之前监测和指导程序的任何部分的执行。
发明内容
本文中所描述的至少一些实施例基于历史调试追踪标识和报告潜在数据不一致和/或潜在数据争用。例如,实施例可以包括标识和报告在程序的先前执行期间所发生的并且在追踪期间所捕获的实际数据一致性。因此,这些实施例能够标识何时从未被初始化的存储器读取或数据竞争条件实际何时发生并且在追踪期间被捕获。在这些实施例中,线程的执行是从历史追踪重放的。在此重放期间,观察到存储器单元的流入。如果这与线程所已知的存储器单元的先前值不一致(例如,因为线程不知道存储器单元的值,或者观察的值不同于已知先前值),则数据不一致被观测。
其他实施例可以包括标识可能发生数据争用的情况,即使在追踪期间未捕获到实际数据不一致。因此,这些实施例可以标识其中数据竞争条件可能发生的情况,即使在追踪期间未捕获到实际数据竞争条件。在这些实施例中,从历史追踪重放多个线程的执行。当线程同步机制在第一线程上有效时,由第一线程对存储器的访问被追踪。如果该线程同步机制在第二线程上不有效时,第二线程对被追踪的存储器单元进行存储器访问,则潜在数据争用已经被观察。
一些实施例包括用于指示在线程的先前执行期间观察的数据不一致的方法、***和计算机程序产品。这些实施例包括基于表示线程的先前执行的追踪来重放线程的先前执行。这些实施例还包括基于重放线程的先前执行来观察值到存储器单元的流入。这些实施例还包括确定从流入中观察的存储器单元的值与线程所已知的存储器单元的先前值不一致。这些实施例还包括至少基于从流入中观察的存储器单元的值与存储器单元的先前值一致来发起数据不一致的指示。
其他实施例包括用于基于先前线程执行的追踪来指示潜在数据争用的方法、***和计算机程序产品。这些实施例包括基于表示多个线程的先前执行的追踪来重放多个线程的先前执行。这些实施例还包括基于重放多个线程的先前执行来在多个线程的第一线程的先前执行期间标识线程同步机制的激活。这些实施例还包括基于重放多个线程的先前执行并且基于线程同步机制的激活来标识在线程同步机制在第一线程上有效时由第一线程所访问的至少一个存储器单元。这些实施例还包括基于重放多个线程的先前执行来标识在多个线程的第二线程的先前执行期间对至少一个存储器单元的存储器访问,而第二线程未使用线程同步机制。这些实施例还包括基于标识存储器访问来发起与至少一个存储器单元相关的潜在数据争用的指示。
该发明内容被提供以简化的形式介绍对于下面在具体实施方式中进一步描述的概念的选择。该发明内容不旨在标识所要求保护的主题的关键特征或必要特征,也不旨在用于辅助确定所要求保护的主题的范围。
附图说明
为了描述本发明的上述和其他优点和特征可以被获得的方式,上面简要描述的本发明的更具体的描述将通过参照在附图中图示的其具体实施例来绘制。要理解的是,这些附图仅描绘了本发明的典型实施例,因此不被认为是对其范围的限制,本发明将通过使用附图来利用附加的特异性和细节描述并且解释,其中:
图1A示出了一个示例计算环境,该计算环境有助于基于历史调试追踪来标识和报告潜在数据不一致和/或潜在数据争用;
图1B示出了图1A的调试的附加细节;
图2示出了其中图1A的计算环境与一个或多个其他计算机***联网的示例;
图3示出了历史调试追踪的一个示例;
图4A示出了示例时序图,该时序图包括与两个线程的执行相对应的两个时间线、以及示出这些线程对存储器单元的访问的时间线,包括从未被初始化的存储器中的读取和数据不一致;
图4B示出了示例时序图,该时序图包括与两个线程的执行相对应的两个时间线、以及示出这些线程对存储器单元的访问的时间线,包括使用临界区(critical section)来保护对存储器单元的访问;
图4C示出了示例时序图,该时序图包括与两个线程的执行相对应的两个时间线、以及示出这些线程对存储器单元的访问的时间线,包括使用临界区来保护对存储器单元的访问,并且包括存储器单元上的潜在数据竞争;
图5示出了用于指示在线程的先前执行期间观察的数据不一致的示例方法的流程图;以及
图6示出了用于基于先前线程执行的追踪来指示潜在数据争用的示例方法的流程图。
具体实施方式
本文中描述的至少一些实施例基于历史调试追踪标识和报告潜在数据不一致和/或潜在数据争用。例如,实施例可以包括标识和报告在程序的先前执行期间发生并且在追踪期间捕获的实际数据一致性。因此,这些实施例能够标识何时从未被初始化的存储器读取或数据竞争条件实际何时发生并且在追踪期间被捕获。在这些实施例中,线程的执行是从历史追踪重放的。在此重放期间,观察到存储器单元的流入。如果这与线程所已知的存储器单元的先前值不一致(例如,因为线程不知道存储器单元的值,或者观察的值不同于已知先前值),则数据不一致已经观察到。
其他实施例可以包括标识可能发生数据争用的情况,即使在追踪期间未捕获到实际数据不一致。因此,这些实施例可以标识数据竞争条件可能发生的情况,即使在追踪期间未捕获到实际数据竞争条件。在这些实施例中,从历史追踪重放多个线程的执行。
考虑到本文中的公开,可以理解,使用历史调试追踪来自动标识数据不一致和数据争用可以极大地提高调试过程的速度和有效性,并且可以从应用代码中消除数据不一致和数据竞争。此外,本文中描述的实施例可以提供独特的调试功能,例如自动标识/标记追踪中的数据不一致和争用作为追踪索引数据,和/或通过用户界面机制自动标识/标记数据不一致和争用。
图1A示出了示例计算环境100a,计算环境100a基于历史调试追踪来标识和报告潜在数据不一致和/或潜在数据争用。如图所示,计算环境100a可以包括或利用专用或通用计算机***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还可以存储数据,诸如记录(多个)应用112中的一个或多个应用的一个或多个执行的(多个)一个或多个追踪113。
通常,调试组件109将一个或多个追踪113作为输入,并且基于对这些追踪113的分析,标识数据不一致和/或潜在数据争用,数据不一致和/或潜在数据争用可以对应于从未被初始化的存储器的读取和/或潜在数据竞争条件。在标识数据不一致和/或潜在数据争用之后,调试组件109可以发起不一致/争用的指示,例如通过发起追踪索引数据的创建,和/或发起在调试用户界面处的不一致/争用视觉指示。因此,图1A示出了调试组件109和(多个)追踪113被加载到***存储器中(即,调试组件109’和(多个)追踪113’),并且调试组件109’和(多个)追踪113’之间的双端箭头指示调试组件109’可以从(多个)这些追踪113’读取并且可能写入(多个)这些追踪113’;如果数据被写入(多个)追踪113’,则该数据也可能被持久化到持久性存储装置104中的(多个)追踪113。
如所提及的,调试组件109对(多个)追踪113执行分析。在实施例中,该分析可以包括静态分析或动态分析中的一个分析或两者。如本文所使用的,静态分析包括仅基于从(多个)追踪113读取的数据来执行分析的调试组件109。另一方面,动态分析可以使用基于(多个)这些追踪113从(多个)应用112的重放/仿真所生成/获得的数据。因此,图1A示出了仿真组件111也可以被加载到***存储器103(即,仿真组件111’)中,并且(多个)应用112可以由仿真组件111’(即,(多个)应用112’)仿真。调试组件109’和仿真组件111’之间的双端箭头指示调试组件109’可以请求仿真组件111’的追踪仿真,并且由仿真组件111’可以将该追踪仿真的结果提供到调试组件109’。
如果存在,则追踪组件110可以将(多个)应用112中的一个或多个应用的执行记录或“追踪”到(多个)追踪113中。追踪组件110可以记录(多个)应用112的执行是否是直接在(多个)处理器102上执行,是否是经由所管理的运行时在(多个)处理器102上的执行。因此,图1A还示出了追踪组件110可以被加载到***存储器103(即,追踪组件110’)中。追踪组件110’和(多个)追踪113’之间的箭头指示追踪组件111’可以将追踪数据记录到(多个)追踪113’中(其然后可以作为(多个)追踪113被持久化到持久性存储装置104)。
计算机***101可以附加地或备选地从另一计算机***(例如使用(多个)网络设备105)接收(多个)追踪113中的一个或多个。例如,图2示出了示例计算环境200,其中图1A的计算机***101通过一个或多个网络201被连接至一个或多个其他计算机***202(即,计算机***202a至202n)。如示例200所示,每个计算机***202包括追踪组件110和(多个)应用112。如此,计算机***101可以通过(多个)网络201接收(多个)这些计算机***202处的(多个)应用112中的一个或多个应用的(多次)先前执行的(多个)一个或多个追踪113。
要注意的是,虽然调试组件109、追踪组件110和/或仿真组件111可能分别是独立的组件或应用,但它们可以备选地被集成到同一应用中(诸如,调试套件),或者可以被集成到另一软件组件中——诸如操作***组件、管理程序、云结构等。因此,本领域技术人员还将了解,本发明可以在计算机***101是其部分的云计算环境中实践。
在实施例中,调试组件109、追踪组件110和/或仿真组件111对(多个)追踪113进行操作,该追踪113包括表示应用112的一个或多个线程的先前执行的高保真“位准确”追踪数据,并且其中追踪数据使(多个)这些线程的(多个)任何追踪部分能够将由仿真组件111向下仿真(即,“重放”)到单个指令(例如,机器代码指令、中间语言代码指令等)的粒度。如本文使用的,“位准确”追踪是包括足够数据以使先前执行的应用112的代码(例如在计算机***101处和/或在计算机***202中的一个或多个计算机***处)能够经由仿真组件111的仿真重放的追踪,使得仿真组件111以与它先前所执行的基本相同的方式来模拟该代码的执行。追踪组件110可以使用多种方法来记录和表示位准确追踪数据。提供高性能水平和合理追踪大小的两个不同系列的方法现在被简要概括,但要了解的是,本文的实施例创建和操作使用其他方法记录的追踪。附加地,优化可以被应用于这些系列的方法中的任一种方法,为了简洁起见,其在本文中未描述。
第一系列的方法被建立在对处理器指令(包括虚拟机“虚拟处理器”指令)通常落入以下三个类别中的一个类别的认识之上:(1)被标识为“非确定性”的指令,即不产生可预测的输出,因为它们的输出不完全由通用寄存器(例如,寄存器107a)或缓存(例如,(多个)缓存108)中的数据确定,(2)确定性指令,其输入不取决于存储器值(例如它们仅取决于处理器寄存器值或代码本身中所限定的值),以及(3)确定性指令,其输入取决于从存储器读取值。因此,在一些实施例中,存储足够的状态数据以再现指令的执行可以通过解决以下问题来完成:(1)如何记录产生不完全由其输入确定的输出的非确定性指令,(2)如何取决于寄存器再现针对指令的输入寄存器的值,以及(3)如何取决于存储器读取再现针对指令的输入存储器的值。
在一些实施例中,(多个)第一方法将非确定性指令的执行记录到(多个)追踪113中,这些非确定性指令通过将这种指令的执行的旁效应存储到(多个)追踪113中来产生不完全由其输入确定的输出。如本文所使用的,“非确定性”指令可以包括不太常见的指令,这些指令(i)每次执行时都会产生非确定性输出(例如英特尔处理器上的RDTSC,它写入自上次处理器复位到寄存器中以来的处理器循环数目),(ii)可能产生确定性输出,但取决于在追踪记录期间未追踪的输入(例如,调试寄存器、定时器等),和/或(iii)产生处理器特定信息(例如,英特尔处理器上的CPUID,它将处理器特定数据写入寄存器)。存储这种指令的执行的旁效应可以包括例如存储由指令的执行而改变的寄存器值和/或存储器值。在一些架构中(诸如,来自英特尔)处理器特征(诸如,在虚拟机扩展(VMX)所中发现的这些特征)可以被用以捕捉用于将其旁效应记录到(多个)追踪113中的指令。
解决如何针对确定性指令(例如,其输入仅取决于处理器寄存器值)再现输入寄存器的值很简单,因为它们是(多个)先前指令的执行的输出。因此,用于记录追踪的(多个)第一方法因此可以减少记录整个系列处理器指令的执行,以存储可以被用于在系列开始时再现寄存器值的数据。在实施例中,(多个)追踪113甚至可能不需要存储在该系列中所执行的特定指令的记录或中间寄存器值。这是因为实际指令可从应用代码本身获得。因此,这些指令可以在重放期间被供应有所记录的输入(即,所记录的初始寄存器值集合),以与它们在追踪期间相同的方式执行。
最后,用于记录追踪的(多个)第一方法可以解决如何针对确定性指令再现输入存储器的值,该确定性指令的输入取决于通过将这些指令所消耗的存储器值(即,读取)记录到(多个)追踪113中的存储器的值——无论指令所读取的值是如何被写入存储器的。换而言之,(多个)一些追踪113可能会记录存储器读取的值,但是不会记录存储器写入的值。例如,尽管值可能由当前线程、另一线程(包括内核,例如作为处理中断的部分)或硬件设备写入存储器,但是执行读取的线程的指令的完全重放所需要仅是线程的指令读取的值。这是因为由线程读取的这些值(不必然是被写入存储器的所有值)命令了线程如何执行。
用于记录位准确追踪的第二系列的方法被建立在处理器(例如,处理器102)形成半封闭或准封闭***的认识之上。例如,一旦针对过程的数据部分(即,代码数据和运行时应用数据)被加载到(多个)缓存108中,处理器102就可以自行运行——无需任何输入——作为针对时间突发的半封闭或准封闭***。具体地,一旦(多个)缓存108被加载具有数据,处理单元107中的一个或多个处理单元使用存储在(多个)缓存的数据部分中的运行时数据并且使用寄存器107a来执行来自(多个)缓存108的代码部分的指令。当处理单元107需要一些信息流入时(例如因为它正在执行、将执行或可能执行访问不在(多个)缓存108中的代码或运行时数据的指令),“缓存缺失”发生,并且信息从***存储器103被带入(多个)缓存108。然后处理单元107可以然后使用(多个)缓存108中的新信息继续执行,直到新信息再次被带入(多个)缓存108中(例如,由于另一缓存缺失或未缓存的读取)。因此,在第二系列的方法中,追踪组件110可以记录足够的数据,以能够在追踪的处理单元执行时将信息的流入再现到(多个)缓存108中。
调试组件109、追踪组件110和/或仿真组件111也对使用其他历史调试技术创建的(多个)追踪113进行操作。例如,另一类历史调试技术(本文中称为“分支追踪调试”)依赖于基于从转储或快照(例如,线程的故障转储)向后工作来重构实体的执行的至少一部分,该转储或快照(例如,线程的故障转储)包括处理器分支追踪(即,包括是否采用分支的记录)。这些技术从这个转储或快照中的值(例如,存储器和寄存器)开始,并且使用分支追踪来部分确定代码执行流程,迭代地重放实体的代码指令并且前后和向后以重构该代码使用的中间数据值(例如,寄存器和存储器),直到这些值达到稳定状态。这些技术在它们可以重构数据值多远以及可以重构多少数据值方面可能受到限制。尽管如此,重构的历史执行数据可以用于历史调试。
另一类历史调试技术(本文中称为“快照和重放调试”)在实体执行时定期记录其存储器空间和处理器寄存器的完整快照。如果实体依赖于来自实体自身存储器以外的其他来源的数据,或者来自非确定性来源的数据,则这些技术也可以将这样的数据与快照一起记录。然后,这些技术使用快照中的数据在快照之间重放实体代码的执行。值得注意的是,为了正确重放进程的执行,“快照和重放”技术有时需要将多个线程序列化到单个处理单元107上。
图3示出了追踪300的一个示例,其可以对应于图1A的(多个)追踪113中的一个或多个追踪,并且其可以根据前述追踪技术(例如上面描述的位精确追踪技术)中的一个或多个技术来创建。在图3的示例中,追踪300包括一个或多个追踪数据流301。在图3中,三个追踪数据流301(即,追踪数据流301a至301c)被图示。在实施例中,每个追踪数据流301记录从应用112的代码执行的不同线程的执行。例如,追踪数据流301a可以表示应用112的第一线程的执行,追踪数据流301b可以表示应用112的第二线程的执行,并且追踪数据流301c可以表示应用112的第三线程。如所示出的,每个追踪数据流301包括多个数据分组302(即,针对数据流301a的数据分组302a、针对数据数据流301b的数据分组302b和针对数据流301c的数据分组302c)。由于在每个数据分组302中所记录的特定数据可能会变化,所以它们被示出为具有不同的大小。通常,当使用位准确追踪技术时,每个数据分组302至少记录作为应用112的该第一线程的部分所执行的一个或多个可执行指令的输入(例如,寄存器值、存储器值、缓存线数据等)。如所示出的,追踪数据流301还可以包括一个或多个关键帧303(例如,关键帧303a至303e),其分别记录足够的信息,诸如寄存器和/或存储器值的快照,使包含关键帧的线程的先前执行能够由仿真组件111从关键帧303向前的点开始重放。另外,追踪数据流301可以包括一个或多个测序事件,如图3中编号为1至9的圆圈所示。虽然每个追踪数据流301通常独立地追踪给定线程,但是测序事件记录跨线程的可排序的事件的发生。例如,这些测序事件可以对应于线程交互的事件,诸如通过共享存储器、经由函数调用等。而为了简单起见,追踪数据流301中的事件顺序通过线程循环方式旋转,要了解的是,它们通常会以不太可预测的方式出现。
在实施例中,追踪113还可以包括被执行的实际代码。因此,在图3中,每个数据分组302被示出为包括非阴影数据输入部分304(即,针对数据分组302a的数据输入部分304a、针对数据分组302b的数据输入部分304b和针对数据分组302c的数据输入部分304c)和阴影代码部分305(即,针对数据分组302a的代码部分305a、针对数据分组302b的代码部分305b和针对数据分组302c的代码部分305c)。在实施例中,分组302中的代码部分305可以包括基于对应的数据输入来执行的可执行指令。然而,在其他实施例中,追踪113可以省略被执行的实际代码,而是依赖于对应用112的代码(例如,来自持久性存储装置104)的单独访问。在这些其他实施例中,每个数据分组可以例如指定适当的(多个)可执行指令的地址或偏移。如图所示,追踪113可以包括任何数目的附加数据流306(即,数据流306a至306n),其可以存储任何类型的附加追踪数据。该附加追踪数据可以包括例如索引数据,诸如偶尔的存储器快照、用于快速定位追踪数据流301中的存储器地址/值的反向查找数据结构等。
图1B示出了提供图1A的调试组件109的附加细节的示例100b。图1B中所描绘的调试组件109包括表示调试组件109可以根据本文所描述的各种实施例来实现的各种功能性的各种子组件(例如追踪访问114、追踪分析115、输出116等)。要了解的是,所描绘的组件——包括其身份、子组件和布置——仅被呈现为辅助描述调试组件109的各种实施例,并且这些组件/子组件不限于软件和/或硬件可以如何实现调试组件109或其特定功能性的各种实施例。
追踪访问组件114访问(多个)追踪113中的至少一个。这可能意味着从持久性存储装置104访问(多个)追踪113,和/或从另一计算机***(例如,计算机***中的一个或多个计算机***)访问(多个)追踪113。在实施例中,访问追踪113使该追踪至少部分地被加载到***存储器103中(即,如(多个)追踪113’所示)。
追踪分析组件115对(多个)被访问的追踪113执行一个或多个类型的分析以标识来自未被初始化的存储器和/或数据竞争条件的实际或潜在读取。如所示出的,追踪分析组件115可以包括数据不一致分析组件115a,数据不一致分析组件115a从追踪113中标识在被追踪的线程从存储器单元读取与该线程对存储器单元的先前值的知识不一致的值时的情况(例如,因为线程不知道存储器单元的先前值,或者因为线程先前向存储器单元读取或写入该先前值)。这些情况可以对应于从未被初始化的存储器中的读取(即,当线程不知道存储器单元的先前值时),或者可以对应于在追踪113中实际被捕获的数据竞争(即,当从存储器单元读取的值与线程先前从存储器单元读取或写入的值不一致时)。因此,数据不一致分析组件115a可以标识在追踪期间实际发生的来自未被初始化的存储器的读取和/或潜在数据竞争。
为了说明这些概念,图4A示出了示例时序图400a,时序图400a包括与两个线程的执行相对应的两个时间线(即,T1和T2)、以及示出了这些线程对存储器单元的访问的时间线(即,MC)。时序图400a可以例如对应于其先前执行在一个或多个被访问追踪113中所表示的两个线程的执行。基于时间线400a,数据不一致分析组件115a可以标识从未被初始化的存储器的读取(即,在箭头处401a)。特别地,由线程T1与存储器单元的第一交互是在箭头401a处,其中线程T1读取值A。由于该读取是线程T1与存储器单元的第一交互,因此线程不具有对存储器单元的值的先前知识。例如,线程T1未先前写入存储器单元(这会在存储器单元中放置已知值)。因此,当线程T1在箭头401a处从存储器单元中读取值A时,该读取值(即,A)可能是存储器单元的未被初始化的值。
此外,基于时序图400a,数据不一致分析组件115a可以标识作为潜在数据竞争的读取(即,在箭头401d处)。特别地,时序图400a示出了,在该第一读取之后,线程T1将值B写入存储器单元(即,在箭头401b处),并且然后从存储器单元读取值B(即,在箭头401c处)。由于在箭头401c处所读取的值(即,B)与线程T1对存储器单元值(即,在箭头401b处所写入的B)的先前知识一致,因此不存在数据不一致。然而,如所示出的,在箭头401e处,线程T2稍后将值C写入存储器单元,并且然后线程T1在箭头401d处读取该相同的值。此处,在箭头401d处所读取的值(即,C)与线程T1对存储器单元值的先前知识(即,在箭头401c处被读取的B)一致。如此,箭头401d处存在数据不一致,这可以是数据竞争。
值得注意的是,数据不一致分析组件115a也可以分析线程T2的数据不一致并且未发现数据不一致。例如,线程T2与存储器单元的第一交互是在箭头401e处,其中线程T2写入值C。由于第一交互是写入,因此这不可能是从未被初始化的存储器的读取。随后,线程T2在箭头401f处读取相同的值。由于在箭头401f处读取的值与在箭头401e处写入的值一致,因此在箭头401f处不存在数据不一致。
如前所述,“快照和重放”技术可能需要将多个线程序列化到单个处理单元107上。如果是这种情况,则数据不一致分析组件115a可能仅限于检测对未被初始化的数据的访问,而不是其他数据不一致(即,因为线程序列化会强制一致)。
附加地或备选地,追踪分析组件115可以包括数据争用分析组件115b,数据争用分析组件115b从追踪113标识以下情况:(i)一个被追踪的线程使用线程同步机制对存储器单元的保护访问,(ii)另一被追踪的线程访问该存储器单元而不控制该相同的线程同步机制,并且其中(iii)线程对存储器单元的访问中的至少一个访问是写入。在这些情况下,即使在追踪113中实际上未捕获到数据竞争,数据竞争也是可能的。因此,数据争用分析组件115b可以标识其中可能发生数据竞争/争用的情况。
如本领域普通技术人员将理解的,线程同步机制(有时称为线程同步原语、线程锁定机制、线程锁定原语等)是在线程的执行中创建“临界区”以在多线程的执行期间保护共享存储器的技术。一些线程同步机制是悲观的(pessimistic),而另一些则是乐观的(optimistic)。一般来说,悲观线程同步机制假定:如果多个线程并发与(多个)相同的存储器位置交互,则可能将会发生竞争条件,并且因此防止不同线程上的临界区并发执行(即,当线程可以并发访问(多个)相同的存储器位置)。悲观线程同步机制的示例包括自旋锁、互斥器和信号量。
自旋锁使尝试获取它的线程在循环中等待(即,“自旋”),同时反复检查锁是否可用。一旦获取,自旋锁通常由线程持有,直到它们被线程显式释放,尽管在一些实现中,如果正在等待的线程(持有锁的线程)阻塞,它们可能会被自动释放。互斥器只向一个线程授予对共享资源的独占访问权限。如果第一线程获取互斥器,则想要获取该互斥器的第二线程将被挂起,直到第一线程释放互斥器。信号量控制对资源的访问,并且利用最大计数和初始计数来创建。每次线程进入信号量时该计数递减,并且当线程释放信号量时递增。当计数为零时,后续请求将阻塞,直到其他线程释放信号量。当所有线程都已经释放了信号量时,计数处于创建信号量时所指定的最大值。
另一方面,乐观线程同步机制让不同线程上的临界区并发执行并且监测临界区期间所访问的(多个)存储器位置以确定是否发生数据竞争;如果确实发生了竞争,这些机制会通过回滚它们的旁效应(例如,由它们的执行改变的寄存器和存储器值)来“回滚”这些线程的执行,然后以单线程方式重新执行临界区。乐观线程同步机制的示例包括硬件或软件实现的事务存储器(例如,对x86指令集架构(ISA)的TSX-NI扩展)。
为了说明线程同步的概念,图4B示出了示例时序图400b,时序图400b包括与两个线程的执行相对应的两个时间线(即,T1和T2)、以及示出了这些线程对存储器单元的访问的时间线(即,MC)。例如,时序图400b可以对应于其先前的执行在一个或多个所访问的追踪113中被表示的两个线程的执行。时序图400b中的每个线程可以从相同的代码执行,并且被示出为在由某个线程同步机制创建的代码(即,线程T1和T2的执行部分402a至402f)中重复执行“临界区”。如图4B中使用省略号所示,一个线程在需要访问共享资源时使用锁定技术(例如,互斥器)来进入临界区,并且另一线程必须等待轮到它进入临界区。这可以防止这些线程访问相同的存储器单元时发生争用。如图4B中的箭头403a至403f所示,每个线程仅在临界区期间访问(读取和/或写入)存储器单元,并且因此临界区防止存储器单元上的数据竞争。另一方面,图4C包括附加箭头403g和403h,示出了在未使用临界区的情况下对存储器单元的访问(例如,每个对应于从存储器单元的读取和/或写入)。由于这些访问是在未使用临界区的情况下被执行的,因此它们可能会导致存储器单元上的数据竞争。数据争用分析组件115b可以将这种存储器访问标识为潜在争用。
在实施例中,数据争用分析组件115b可以处理在初始同步原语受保护访问(例如,箭头403a处的访问)之前发生的对存储器位置的访问(例如,箭头403g处的访问),不同于它稍后进行访问(例如,在箭头403d、403b、403e、403c、403f和403g处的访问)。这样做时,数据争用分析组件115b可以减少误报,诸如当被追踪代码初始化复杂数据结构时可能发生的误报,该复杂数据结构稍后才由同步原语保护。因此,例如,数据争用分析组件115b可以确定箭头403h处的访问是潜在争用,而它可以确定箭头403g处的访问不是潜在争用。备选地,数据争用分析组件115b可以确定箭头403g处的访问与箭头403h处的访问相比成为潜在争用的可能性更低。
输出组件116产生指示由数据不一致分析组件115a标识的任何数据不一致和/或由数据争用分析组件115b标识的任何数据争用的输出。在实施例中,输出组件116可以通过将数据写入追踪文件或使数据被写入追踪文件(例如,(多个)追踪113中的一个追踪)来产生输出。例如,输出组件116可以写入(或使写入)索引数据,该索引数据补充被访问的追踪113(例如,作为附加数据流306中的一个附加数据流的部分)以指示其中发生数据不一致和/或争用的在追踪113中所表示的一个或多个执行时间,指示与数据不一致/争用相关联的一个或多个代码元素等等。在实施例中,输出组件116可以通过将(多个)输出数据和/或信号发送到另一软件组件(例如,经由API调用)来产生输出。在实施例中,输出组件116可以通过在用户界面处显示数据或使数据在用户界面(例如,调试器用户界面)处显示来产生输出。例如,输出组件116可以使调试器用户界面沿着执行时间线的视觉指示来显示指示数据不一致/争用何时发生,显示与数据不一致/争用相关联的一个或多个代码元素的视觉指示等等。
以下讨论新指的是可以由计算机***101执行的很多方法和方法动作。虽然方法动作可以以特定顺序讨论或可以在流程图中说明为以特定顺序发生,但是除非特别说明,或者因为一个动作依赖于另一动作在该动作执行之前完成而需要,否则不需要特定顺序。
为了至少更好地理解数据不一致分析组件115a的分析,图5示出了用于指示在线程的先前执行期间观察的数据不一致的示例方法500的流程图。现在参考图1A、1B、3、4A和5描述方法500。
如图所示,方法500包括重放线程的先前执行的动作501。在一些实现中,动作501包括基于表示线程的先前执行的追踪来重放线程的先前执行。例如,仿真组件111可以重放线程T1的先前执行,其执行的时间线在图4A中表示。在实施例中,该仿真可以在数据不一致分析组件115a的请求时执行,然而它可以备选地出于某个其他原因而执行——诸如用于在调试器处对应用112的一般调试。作为该仿真的部分,仿真组件111可以重放对图4A中所表示的存储器单元的一个或多个存储器访问,诸如箭头401a至401c和401d处所表示的一个或多个存储器访问。
方法500还包括观察值到存储器单元的流入的动作502。在一些实现中,动作502包括基于重放线程的先前执行,观察值到存储器单元的流入。例如,基于仿真组件111的仿真,数据不一致分析组件115a可以在与箭头401a相对应的执行时间点处观察值A的流入,在与箭头401c相对应的执行时间点处观察值B的流入,和/或在与箭头401d相对应的执行时间点处观察值C的流入。
方法500还包括确定观察值与存储器单元的先前值不一致的动作503。在一些实现中,动作503包括确定从流入中观察的存储器单元的值与线程所已知的存储器单元的先前值不一致。例如,对于观察的每个流入,数据不一致分析组件115a可以确定观察的流入是否与流入对应的存储器单元的先前已知值一致。如将理解的,观察值到存储器单元的流入可以包括处理追踪数据分组(例如,数据分组302a中的一个数据分组),该追踪数据分组指示存储器单元存储了该值。
例如,如果观察的流入是与箭头401a相对应的执行时间点处的值A,则数据不一致分析组件115a可以确定流入与由线程所已知的存储器单元的先前值不一致。这是因为,线程不知道存储器单元的先前值。在这种情况下,在与箭头401a相对应的执行时间点处的流入可能是从未被初始化的存储器中的读取。
在诸如箭头401a处的流入(例如,来自未被初始化的存储器的读取)的情况下,应当理解,当确定从流入中观察的存储器单元的值与在动作503中线程所已知的存储器单元的先前值不一致时,动作503的实现可以包括:至少基于线程先前未写入存储器单元来确定该存储器单元的先前值是该线程所未知的。
备选地,如果观察的流入是与箭头401d相对应的执行时间点处的值C,则数据不一致分析组件115a可以确定流入与线程所已知的存储器单元的先前值不一致。数据不一致分析组件115a可以基于线程T1在与箭头401c相对应的执行时间点处将值B读取到存储器单元来做出该确定(该读取可能已经在动作501中由仿真组件111重放)。由于线程T1最近从存储器单元中读取了值B,并且由于在与箭头401d相对应的执行时间点处所读取的值为值C,因此该值与线程对存储器单元值的先前知识不一致。在这种情况下,在与箭头401d相对应的执行时间点处的流入可以是数据竞争(即,在与箭头401e相对应的执行时间点处由线程T2写入)。可以将被理解的,线程T2对值C的写入可以被追踪(例如,因为线程T2的执行也被追踪为与线程T1相关),或者它可以不被追踪(例如,因为线程T2的执行未被追踪为未被选择用于追踪和/或与线程T1无关)。如果线程T2的执行被追踪,则方法500还可以包括确定线程T2何时将值写入存储器单元的线程T2的分析。
在诸如箭头401d处的流入(例如,潜在竞争条件)的情况下,应当理解,当确定从流入中观察的存储器单元的值与在动作503中线程所已知的存储器单元的先前值不一致时,动作503的实现可以包括首先基于以下至少一项来确定存储器单元的先前值是线程所已知的:(i)线程先前已经从存储器单元读取先前值,或者(ii)线程先前已经将先前值写入存储器单元,以及然后确定从流入中观察的存储器单元的值不同于存储器单元的先前值。
虽然在图5中未明确示出,但是数据不一致分析组件115a可以确定在与箭头401c相对应的执行时间点处的值B的流入与线程所已知的存储器单元的先前值一致。数据不一致分析组件115a可以基于线程T1在与箭头401b相对应的执行时间点处将值B写入存储器单元来做出该确定(该写入可能已经在动作501中由仿真组件111重放)。因为,在与箭头401c相对应的执行时间点处,线程T1最近将值B写入到存储器单元(即,箭头401b),并且由于在与箭头401c相对应的执行时间点处读取的值也是值B,该值与线程对存储器单元值的先前知识一致。
方法500还包括发起数据不一致的指示的动作504。在一些实现中,动作504包括至少基于从流入中观察的存储器单元的值与存储器单元的先前值一致,发起数据不一致的指示。例如,基于已经标识出与箭头401a和/或箭头401d处的流入相关的不一致,输出组件116可以发起这些不一致的一个或多个指示。这些指示可以在用户界面处(例如,使用用户界面生成组件116a)、在追踪文件中(例如,使用追踪索引组件116b)、和/或到某个其他软件组件。取决于在动作503中所标识的不一致的类型,数据不一致的指示可以指示数据不一致对应于以下至少一项:(i)从未被初始化的存储器的读取或者(ii)潜在竞争条件。
因此,在动作504的实现中,发起数据不一致的指示可以包括以下至少一项:(i)发起指示数据不一致的追踪索引数据的创建(例如,作为追踪113中的附加数据流306的部分),或者(ii)发起在调试用户界面处的数据不一致的视觉指示。如果动作504包括发起追踪索引数据的创建,则追踪索引数据可以包括例如其中发生数据不一致和/或争用的在追踪113中表示的一个或多个执行时间、与数据不一致/争用相关联的一个或多个代码元素等。如果动作504包括发起在调试用户界面处的数据不一致的视觉指示,则该视觉指示可以包括例如以下至少一项:(i)沿着执行时间线的的视觉指示,指示数据不一致何时发生,或者(ii)与数据不一致相关联的一个或多个代码元素的视觉指示。这些代码元素(例如,变量、数据结构、命令、指令等)可以在线程T1上被访问(例如,与箭头104a和/或104d处的读取相关的一个或多个代码元素),和/或可以是线程T2的部分(例如,与箭头104e处的写入相关的一个或多个代码元素,这使线程T1中的数据不一致)。因此,在动作504中,线程可以包括第一线程,并且与数据不一致相关联的一个或多个代码元素可以包括以下中的一项或多项:(i)来自第一线程的第一代码元素,或者(ii)来自第二线程的第二代码元素,第二线程的先前执行也被追踪。
虽然主要结合线程T1的分析描述了方法500,但是应当理解,方法500也可以用于执行线程T2的类似数据不一致分析。然而,方法500实际上可能不会标识线程T2内的任何数据不一致。
为了至少更好地理解数据争用分析组件115b的分析,图6示出了用于基于表示先前线程执行的追踪来指示潜在数据争用的示例方法600的流程图。现在参考图1A、图1B、图3、图4C和图6描述方法。
如图所示,方法600包括重放多个线程的先前执行的动作601。在一些实现中,动作601包括基于表示多个线程的先前执行的追踪来重放多个线程的先前执行。例如,仿真组件111可以重放线程T1和T2的先前执行,其执行的时间线在图4C中表示。在实施例中,该仿真可以在数据争用分析组件115b的请求时执行,然而它可以备选地出于某个其他原因而执行——诸如用于在调试器处对应用112的一般调试。作为该仿真的部分,仿真组件111可以重放对图4C中表示的存储器单元的将一个或多个存储器访问(即,在与箭头403a至403h相对应的执行时间点处的一个或多个存储器访问)。这可以包括例如重放箭头403a处的(多个)存储器访问和箭头403h处的(多个)存储器访问。
方法600还包括标识第一线程的线程同步机制的使用的动作602。在一些实现中,动作602包括基于重放多个线程的先前执行,在多个线程的第一线程的先前执行期间,标识线程同步机制的激活。例如,基于仿真组件111对线程T1的重放,数据争用分析组件115b可以标识线程T1上的临界区402a的条目。例如,该条目可以包括线程T1调用函数、设置变量等,以发起自旋锁、互斥器、信号量、事务或某个其他线程同步机制的条目或激活。
方法600还包括标识在同步机制是有效时由第一线程访问的存储器单元的动作603。在一些实现中,动作603包括:基于重放多个线程的先前执行,并且基于线程同步机制的激活,标识在线程同步机制在第一线程上有效时由第一线程访问的至少一个存储器单元。例如,基于在临界区402a期间由箭头403a所表示的(多个)存储器访问,数据争用分析组件115b可以将图4C中表示的存储器单元标识为在临界区期间被访问,并且因此受临界区保护。值得注意的是,数据争用分析组件115b可以附加地或备选地使用箭头403b和/或403c处的一个或多个存储器访问来标识存储器单元,因为对存储器单元的这些访问也在临界区402b和402c期间执行。
方法600还包括在未使用线程同步机制的情况下标识第二线程对存储器单元的访问的动作604。在一些实现中,动作604包括基于重放多个线程的先前执行,在多个线程的第二线程的先前执行期间,标识对至少一个存储器单元的存储器访问,而第二线程未使用线程同步机制。例如,数据争用分析组件115b可以将箭头403h处的(多个)存储器访问标识为已经由临界区外的线程T2执行,并且因此它们是数据竞争风险。
值得注意的是,数据争用分析组件115b还可以标识箭头402d至402f处对存储器单元的(多个)存储器访问中的一个或多个存储器访问,但是确定它们是临界区402d至402f的部分并且因此它们不存在数据竞争风险。在实施例中,同步原语保护区域内的这种访问可以使概率的指示被存储,该概率为需要将来访问的访问存储器单元也受(多个)相同原语保护的增加。在一些实现中,该追踪状态可以在相关联的存储器单元的解除分配时被重置(例如,如果经由调用malloc()来追踪所分配的单元,则该追踪状态可以经由调用free()在该单元的分配空闲时被移除)。在实施例中,针对存储器单元的追踪状态可以是二进制值(例如,如果在同步原语保护区域内未访问,则为“0”,或者如果有,则为“1”),尽管它可以备选地是某物更细化(例如,随着每个同步原语受保护访问而递增的值,其中较大的值指示较大的概率)。
方法600还包括发起潜在数据争用的指示的动作605。在一些实现中,动作605包括基于标识存储器访问,发起与至少一个存储器单元相关的潜在数据争用的指示。例如,基于在箭头403h处标识出与(多个)存储器访问相关的数据竞争风险,输出组件116可以发起潜在数据争用的一个或多个指示。类似于结合方法500描述的实施例,这些指示可以在用户界面处(例如,使用用户界面生成组件116a)、在追踪文件中(例如,使用追踪索引组件116b)、和/或到某个其他软件组件。
因此,在动作605的实现中,发起潜在数据争用的指示可以包括以下至少一项:(i)发起指示潜在数据争用的追踪索引数据的创建(例如,作为追踪113中的附加数据流306的一部分),或者(ii)发起在调试用户界面处的潜在数据争用视觉指示。如果动作605包括发起追踪索引数据的创建,则追踪索引数据可以包括例如在发生潜在数据争用的追踪113中表示的一个或多个执行时间、与潜在数据争用相关联的一个或多个代码元素等。如果动作605包括发起在调试用户界面处的潜在数据争用的视觉指示,则该视觉指示可以包括例如以下至少一项:(i)沿着执行时间线的视觉指示,指示潜在数据争用何时发生,(ii)与潜在数据争用相关联的一个或多个代码元素的视觉指示。这些代码元素(例如,变量、数据结构、命令、指令等)可以是线程T1的一部分(例如,与箭头403a至403c处的访问相关的一个或多个代码元素),和/或可以是线程T1的部分线程T2(例如,与箭头403f处的访问相关的一个或多个代码元素,这导致了潜在数据争用)。因此,在动作605中,线程可以包括第一线程,并且与数据相关联的一个或多个代码元素争用可以包括以下中的一项或多项:(i)来自第一线程的第一代码元素,或者(ii)来自第二线程的第二代码元素,第二线程的先前执行也被追踪。
值得注意的是,不同线程同步机制可以强制执行不同要求,即所有存储器读取和/或写入是否必须在临界区内被执行,或者其中一些读取和/或写入是否可以在临界区外被允许。换而言之,读取线程和写入线程可以有不同要求。因此,在发起潜在数据争用的指示之前,数据争用分析组件115b可以确定箭头403h处的(多个)存储器访问是否实际上违反所使用的线程同步机制的要求。因此,在动作605之前,方法600可以包括确定通过第二线程的访问是否违反线程同步机制的动作(未描绘)。在实现中,该动作可以包括确定由第二线程对至少一个存储器单元的存储器访问是否违反第一线程使用的线程同步机制的存储器访问限制。因此,方法600可以在动作605中基于已经确定存储器访问确实违反存储器访问限制来发起潜在数据争用的指示。因此,方法600可以在发起潜在数据争用的指示之前过滤掉可能的“误报”。
例如,硬件事务可能要求执行写入的线程使用临界区,但是可能允许执行读取的线程在未临界区的情况下这样做。因此,如果它们包括一个或多个写入,则箭头403h处的(多个)存储器访问实际上可能只是潜在数据争用。因此,在方法600中,如果线程同步机制包括硬件事务,则确定第二线程对至少一个存储器单元的存储器访问是否违反第一线程所使用的线程同步机制的存储器访问限制可以包括:确定存储器访问是未使用硬件事务的写入。
尽管主题已经用特定于结构特征和/或方法行动的语言描述,但是要理解的是,在所附权利要求中限定的主题并不必然被限于所描述的特征或上述行动或者上述行动的顺序。相反,所描述的特征和行动被公开为实施权利要求的示例形式。
本发明可以在不脱离其精神或基本特点的情况下以其他具体形式具化。所描述的实施例在所有方面仅被认为是说明性的,而不是限制性的。因此,本发明的范围是由所附权利要求指示的,而不是由前述描述指示的。落入权利要求的等同含义和范围内的所有变化都会被包含在其范围内。当在所附权利要求中引入元素时,冠词“一”、“一个”、“该”和“所述”旨在表示存在一个或多个元素。术语“包括”、“包含”和“具有”旨在是包括性的,并且表示可能存在不同于所列举元素的附加元素。

Claims (15)

1.一种在计算机***处实现的用于指示在线程的先前执行期间观察的数据不一致的方法,所述计算机***包括一个或多个处理器,所述方法包括:
基于表示线程的先前执行的追踪,重放所述线程的所述先前执行;
基于重放所述线程的所述先前执行,观察值到存储器单元的流入;
确定从所述流入中观察的所述存储器单元的所述值与所述线程所已知的所述存储器单元的先前值不一致;以及
至少基于从所述流入中观察的所述存储器单元的所述值与所述存储器单元的所述先前值一致,发起数据不一致的指示。
2.根据权利要求1所述的方法,其中确定从所述流入中观察的所述存储器单元的所述值与由所述线程所已知的所述存储器单元的所述先前值不一致包括:
基于以下至少一项来确定所述存储器单元的所述先前值是所述线程所已知的:(i)所述线程先前已经从所述存储器单元读取所述先前值,或者(ii)所述线程先前已经将所述先前值写入所述存储器单元;以及
确定从所述流入中观察的所述存储器单元的所述值不同于所述存储器单元的所述先前值。
3.根据权利要求2所述的方法,其中发起所述数据不一致的所述指示包括:发起潜在竞争条件的指示。
4.根据权利要求1所述的方法,其中确定从所述流入中观察的所述存储器单元的所述值与所述线程所已知的所述存储器单元的所述先前值不一致包括:至少基于所述线程先前未写入所述存储器单元来确定所述存储器单元的所述先前值是所述线程所未知的。
5.根据权利要求4所述的方法,其中发起所述数据不一致的所述指示包括:发起从未被初始化的存储器的读取的指示。
6.根据权利要求1所述的方法,其中观察所述值到所述存储器单元的所述流入包括:处理追踪数据分组,所述追踪数据分组指示所述存储器单元存储了所述值。
7.根据权利要求1所述的方法,其中所述线程包括第一线程,并且其中所述值是在第二线程的先前执行期间由所述第二线程写入所述存储器单元。
8.根据权利要求7所述的方法,其中所述第二线程的所述先前执行也被追踪,并且其中所述方法还包括:确定所述第二线程何时将所述值写入所述存储器单元。
9.根据权利要求1所述的方法,其中发起所述数据不一致的所述指示包括以下至少一项:(i)发起指示所述数据不一致的追踪索引数据的创建,或者(ii)发起在调试用户界面处的所述数据不一致的视觉指示。
10.根据权利要求1所述的方法,其中发起所述数据不一致的所述指示包括:发起在调试用户界面处的所述数据不一致的视觉指示,并且其中在所述调试用户界面处的所述数据不一致的所述视觉指示包括以下至少一项:(i)沿着执行时间线的视觉指示,指示所述数据不一致何时发生,或者(ii)与所述数据不一致相关联的一个或多个代码元素的视觉指示。
11.根据权利要求1所述的方法,其中所述线程包括第一线程,并且其中发起所述数据不一致的所述指示包括:发起与所述数据不一致相关联的一个或多个代码元素的指示,所述一个或多个代码元素包括以下中的一项或多项:(i)来自所述第一线程的第一代码元素,或者(ii)来自第二线程的第二代码元素,所述第二线程的先前执行也被追踪。
12.根据权利要求1所述的方法,其中所述数据不一致的所述指示指示所述数据不一致对应于以下至少一项:(i)从未被初始化的存储器的读取,或者(ii)潜在竞争条件。
13.一种在计算机***处实现的用于基于表示先前线程执行的追踪来指示潜在数据争用的方法,所述计算机***包括一个或多个处理器,所述方法包括:
基于表示多个线程的先前执行的追踪,重放所述多个线程的所述先前执行;
基于重放所述多个线程的所述先前执行,
在所述多个线程的第一线程的先前执行期间,标识线程同步机制的激活;
基于所述线程同步机制的所述激活,标识在所述线程同步机制在所述第一线程上有效时由所述第一线程访问的至少一个存储器单元;以及
在所述多个线程的第二线程的先前执行期间,标识对所述至少一个存储器单元的存储器访问,而所述第二线程未使用所述线程同步机制;以及
基于标识所述存储器访问,发起与所述至少一个存储器单元相关的潜在数据争用的指示。
14.根据权利要求13所述的方法,还包括:确定由所述第二线程对所述至少一个存储器单元的所述存储器访问是否违反由所述第一线程使用的所述线程同步机制的存储器访问限制,并且其中所述方法基于已经确定所述存储器访问确实违反所述存储器访问限制来发起所述潜在数据争用的所述指示。
15.根据权利要求14所述的方法,其中所述线程同步机制包括硬件事务,并且其中确定由所述第二线程对所述至少一个存储器单元的所述存储器访问是否违反由所述第一线程使用的所述线程同步机制的存储器访问限制包括:确定所述存储器访问是未使用所述硬件事务的写入。
CN202080032369.4A 2019-04-30 2020-04-01 基于历史调试追踪来标识数据不一致和数据争用 Pending CN113785284A (zh)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US16/398,672 US11138093B2 (en) 2019-04-30 2019-04-30 Identifying data inconsistencies and data contention based on historic debugging traces
US16/398,672 2019-04-30
PCT/US2020/026052 WO2020222964A1 (en) 2019-04-30 2020-04-01 Identifying data inconsistencies and data contention based on historic debugging traces

Publications (1)

Publication Number Publication Date
CN113785284A true CN113785284A (zh) 2021-12-10

Family

ID=70334175

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202080032369.4A Pending CN113785284A (zh) 2019-04-30 2020-04-01 基于历史调试追踪来标识数据不一致和数据争用

Country Status (4)

Country Link
US (2) US11138093B2 (zh)
EP (1) EP3963460A1 (zh)
CN (1) CN113785284A (zh)
WO (1) WO2020222964A1 (zh)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20230021678A1 (en) * 2021-07-20 2023-01-26 Nvidia Corporation Thread synchronization across memory synchronization domains

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102708043A (zh) * 2011-03-02 2012-10-03 微软公司 静态数据竞争检测和分析
CN104216764A (zh) * 2014-07-31 2014-12-17 昆明理工大学 一种基于多线程嵌入式***并行程序跟踪与回放方法
CN104620223A (zh) * 2012-06-15 2015-05-13 索夫特机械公司 对于基于存储资历实现从不同线程进行转发的线程不可知的加载存储缓冲器
CN109144785A (zh) * 2018-08-27 2019-01-04 北京百度网讯科技有限公司 用于备份数据的方法和装置
US20190042396A1 (en) * 2017-08-03 2019-02-07 Microsoft Technology Licensing, Llc Tentative execution of code in a debugger

Family Cites Families (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6405326B1 (en) * 1999-06-08 2002-06-11 International Business Machines Corporation Limited Timing related bug detector method for detecting data races
US7549150B2 (en) * 2004-03-24 2009-06-16 Microsoft Corporation Method and system for detecting potential races in multithreaded programs
US7366956B2 (en) * 2004-06-16 2008-04-29 Hewlett-Packard Development Company, L.P. Detecting data races in multithreaded computer programs
US7770155B2 (en) * 2005-11-03 2010-08-03 International Business Machines Corporation Debugger apparatus and method for indicating time-correlated position of threads in a multi-threaded computer program
US20100122073A1 (en) * 2008-11-10 2010-05-13 Ravi Narayanaswamy Handling exceptions in software transactional memory systems
US9052967B2 (en) * 2010-07-30 2015-06-09 Vmware, Inc. Detecting resource deadlocks in multi-threaded programs by controlling scheduling in replay
US9317297B2 (en) * 2012-09-27 2016-04-19 Intel Corporation Replay execution of instructions in thread chunks in the chunk order recorded during previous execution
US8977916B2 (en) * 2012-12-04 2015-03-10 Texas Instruments Incorporated Using data watchpoints to detect unitialized memory reads
US9513956B2 (en) * 2015-02-10 2016-12-06 International Business Machines Corporation Compare point detection in multi-threaded computing environments
US20170126580A1 (en) * 2015-10-30 2017-05-04 AppDynamics, Inc. Tracking Contention in a Distributed Business Transaction
US9934126B1 (en) 2017-03-08 2018-04-03 Microsoft Technology Licensing, Llc Indexing a trace by insertion of reverse lookup data structures

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102708043A (zh) * 2011-03-02 2012-10-03 微软公司 静态数据竞争检测和分析
CN104620223A (zh) * 2012-06-15 2015-05-13 索夫特机械公司 对于基于存储资历实现从不同线程进行转发的线程不可知的加载存储缓冲器
CN104216764A (zh) * 2014-07-31 2014-12-17 昆明理工大学 一种基于多线程嵌入式***并行程序跟踪与回放方法
US20190042396A1 (en) * 2017-08-03 2019-02-07 Microsoft Technology Licensing, Llc Tentative execution of code in a debugger
CN109144785A (zh) * 2018-08-27 2019-01-04 北京百度网讯科技有限公司 用于备份数据的方法和装置

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
LUÍS RODRIGUES: "Record and Replay of Multithreaded Applications", REPORT-UNIVERSITY OF LISBOA, 1 January 2015 (2015-01-01) *
NUNA MACHADO 等: "CoopREP_Cooperative_record_and_replay_of_concurrency bugs", SOFTWARE TESTING, VERIFICATION&RELIABILITY, 5 September 2017 (2017-09-05) *

Also Published As

Publication number Publication date
US11138093B2 (en) 2021-10-05
US20200349053A1 (en) 2020-11-05
US20210406154A1 (en) 2021-12-30
EP3963460A1 (en) 2022-03-09
WO2020222964A1 (en) 2020-11-05
US11604720B2 (en) 2023-03-14

Similar Documents

Publication Publication Date Title
US11055197B2 (en) Tentative execution of code in a debugger
EP3577564B1 (en) Efficient retrieval of memory values during trace replay
US11132280B2 (en) Automatically identifying and highlighting differences between historic traces
US10949332B2 (en) Data race analysis based on altering function internal loads during time-travel debugging
US10599541B2 (en) Efficient breakpoint detection via caches
EP3652648B1 (en) Replaying time-travel traces relying on processor undefined behavior
US10956304B2 (en) Dynamic diagnostic code instrumentation over a historic program execution
US20200310946A1 (en) Reversible debugging in a runtime environment
US11604720B2 (en) Identifying data inconsistencies and data contention based on historic debugging traces
US11074153B2 (en) Collecting application state in a runtime environment for reversible debugging
CN110062927B (zh) 用于可执行代码的并行重放的方法、***和存储设备
US20190042390A1 (en) Focused execution of traced code in a debugger
US11163665B2 (en) Indexing and replaying time-travel traces using diffgrams

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