CN110431536B - 实现整个数据结构上的断点 - Google Patents
实现整个数据结构上的断点 Download PDFInfo
- Publication number
- CN110431536B CN110431536B CN201880018952.2A CN201880018952A CN110431536B CN 110431536 B CN110431536 B CN 110431536B CN 201880018952 A CN201880018952 A CN 201880018952A CN 110431536 B CN110431536 B CN 110431536B
- Authority
- CN
- China
- Prior art keywords
- data structure
- memory
- memory addresses
- breakpoint
- data
- 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.)
- Active
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/3644—Software debugging by instrumenting at runtime
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3624—Software debugging by performing operations on the source code, e.g. via a compiler
Abstract
实现整个数据结构上的断点包括用于在由数据结构覆盖的多个存储器地址上设置断点的方法、系统和计算机程序产品。一个实施例包括:接收对针对其请求断点的数据结构的引用,并且然后基于该引用来标识数据结构的数据结构布局。基于数据结构的数据结构布局,标识由该数据结构覆盖的多个存储器地址,以及将多个存储器地址添加到断点列表。
Description
背景技术
当在软件应用的开发期间编写代码时,开发者通常花费大量时间“调试”代码以找到代码中的运行时错误。在这样做时,开发者可以采取若干方法来重现和定位源代码程式错误(bug),诸如基于不同输入来观察程序的行为、插入调试代码(例如,以打印变量值、以跟踪执行分支等)、临时移除代码部分等。跟踪运行时错误以查明代码程式错误可能会占用应用开发时间的很大一部分。
已经开发了许多类型的调试软件应用(“调试器”)以便帮助开发者进行代码调试过程。这些工具给开发者提供了追踪、可视化和更改计算机代码执行的能力。例如,调试器可以可视化代码指令的执行,可以在代码执行期间的不同时间呈现变量值,可以使开发者能够更改代码执行路径,和/或可以使开发者能够设置“断点”和/或“监测点”。
对于大多数调试器,当到达计算机代码中的指定点(即,特定代码指令)时触发“断点”,并且当指定数据元素的值已经改变或被访问时触发“监测点”。当断点或监测点触发时,调试器暂停主体代码的执行,并且呈现该点处的程序状态。为了实现断点/监测点,调试器标识与感兴趣项目相关联的存储器地址(例如,与用于断点的代码指令相关联的存储器地址、或与用于监测点的数据元素相关联的存储器地址),并且然后监测对该地址的访问。虽然断点和监测点是不同的,但为了简单起见,它们在本文中都被统称为断点。因此,如本文所使用的,“断点”是指使特定存储器地址被监测、并且基于检测到对所监测的存储器地址的访问来暂停代码执行的任何调试器功能性。
当监测存储器访问时,调试器可以利用由处理器架构提供的断点功能性(例如,致力于断点功能性的特殊处理器寄存器),和/或可以探测(instrument)正在被执行的代码,使得访问存储器的每个操作(例如,对存储数据的存储器的读取或写入、或者用于从存储程序代码的存储器执行的读取/提取)用附加的代码指令被探测,该附加的代码指令检查该访问是否会使断点被触发。
如上文所指示的,调试器使断点能够被设置在特定的代码指令上(例如,通常对应于功能边界、流控制语句、变量赋值和实例化等),和/或被设置在指定的数据元素自身上,指定的数据元素诸如语言原语(例如,整数、布尔、字符、字符串、引用等)、复合数据结构(例如,数组、记录、联合等)、抽象数据结构(例如,容器、列表、树、图等)、或诸如类的实例之类的其他定制数据结构。当在指定的数据元素上设置断点时,调试器在主体数据元素的基本存储器地址上设置断点。因此,例如,链表上的断点得到链表头部的存储器地址上的断点,数组上的断点得到数组中第一个元素的存储器地址上的断点,类的实例上的断点得到引用该实例的存储器地址上的断点等。
发明内容
本文描述的至少一些实施例扩展了断点功能性,使得数据结构上的断点的添加可以将断点添加到由该数据结构覆盖的多个存储器地址(即,直到整个数据结构),而不是仅添加到该数据结构的基本存储器地址。因此,实施例可以使调试器能够在与数据结构相关联的任何存储器地址在执行期间被访问(读取和/或写入)时,暂停代码执行。
断点可以被配置为在以下情况下触发:当被访问的存储器地址与被存储在数据结构中的数据相关联时,和/或当被访问的存储器地址与该数据结构本身的物理存储器布局相关联时。这使得调试器能够在数据结构内的数据改变时(例如,以基于在数据结构的概念视图内可见的变化而中断),和/或在数据结构的物理存储器布局改变时(例如,以基于在数据结构的物理视图内可见的变化而中断)暂停执行。
为了完成上述目的,当数据结构上的断点被请求时,实施例操作以:不仅标识数据结构的基本存储器地址,还标识由数据结构覆盖的所有存储器地址。然后,可以将这些存储器地址中的全部(或子集)添加到断点列表,以便断点在这些存储器地址中的任何存储器地址被访问时触发。
在一些实施例中,一种用于在由数据结构覆盖的多个存储器地址上设置断点的方法包括:接收对针对其请求断点的数据结构的引用,并且然后基于该引用来标识该数据结构的数据结构布局。该方法还包括:基于该数据结构的数据结构布局,标识由该数据结构覆盖的多个存储器地址,以及将该多个存储器地址添加到断点列表。
提供本发明内容是为了以简化的形式介绍一些概念,这些概念将在下面的具体实施方式中进一步描述。本发明内容不旨在标识所要求保护的主题的关键特征或必要特征,也不旨在用于帮助确定所要求保护的主题的范围。
附图说明
为了描述可以获得本发明的上文列举的和其他的优点和特征的方式,将通过参考本发明的具体实施例来呈现对上文简要描述的本发明的更特定的描述,这些具体实施例在附图中被图示。应理解,这些附图仅描绘了本发明的典型实施例,并且因此不应被认为是对其范围的限制,本发明将通过使用附图、用附加的特性和细节来描述和解释,在附图中:
图1图示了有助于实现整个数据结构上的断点的示例计算机架构;
图2图示了示例调试器的示例子组件;
图3A图示了包括多个条目的示例数组;
图3B图示了存储对数据项的引用的示例数组;
图4A图示了包括多个节点的示例链表;
图4B图示了存储对数据项的引用的示例链表;
图5A图示了与图3A的数组相对应的示例存储器布局;
图5B图示了与图3B的数组相对应的示例存储器布局;
图6A图示了与图4A的链表相对应的示例存储器布局;
图6B图示了与图4B的链表相对应的示例存储器布局;
图7图示了用于在由数据结构覆盖的多个存储器地址上设置断点的示例方法的流程图;以及
图8图示了用于使用高速缓存来监测断点的示例环境。
具体实施方式
本文描述的至少一些实施例扩展了断点功能性,使得在数据结构上添加断点可以将断点添加到由数据结构覆盖的多个存储器地址(即,直到整个数据结构),而不是仅添加到数据结构的基本存储器地址。因此,实施例可以使调试器能够在执行期间、在访问(读取和/或写入)与数据结构相关联的任何存储器地址时,暂停代码执行。
断点可以被配置为在以下情况下触发:当被访问的存储器地址与被存储在数据结构中的数据相关联时,和/或当被访问的存储器地址与数据结构本身的物理存储器布局相关联时。这使得调试器能够在数据结构内的数据改变时(例如,基于在数据结构的概念视图内可见的变化而中断),和/或在数据结构的物理存储器布局改变时(例如,基于数据结构的物理视图中可见的变化而中断)暂停执行。
为了完成上述目的,当数据结构上的断点被请求时,实施例操作以:不仅标识数据结构的基本存储器地址,还标识由数据结构覆盖的所有存储器地址。然后,可以将这些存储器地址中的全部(或子集)添加到断点列表,以便断点在这些存储器地址中的任何存储器地址被访问时触发。
图1图示了有助于实现整个数据结构上的断点的示例计算环境100。如所描绘的,实施例可以包括或利用专用或通用计算机系统101,其包括计算机硬件,诸如例如一个或多个处理器102、系统存储器103、一个或多个数据存储库104、和/或输入/输出硬件105(例如,诸如所描绘的键盘/鼠标硬件105a、联网硬件105b和显示设备105c)。在一些实施例中,计算机系统101及其中的组件可以包括虚拟化环境。
本发明的范围内的实施例包括用于承载或存储计算机可执行指令和/或数据结构的物理和其他计算机可读介质。这种计算机可读介质可以是可以由计算机系统101访问的任何可用介质。存储计算机可执行指令和/或数据结构的计算机可读介质是计算机存储设备。承载计算机可执行指令和/或数据结构的计算机可读介质是传输介质。因此,作为示例而非限制,本发明的实施例可以包括至少两种截然不同的计算机可读介质:计算机存储设备和传输介质。
计算机存储设备是存储计算机可执行指令和/或数据结构的物理硬件设备。计算机存储设备包括各种计算机硬件,诸如RAM、ROM、EEPROM、固态驱动器(“SSD”)、闪存、相变存储器(“PCM”)、光盘存储装置、磁盘存储装置或其他磁存储设备、或者可以用于存储以计算机可执行指令或数据结构的形式的程序代码并且可以由计算机系统101访问和执行以实现本发明所公开的功能性的任何(多个)其他硬件设备。因此,例如,如稍后所讨论的,计算机存储设备可以包括所描绘的系统存储器103、可以存储计算机可执行指令和/或数据结构的所描绘的数据存储库104、或者诸如处理器上存储装置之类的其他存储装置。
传输介质可以包括网络和/或数据链接,其可以用于承载以计算机可执行指令或数据结构形式的程序代码,并且其可以由计算机系统101访问。“网络”被定义为能够在计算机系统和/或模块和/或其他电子设备之间传送电子数据的一个或多个数据链接。当通过网络或另一通信连接(硬连线、无线或硬连线或无线的组合)向计算机系统传递或提供信息时,计算机系统可以将该连接视为传输介质。以上的组合也应被包括在计算机可读介质的范围内。例如,输入/输出硬件105可以包括联网硬件105b(例如,硬连线的或无线的网络接口模块),联网硬件105b连接可以用于承载以计算机可执行指令或数据结构的形式的程序代码的网络和/或数据链接。
此外,在到达各种计算机系统组件后,以计算机可执行指令或数据结构形式的程序代码可以自动地从传输介质被传递到计算机存储设备(反之亦然)。例如,通过网络或数据链接接收的计算机可执行指令或数据结构可以被缓冲在联网硬件105b内的RAM中,并且然后被最终传递到计算机系统101处的系统存储器103和/或不那么易失的计算机存储设备(例如,数据存储库104)。因此,应该理解,计算机存储设备可以被包括在也(或甚至主要)利用传输介质的计算机系统组件中。
计算机可执行指令例如包括指令和数据,其在(多个)处理器102处执行时,使计算机系统101执行特定功能或功能群组。计算机可执行指令例如可以是二进制文件、诸如汇编语言之类的中间格式指令、或者甚至是源代码。
本领域技术人员将理解,本发明可以在具有许多类型的计算机系统配置的网络计算环境中被实践,包括个人计算机、台式计算机、膝上型计算机、消息处理器、手持设备、多处理器系统、基于微处理器或可编程的消费电子产品、网络PC、小型计算机、大型计算机、移动电话、PDA、平板计算机、寻呼机、路由器、交换机等。本发明还可以在分布式系统环境中被实践,在该分布式系统环境中,通过网络链接(通过硬连线的数据链接、无线数据链接或通过硬连线和无线数据链接的组合)的本地和远程计算机系统都执行任务。因此,在分布式系统环境中,计算机系统可以包括多个组成的计算机系统。在分布式系统环境中,程序模块可以位于本地和远程存储器存储设备中。
如所图示的,数据存储库104可以存储表示应用代码的计算机可执行指令和/或数据结构,应用代码诸如例如调试器软件应用106、操作系统107、和任何其他软件应用108。当应用代码正在(例如,使用(多个)处理器102)执行时,系统存储器103可以存储对应的运行时数据,诸如运行时数据结构、计算机可执行指令等。因此,图1将系统存储器103图示为包括运行时调试器数据106'、运行时操作系统数据107'、和运行时应用数据108'。
图1还包括(多个)处理器102的内部硬件组件的简化表示。如所图示的,每个处理器102包括多个处理单元102a。每个处理单元可以是物理的(即,物理处理器核)和/或逻辑的(即,由支持超线程的物理核呈现的逻辑核,其中多于一个应用在物理核处执行线程)。因此,例如,即使在一些实施例中,处理器102可能仅包括单个物理处理单元(核),它也可以包括由该单个物理处理单元呈现的两个或更多个处理单元102a。
每个处理单元102a执行由应用限定的处理器指令(例如,调试器106、操作系统107、应用108等的代码指令),并且这些指令从预定义的处理器指令集架构中选择。每个处理器102的特定指令集架构基于处理器制造方和处理器模型而变化。常用的指令集架构包括来自INTEL公司的IA-64和IA-32架构,来自ADVANCED MICRO DEVICES公司的AMD64架构,以及来自ARM HOLDINGS公开有限公司的各种高级RISC机器(“ARM”)架构,但是存在大量其他的指令集架构并且可以由本发明使用。通常,“指令”是由处理器可执行的最小的外部可见(即,在处理器外部)的代码单元。
每个处理单元102a从共享(即,由处理单元102a共享)的处理器高速缓存102b获得处理器指令,并且基于共享的高速缓存102b中的数据、基于寄存器102c中的数据、和/或在没有输入数据的情况下执行处理器指令。通常,共享的高速缓存102b是存储系统存储器103的部分的处理器上副本的少量(即,相对于典型的系统存储器103的量较少)的随机存取存储器。例如,当执行应用108的可执行代码时,共享的高速缓存102b将运行时应用数据108'的子集(例如,变量、数据结构等)存储在共享的高速缓存102b的数据高速缓存部分中。如果(多个)处理单元102a需要尚未被存储在共享的高速缓存102b中的数据,则发生“高速缓存未命中”,并且该数据从系统存储器103被提取(潜在地从共享的高速缓存102b中逐出一些其他数据)。寄存器102c是基于硬件的存储位置,其基于(多个)处理器102的指令集架构而被限定。
调试器106使得应用代码(例如,应用108的代码)的执行能够在调试用户接口(例如,在显示器105c处呈现的用户界面)处被跟踪、修改和可视化。例如,调试器可以使应用108的代码指令由(多个)处理器102执行,同时在该执行期间观察程序状态,并且使用户能够设置断点、查看和更改观察到的程序状态等。在一些实施例中,调试器106可以是仅依赖于应用108的用于调试的代码的传统调试器,或者在一些实施例中可以是“时间旅行”调试器,其使用被存储在先前记录的追踪文件中的数据来重放应用108的代码的执行,该先前记录的追踪文件至少包括在应用的先前执行期间的一部分应用状态并且使调试器104能够重现该先前执行。
根据本文中的实施例,调试器106使得断点能够在整个数据结构上被设置,而不是仅在基本地址或对数据结构的引用上被设置。图2图示了对应于调试器106的调试器200,其包括用于有助于使得断点在整个数据结构上被设置的多个子组件201-206。
如所描绘的,在一个示例中,调试器200可以包括代码执行组件201、断点组件202、数据结构标识组件203、存储器地址标识组件204、变化检测组件205和/或用户接口组件206。所描绘的子组件201-206的身份和布置仅仅是作为描述中的辅助的一个示例,并且本领域普通技术人员将认识到索引组件200的子组件的特定身份和数目可以基于实现而极大地改变(例如,如省略号所指示的)。通常,代码执行组件201基于来自用户接口206的指令来执行应用代码。在代码执行期间,断点组件202监测基于用户接口206处的用户输入所限定的断点。这些断点可以包括直到整个数据结构的断点,其布局由数据结构标识组件203标识,并且该布局由存储器地址标识组件204使用以标识由数据结构覆盖的存储器地址。现在,通过频繁参考图3A-图6B中呈现的数据结构和存储器布局来更详细地描述这些组件和概念。
代码执行组件201在(多个)处理器102处执行作为调试主体的应用(例如,应用108)的代码。代码执行组件201可以如传统的调试器一样自然地执行应用代码108,或者可以通过向执行代码提供从追踪文件获得的应用状态来执行应用代码作为“时间旅行”调试器,以再现应用代码的先前执行。
在代码执行组件201处执行应用代码期间,断点组件202使用监测列表202a来监测断点的触发。特别地,断点组件202监测对监测列表202a中列出的存储器地址的存储器访问(例如,读取或写入)。当访问被监测的存储器地址时,断点组件202通过暂停由代码执行组件201进行的代码执行来“触发”断点,并且发信号通知用户接口组件206以呈现触发的通知。
应当理解,实现整个数据结构上的断点可以涉及使用监测列表202a,监测列表202a存储相对于传统调试器通常可以监测的断点数量的大量(例如,数千或更多)存储器地址。这可能导致无法使用硬件断点,或无法使用探测技术,这可能显著影响执行性能。为了克服这些限制,结合图8简要呈现了有助于监测大量断点的一个示例机制。
数据结构标识组件203接收对数据结构的引用,针对该数据结构期望断点。例如,基于用户接口206处的用户输入,数据结构标识组件203接收数据结构的引用(例如,名称、存储器地址等),潜在地还有理解该数据结构所需的任何其他信息。例如,图3A图示了数组300的示例,数组300包括多个数组条目(302a-302n,统称为数组条目302)。接收对数组的引用可以包括接收对数组300的头部301(例如,第一条目)的引用(例如,存储器地址)。作为示例,接收对数组300的引用可以是在用户接口组件206处对数组300的用户选择的结果。作为另一示例,图4A图示了双重链表400的示例,其包括多个节点402a-402n(统称为节点402)。接收对链表400的引用可以包括接收对链表400的头部401(例如,第一节点)的引用(例如,存储器地址)。作为示例,接收对链表400的引用可以是在用户接口组件206处对链表400的用户选择的结果。
返回图2,基于接收对数据结构的引用,数据结构标识组件203确定数据结构的类型(并且潜在地确定其他特性)。数据结构组件可以基于用户接口组件206处的用户供给的提示、基于诸如符号的编译器数据等来标识数据结构类型/特性。例如,数据结构标识组件203可以确定数组300是数组,或者链表400是双重链表。数据结构标识组件203还可以基于用户接口组件206处的用户供给的提示、基于诸如符号的编译器数据等来确定其他特性,诸如数组300和/或链表400中的条目的数目以及每个条目的数据类型(例如,原语类型,诸如整数、布尔、字符、引用等;或另一数据结构类型)。
基于数据结构的类型,数据结构标识组件203确定如何在存储器中布置该类型的数据结构。为此,数据结构标识组件203可以利用数据结构布局信息的一个或多个源。作为一个示例,数据结构标识组件203可以包括原生组件203a,其基于与正被调试的程序相对应的编程语言原生支持的数据结构来标识数据结构布局信息。例如,大多数现代编程语言原生地支持复合数据结构(例如,数组、记录、联合等),并且因此这些结构的布局由正被使用的编程语言很好地限定。
因此,再次简要地参考图3A,为了标识数组300如何被布置在存储器中,数据结构标识组件203可以咨询原生组件203a以确定数组针对正在被调试的编程语言如何在存储器中被布置。因此,数据结构标识组件203可以将数组结构标识为存储器中彼此相邻的多个条目(例如,数组条目302),其中数组引用(头部301)是数组中的第一条目的存储器地址。基于被存储在条目中的数据的类型,数据结构标识组件203还可以确定每个数组条目302的大小。
返回图2,作为另一示例,数据结构标识组件203可以包括库组件203b,库组件203b基于可用的代码库来标识数据结构布局信息。例如,库组件203b可以访问编程语言特定的库(例如,C++标准模板库等)或其他更通用的库或数据结构描述框架(例如,来自微软公司的Natvis等)。这些库通常限定了更抽象的数据结构类型的布局,诸如容器、列表、树、图等。
因此,再次简要地参考图4A,为了标识链表400如何在存储器中被布局,数据结构标识组件203可以咨询库组件203b以确定双重链表针对正在被调试的编程语言如何在存储器中被布置。因此,数据结构标识组件203可以将链表结构标识为多个节点402,每个节点402包括:(i)引用前一节点或者对于第一节点引用空406a的“前一”指针403a-403n(“前一”指针403a-403n统称为前一指针403);(ii)用于每个节点的节点条目数据404a-404n(统称为节点条目数据404),以及(iii)引用下一节点,或者对于最后的节点引用空406b的“下一”指针405a-405n(“下一”指针405a-405n统称为下一指针405)。数据结构标识组件203可以用作为与第一节点(402a)相关联的存储器地址的引用(头部401)来标识链表结构。基于条目中存储的数据类型,数据结构标识组件203还可以确定用于每个节点的节点条目数据404的大小。
返回图2,作为又一示例,数据结构标识组件203可以包括定制功能组件203c,定制功能组件203c基于用户限定的功能来标识数据结构布局信息。例如,所引用的数据结构可以是非标准的用户限定的数据结构,并且因此用户可以供给定制功能,该定制功能引导数据结构标识组件203如何确定定制数据结构的布局。例如,定制功能可以包括解析/遍历数据结构、并且使存储器地址标识组件204能够标识由数据结构覆盖的存储器地址的代码。
如所描绘的,数据结构标识组件203还可以包括可组成性组件203d。可组成性组件203d使数据结构标识组件203能够标识包括其他数据结构(即,包括一个或多个“内部数据结构”的“外部数据结构”)的数据结构的布局。为此目的,可组成性组件203d标识外部数据结构的类型和内部数据结构的一个或多个类型,并且确定包括所有这些类型的数据结构布局。例如,数组300(在该示例中为外部数据结构)的每个数组条目302、或链表400(再次地,在该示例中为外部数据结构)中的每个节点402的节点条目数据404可以是内部数据结构(例如,类的不同实例)而不是简单的原语。因此,可组成性组件203d可以确定这些内部数据结构的类型,并且在确定包括外部数据结构和内部数据结构的整体数据结构布局时考虑它们。在这样做时,数据结构标识组件203可以使用原生组件203a(例如,以标识外部数组300的布局)、库组件203b(例如,以标识外部链表400的布局)、或定制功能组件203c(例如,以标识内部类实例的布局)来标识外部和内部数据结构中的每个数据结构的布局。
另外,即使在内部数据结构是通过引用被标识、而不是作为外部数据结构中的实际条目的情况下,可组成性组件203d也可以用内部数据结构来组成外部数据结构。此示例在图3B和图4B中被描绘。图3B描绘了与图3A的数组300相对应的数组300',但是其中每个数组条目(302a'-302n',统称为数组条目302')将引用(例如,原语)存储到对应于内部数据结构(303a-303n,统称为内部数据结构303)的存储器地址。类似地,图4B描绘了与图4A的链表400相对应的链表400',但是其中每个节点的节点条目数据(404a'-404n',统称为节点条目数据404')将引用(例如,原语)存储到对应于内部数据结构(406a-406n,统称为内部数据结构406)的存储器地址。
因此,在确定外部数据结构的布局时,可组成性组件203d可以遍历这些引用以包括内部数据结构(例如,用于数组300'的内部数据结构303、或用于链表400'的内部数据结构406)的布局。在一些实施例中,可组成性组件203d可以遍历多个级别的引用(例如,在内部数据结构303/406本身的情形下,包括对其他数据结构的引用等)。在这些实施例中,调试器200可以包括可配置的选项以限制被遍历的级别的数目。
一旦所标识的数据结构的数据结构布局由数据结构标识组件203(如果有内部数据结构,则包括内部数据结构)确定,存储器地址标识组件204就使用该知识来标识由所标识的数据结构覆盖的存储器地址。这可以包括遍历(例如,用于链表、树、图等的)数据结构的节点之间的链接,基于(例如,用于数组的)条目大小和数目来计算存储器布局,和/或调用定制函数(例如,标识如何导航数据结构和/或返回所覆盖的存储器地址列表的定制函数)。存储器地址标识组件204将这些被覆盖的存储器地址存储在监测列表202a中,以供断点组件202监测。
为了图示前述内容,图5A至图6B图示了分别对应于图3A至图4B的数据结构300/300'/400/400'的一些示例存储器布局500/500'/600/600'。应当理解,这些存储器布局仅用于说明目的,并且是非限制性的。例如,每个所描绘的存储器位置可以对应于单个可寻址存储器位置(例如,单个字节),或对应于一定范围的可寻址存储器位置(例如,多个字节)。另外,相同示例内的每个所描绘的存储器位置可以对应于不同数目的字节。例如,虽然一个所描绘的存储器位置可以对应于覆盖适当存储器大小的一定数目的存储器地址以存储存储器引用,但是相同示例内的另一所描绘的存储器位置可以对应于覆盖适当存储器大小的不同数目的存储器地址以存储整个内部数据结构,整个内部数据结构的大小远远大于存储器引用的大小。此外,虽然这些示例中的许多存储器位置可以被描绘为是连续的,但这仅仅是用于说明中的简单性,并且对于许多数据结构,所覆盖的存储器位置可以是(并且在许多情况下可能是)不连续的。
图5A图示了对应于图3A的数组300的示例存储器布局500,并且该布局可以由存储器地址标识组件204基于由数据结构标识组件203确定的布局信息来标识。存储器布局500表示存储器部分506,并且标识存储器部分506内的一定范围的存储器地址504,一定范围的存储器地址504包括存储器位置502a-502n(统称为存储器位置502),每个存储器位置对应于数组300的不同数组条目302。因此,每个存储器位置502覆盖足够数目的存储器地址以存储其对应条目302的数据。这些存储器位置开始于地址501(即,位置502的起始),地址501对应于数组300的引用头部301。
图5的存储器布局500可以由存储器地址标识组件204基于头部301的知识、基于每个数组条目302的大小的知识、以及基于数组300中的条目数目的知识来计算。在确定该存储器布局500之后,存储器地址标识组件204可以将所标识的存储器地址的范围504存储在监测列表202a中,使得断点在这些位置中的任何位置被访问时发生。注意,由于这是数组,因此存储器地址504的范围可以表示连续的存储器块,但这不是必须的。例如,被管理的运行时可以选择以非连续方式存储这些存储器范围以有助于高速缓存、垃圾收集等。
类似地,图5B图示了对应于图3B的数组300'的示例存储器布局500'。图5B图示了两个存储器部分(506'和507)。存储器部分506'通常对应于图5A的布局500中的存储器部分506,并且它包括对应于存储器位置502'(即,位置502a'、502b',依此类推至502c')的存储器地址504'的第一范围,其又各自对应于数组300'的数组条目302'之一。每个存储器位置502'覆盖足够数目的存储器地址以存储其对应条目302'的数据(例如,在该示例中为引用原语)。存储器地址504'的第一范围通常表示包含对内部数据结构303的引用的外部数据结构(数组)。存储器地址504'的第一范围例如可以基于数组头部的知识、基于每个数组条目302'(例如,引用原语)的大小的知识、以及基于数组300'中的条目数目的知识而被确定。
存储器部分505包含存储器位置(503a-503n,统称为存储器位置503),每个存储器位置存储数组300'的内部数据结构303之一。因此,如所描绘的,存储器部分505包括存储器地址的第二范围505。在确定该存储器布局500'之后,存储器地址标识组件204可以将所标识的存储器地址的范围(504'和505)存储在监测列表202a中,使得断点在这些位置中的任何位置被访问时发生。注意,如上所述,由于存储器地址的第一范围504'表示数组,因此存储器地址的范围504'可以对应于连续的存储器块(但是这不是必须的)。然而,对应于存储器地址的第二范围505的存储器可以不是连续的。例如,在存储两个不同的内部数据结构303的存储器位置503中可能存在间隙,或者甚至在存储个体数据结构303的存储器位置中也可能存在间隙(取决于它们的结构)。
作为另一示例,图6A图示了对应于图4A的链表400的示例存储器布局600,并且该布局可以由存储器地址标识组件204基于由数据结构标识组件203确定的布局信息来标识。存储器布局600表示存储器部分609,并且标识存储器地址的范围607,其包括存储器位置603a-603n、604a-604n和605a-605n(分别被统称为存储器位置603、604和605)。该存储器地址范围607对应于链表400的节点402(即,用于节点402a的存储器位置603a、604a和605a;用于节点402b的存储器位置603b、604b和605b;以及用于节点402c的存储器位置603c、604c和的605c)。这些存储器位置在地址601(位置603a)处开始,地址601对应于用于链表400的引用头部401。每个存储器位置603、604和605覆盖足够数目的存储器地址以存储节点402的其对应部分的数据。例如,存储器位置603和605中的每一个存储器位置覆盖足够数目的存储器地址以存储引用,并且每个存储器位置604覆盖足够数目的存储器地址以存储节点条目数据404。再次地,这些存储器位置可以是连续的,但也可以包括一些非连续的部分。
存储器布局600可以由存储器地址标识组件204基于链表400的头部401的知识、基于节点条目数据404的大小的知识,以及基于每个节点的结构的知识(即,到前一节点403的链接,节点数据404和到下一节点405的链接)来计算。因此,存储器地址标识组件204可以遍历链表400的链接以标识每个被覆盖的存储器位置。在确定该存储器布局600之后,存储器地址标识组件204可以将所标识的存储器地址范围607存储在监测列表202a中,使得断点在这些位置中的任何位置被访问时发生。
类似地,图6B图示了对应于图4B的链表400'的示例存储器布局600'。图6B图示了两个存储器部分609'和610。存储器部分609'通常对应于图6A的布局600中的存储器部分609,并且它包括对应于存储器位置603'(即,位置603a'、603b',依此类推到603c')、604'(即,位置604a'、604b',依此类推到604c')和605'(即,位置605a'、605b',依此类推到605c')的存储器地址的第一范围607',其又对应于链表400'的节点。存储器地址的第一范围607'通常表示包含对内部数据结构406的引用的外部数据结构(链表)。存储器部分609'可以例如基于链表的头部的知识、基于节点条目数据404'的大小的知识、以及基于每个节点的结构的知识而被确定。
存储器部分610存储器包含存储器位置(606a-606n,统称为存储器位置606),每个存储器位置存储链表400'的内部数据结构406之一。因此,如所描绘的,存储器部分610包括存储器地址的第二范围608。在确定该存储器布局600'之后,存储器地址标识组件204可以将所标识的存储器地址范围(607'和608)存储在监测列表202a中,使得断点在这些位置中的任何位置被访问时发生。再次地,应当理解,存储器部分610和609'可以包括连续的和/或非连续的存储器位置。
返回图2,存储器地址标识组件204包括概念组件204a和物理组件204b。这些组件操作以基于将在调试器106处被呈现的数据结构的视图——概念或物理的类型来确定哪些存储器地址被添加到监测列表202a。这可以基于用户偏好、性能考虑和/或资源利用率考虑。
通常,数据结构的概念视图是被存储在数据结构中的数据的视图,而物理视图还暴露数据结构的底层结构/布局。因此,例如,为了产生链表400'的概念视图,概念组件204a可以仅将那些存储器标识的位置添加到监测列表202a,这会在节点条目数据404'或内部数据结构406被访问时(例如,图6B中的存储器位置604'和608)引起断点,而将存储器位置603'和605'中的任何其余位置留在监测列表202a之外——即使它们已被标识为被链表400覆盖。相反,为了产生物理视图,概念组件204a可以将存储器位置608和607'中的所有位置添加到监测列表202a。因此,通过概念视图,链表400'上的断点将在用户和/或正被调试的软件关心的数据发生变化时发生。另一方面,物理视图还将使链表400'上的断点在链表400'的结构变化发生时(例如,对指针403和405的修改或添加)发生。
应当理解,对于总体调试,概念视图可能是期望的,因为它仅在其中数据可能影响正被调试的软件做出的决策的点处引起数据结构上的断点。然而,对于更详细的调试以跟踪实现数据结构本身、竞争条件等的代码中的程式错误,物理视图可能是期望的。注意,即使正被调试的软件没有做出任何改变或没有对其进行访问,数据结构的物理视图也可能改变。例如,被管理的环境可以将对于一个存储器区域的数据结构复制到另一存储器区域,以有助于高速缓存、垃圾收集等。在这些情况下,物理视图将改变(即,所存储的数据的存储器位置和/或指针的值将需要改变),而概念视图将保持不变。一些实施例还可以通过仅将与结构相关的存储器位置放置在监测列表202a上来聚焦于物理视图——仅在主体数据结构的物理结构已经改变时中断,而将与所存储的数据有关的存储器位置留在监测列表202a之外。
变化检测组件205操作以检测针对其设置了断点的数据结构的改变。例如,如果从数组300添加、重新定位或移除条目,或者从链表400添加、移动或移除节点,则变化检测组件205可以检测该变化并使监测列表202中用于该数据结构的存储器位置被适当更新。变化检测组件205可以增量地做出这些改变(例如,仅修改已经被添加或移除的这些存储器位置),或者它可以从监测列表202a移除与数据结构有关的所有存储器位置并再次执行数据结构的完整分析(即,使用数据结构标识组件203和存储器地址标识组件204)。
在参考早前的组件时,已经参考了用户接口组件206。然而,用户接口组件206通常操作以在用户接口处呈现数据并且有助于接收用户输入。输入的示例类型可以是针对其期望断点的数据结构的身份、描述数据结构的附加数据、用于描述数据结构的布局的定制函数等。
鉴于前述内容,图7图示了用于在由数据结构覆盖的多个存储器地址上设置断点的示例方法700的流程图。考虑图1-图6B来描述方法700。虽然方法700被呈现为一系列动作,但是应当理解,所示出的动作的特定数目和顺序仅是在由数据结构覆盖的多个存储器地址上设置断点的示例。
如所描绘的,方法700包括接收数据结构的身份的动作701。动作701可以包括接收对数据结构的引用,针对该数据结构请求断点。例如,结合诸如键盘/鼠标105a之类的输入硬件,用户接口组件206可以接收数据结构的身份,针对该数据结构请求断点。该引用可以是数据结构名称、存储器地址等。
方法700还包括标识数据结构布局的动作702。动作702可以包括:基于接收到对数据结构的引用,标识数据结构的数据结构布局。例如,数据结构标识组件203可以标识在动作701中标识的数据结构的类型和布局。例如,这可以包括:将数据结构标识为由所使用的编程语言原生支持的结构(即,使用原生组件203a),标识来自库的数据结构(即,使用库组件203b),和/或基于定制的用户限定的功能来标识数据结构(即,使用定制功能组件203c)。另外,动作702可以包括:直接或通过引用来标识数据结构是包括内部数据结构的外部数据结构(即,使用可组成性组件203d)。然后,数据结构标识组件203可以标识这些外部和内部数据结构中的每一个的结构,并且将外部和内部数据结构组成在一起以获得整体数据结构布局。
方法700还包括标识由数据结构覆盖的存储器地址的动作703。动作703可以包括:基于数据结构的数据结构布局,标识由数据结构覆盖的多个存储器地址。例如,存储器地址标识组件204可以基于由数据结构标识组件203获取的结构知识来标识数据结构覆盖哪些存储器地址。取决于环境(例如,用户偏好、性能问题等),存储器地址标识组件204可以标识与数据结构的概念视图(即,概念组件204a)相关联的存储器地址,和/或与数据结构的物理视图(即,物理组件204b)相关联的存储器地址。
方法700还包括将存储器地址添加到监测列表的动作704。动作704可以包括将多个存储器地址添加到断点列表。例如,存储器地址标识组件204可以将在动作703中标识的存储器地址添加到监测列表202a,使得断点组件202基于这些地址来执行断点检查。
在一些实施例中,方法700可以包括在数据结构改变时更新断点列表的动作705。动作705可以包括:检测由数据结构覆盖的多个存储器地址中的至少一个变化,以及更新断点列表中的多个存储器地址以反映该至少一个变化。例如,随着所标识的数据结构改变(例如,由于数据元素的添加、修改或移除,由于运行时环境的活动等),变化检测组件205可以检测到这些变化已经发生,并且使监测列表202a适当地更新(通过被存储在202a中的存储器地址的差异变化,或者通过用数据结构标识组件203和存储器地址标识组件204对数据结构进行新分析)。
因此,本文的实施例扩展断点功能性以将断点添加到由数据结构覆盖的多个存储器地址(即,直到整个数据结构),而不是仅添加到数据结构的基本存储器地址。因此,实施例可以在与数据结构相关联的任何存储器地址在执行期间被访问时,使调试器能够暂停代码执行。这可以极大减少调试应用所花费的时间量,从而释放计算资源以用于其他任务。
如所提及的,实现整个数据结构上的断点可以涉及使用监测列表202a,其存储远远超过可用的硬件辅助机制(例如,特殊的处理器寄存器)的大量(例如,数千或更多)存储器地址。此外,使用传统的基于软件的机制(即,代码探测),以软件检查每个断点是非常昂贵的(即,在处理器周期方面),并且需要对每个存储器访问操作执行这些昂贵的检查。
因此,一些实施例利用新且高效的机制以处置断点。此机制使用高速缓存而不是代码探测来有助于断点检查。特别地,此机制使断点检查能够仅在高速缓存未命中发生时执行,而不是在每个存储器访问操作发生时执行——这极大地减少了断点检查的发生并在检测断点时极大地提高了性能。
为了说明此概念,图8描绘了用于使用高速缓存来监测断点的示例环境800。在图8中,调试器801(例如,图2的调试器106)通过高速缓存803执行存储器读取801a以及向存储器802的写入801b。然而,不是以常规方式使用高速缓存803,而是调试器801操作以确保对应于正被监测的(多个)存储器地址(例如,监测列表202a中的地址)的(多个)任何高速缓存线都从高速缓存803中被逐出。
例如,当(多个)存储器地址被添加到监测列表202a时(例如,通过存储器地址标识组件204),调试器108检查高速缓存803中是否已存在与(多个)这些存储器地址重叠的任何高速缓存线;如果存在,则它们从高速缓存803中被逐出。然后,当基于对任何存储器地址的访问而发生高速缓存未命中时,调试器801(例如,断点组件202)确定是否需要断点检查。特别地,调试器801基于监测列表202a中的高速缓存未命中存储器地址来比较被导入高速缓存的高速缓存线,以确定是否存在任何重叠的(多个)存储器地址。
如果不存在重叠的存储器地址,则不可能发生断点,因此该高速缓存未命中被认为是正常的(例如,其被允许保留在高速缓存803中)。但是,如果存在重叠,则可能发生断点,因此执行断点检查以确定是否实际遇到断点。例如,调试器801可以确定与重叠的存储器地址相对应的高速缓存线的部分是否被实际访问(即,断点已经发生),或者是否仅高速缓存线的一些其他部分被访问(即,断点没发生)。另外,如果存在重叠地址,则高速缓存线从高速缓存803中被逐出,使得另一高速缓存未命中将发生——并且通过此,如果之后该存储器地址被再次访问,则另一断点检查将被执行。通过这种方式,仅需要针对使高速缓存未命中发生的一些存储器访问操作、而不是针对每个存储器访问操作来执行断点检查。
因此,结合图8描述的断点检查实施例可以提供用于监测大量存储器地址的高效机制。然而,这仅是一种机制,并且本文中的实施例均不限于使用这些机制。
尽管已经用特定于结构特征和/或方法动作的语言描述了本主题,但是,应当理解,所附权利要求书中限定的主题不必限于上述的特征或动作,或上述的动作的顺序。相反,所描述的特征和动作被公开为实现权利要求的示例形式。
在不脱离本发明的精神或基本特性的情况下,本发明可以以其他具体的形式来实施。所描述的实施例在所有方面都应被视为仅是说明性的而非限制性的。因此,本发明的范围由所附权利要求而不是前面的描述来指示。在权利要求的含义和等同范围内的所有变化都将被包含在其范围内。
Claims (20)
1.一种计算机系统,包括:
一个或多个处理器;以及
一个或多个计算机可读介质,其上存储有计算机可执行指令,所述计算机可执行指令由所述一个或多个处理器可执行,以使所述计算机系统在由数据结构覆盖的多个存储器地址上设置断点,所述计算机可执行指令包括可执行以使所述计算机系统至少执行以下操作的指令:
接收对数据结构的引用,断点针对所述数据结构而被请求;
基于接收到对所述数据结构的所述引用,标识所述数据结构的数据结构布局;
基于所述数据结构的所述数据结构布局,标识由所述数据结构覆盖的多个存储器地址;以及
将所述多个存储器地址添加到断点列表。
2.根据权利要求1所述的计算机系统,其中标识所述数据结构的所述数据结构布局包括从以下中的至少一项中标识数据结构类型:(i)由编程语言原生提供的数据结构,或(ii)由库或数据结构描述框架所描述的数据结构。
3.根据权利要求1所述的计算机系统,其中标识所述数据结构的所述数据结构布局包括:标识描述所述数据结构的定制功能。
4.根据权利要求1所述的计算机系统,其中标识所述数据结构的所述数据结构布局包括编译器符号的使用。
5.根据权利要求1所述的计算机系统,其中标识由所述数据结构覆盖的所述多个存储器地址包括:标识与所述数据结构的概念视图相对应的存储器地址。
6.根据权利要求1所述的计算机系统,其中标识由所述数据结构覆盖的所述多个存储器地址包括:标识与所述数据结构的物理视图相对应的存储器地址。
7.根据权利要求1所述的计算机系统,其中标识由所述数据结构覆盖的所述多个存储器地址包括:用一个或多个内部数据结构来组成所述数据结构。
8.根据权利要求7所述的计算机系统,其中用一个或多个内部数据结构来组成所述数据结构包括:跟随至少一个级别的链接以获得所述一个或多个内部数据结构。
9.根据权利要求1所述的计算机系统,所述计算机可执行指令还包括如下指令,所述指令可执行以使所述计算机系统执行:
检测由所述数据结构覆盖的所述多个存储器地址中的至少一个变化;以及
更新所述断点列表中的所述多个存储器地址,以反映所述至少一个变化。
10.根据权利要求1所述的计算机系统,其中所述数据结构的身份包括所述数据结构的基本存储器地址。
11.一种在包括一个或多个处理器的计算机系统上被实现的、用于在由数据结构覆盖的多个存储器地址上设置断点的方法,所述方法包括:
接收对数据结构的引用,断点针对所述数据结构而被请求;
基于接收到对所述数据结构的所述引用,标识所述数据结构的数据结构布局;
基于所述数据结构的所述数据结构布局,标识由所述数据结构覆盖的多个存储器地址;以及
将所述多个存储器地址添加到断点列表。
12.根据权利要求11所述的方法,其中标识所述数据结构的所述数据结构布局包括从以下中的至少一项中标识数据结构类型:(i)由编程语言原生提供的数据结构,或(ii)由库或数据结构描述框架所描述的数据结构。
13.根据权利要求11所述的方法,其中标识所述数据结构的所述数据结构布局包括:标识描述所述数据结构的定制功能。
14.根据权利要求11所述的方法,其中标识所述数据结构的所述数据结构布局包括编译器符号的使用。
15.根据权利要求11所述的方法,其中标识由所述数据结构覆盖的所述多个存储器地址包括:标识与所述数据结构的概念视图相对应的存储器地址。
16.根据权利要求11所述的方法,其中标识由所述数据结构覆盖的所述多个存储器地址包括:标识与所述数据结构的物理视图相对应的存储器地址。
17.根据权利要求11所述的方法,其中标识由所述数据结构覆盖的所述多个存储器地址包括:用一个或多个内部数据结构来组成所述数据结构。
18.根据权利要求17所述的方法,其中用一个或多个内部数据结构来组成所述数据结构包括:跟随至少一个级别的链接以获得所述一个或多个内部数据结构。
19.根据权利要求11所述的方法,还包括:
检测由所述数据结构覆盖的所述多个存储器地址中的至少一个变化;以及
更新所述断点列表中的所述多个存储器地址,以反映所述至少一个变化。
20.一种计算机可读存储介质,其上存储有计算机可执行指令,所述计算机可执行指令由一个或多个处理器可执行,以使计算机系统在由数据结构覆盖的多个存储器地址上设置断点,所述计算机可执行指令包括可执行以使所述计算机系统至少执行以下操作的指令:
接收对数据结构的引用,断点针对所述数据结构而被请求;
基于接收到对所述数据结构的所述引用,标识所述数据结构的数据结构布局;
基于所述数据结构的所述数据结构布局,标识由所述数据结构覆盖的多个存储器地址;以及
将所述多个存储器地址添加到断点列表。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US15/463,424 | 2017-03-20 | ||
US15/463,424 US10169196B2 (en) | 2017-03-20 | 2017-03-20 | Enabling breakpoints on entire data structures |
PCT/US2018/022084 WO2018175139A1 (en) | 2017-03-20 | 2018-03-13 | Enabling breakpoints on entire data structures |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110431536A CN110431536A (zh) | 2019-11-08 |
CN110431536B true CN110431536B (zh) | 2023-06-02 |
Family
ID=61873917
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201880018952.2A Active CN110431536B (zh) | 2017-03-20 | 2018-03-13 | 实现整个数据结构上的断点 |
Country Status (4)
Country | Link |
---|---|
US (1) | US10169196B2 (zh) |
EP (1) | EP3602307B1 (zh) |
CN (1) | CN110431536B (zh) |
WO (1) | WO2018175139A1 (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10740220B2 (en) | 2018-06-27 | 2020-08-11 | Microsoft Technology Licensing, Llc | Cache-based trace replay breakpoints using reserved tag field bits |
CN109117381A (zh) * | 2018-10-24 | 2019-01-01 | 北京奇虎科技有限公司 | 处理任务的调测方法及装置 |
CN113360142B (zh) * | 2021-06-24 | 2023-07-07 | 广东工贸职业技术学院 | 一种数控内嵌plc中间文件的设计与编译方法 |
Family Cites Families (39)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5535318A (en) | 1992-04-30 | 1996-07-09 | Ricoh Company, Ltd. | Debugging system for a hierarchically structured page description language |
US5931956A (en) * | 1997-06-10 | 1999-08-03 | Atmel Corporation | Digital circuit using memory for monitoring signals for occurrences of predefined breakpoint conditions |
CA2211505C (en) * | 1997-07-25 | 2002-02-05 | Ibm Canada Limited-Ibm Canada Limitee | Setting instance breakpoints in object oriented computer programs |
US6106572A (en) | 1998-03-25 | 2000-08-22 | Origins Software Company | Forward and reverse hierarchical page level debugger |
US6237135B1 (en) | 1998-06-18 | 2001-05-22 | Borland Software Corporation | Development system with visual design tools for creating and maintaining Java Beans components |
US6182208B1 (en) | 1998-08-14 | 2001-01-30 | Lucent Technologies, Inc. | System for debugging (N) break points by dividing a computer program to (n+1) regions each contains no break point and using two registers to define the start and end addresses of each region |
US6795962B1 (en) | 1999-12-30 | 2004-09-21 | Microsoft Corporation | Machine independent debugger |
US7000225B2 (en) * | 2000-12-07 | 2006-02-14 | International Business Machines Corporation | Method for inserting global breakpoints |
US7047519B2 (en) * | 2001-09-26 | 2006-05-16 | International Business Machines Corporation | Dynamic setting of breakpoint count attributes |
US7644394B2 (en) | 2001-11-30 | 2010-01-05 | International Business Machines Corporation | Object-oriented creation breakpoints |
US7650592B2 (en) | 2003-03-01 | 2010-01-19 | Bea Systems, Inc. | Systems and methods for multi-view debugging environment |
US7272826B2 (en) * | 2003-05-08 | 2007-09-18 | International Business Machines Corporation | Hierarchical breakpoint groups |
US7694278B2 (en) | 2004-07-09 | 2010-04-06 | Microsoft Corporation | Data cube script development and debugging systems and methodologies |
US7634761B2 (en) | 2004-10-29 | 2009-12-15 | Microsoft Corporation | Breakpoint logging and constraint mechanisms for parallel computing systems |
FR2880963B3 (fr) * | 2005-01-19 | 2007-04-20 | Atmel Corp | Points d'arrets logiciels destines a etre utilises avec des dispositifs a memoire |
US20070168736A1 (en) | 2005-12-19 | 2007-07-19 | Ottavi Robert P | Breakpoint groups |
US8352713B2 (en) * | 2006-08-09 | 2013-01-08 | Qualcomm Incorporated | Debug circuit comparing processor instruction set operating mode |
US7840849B2 (en) | 2006-12-21 | 2010-11-23 | Novell, Inc. | Methods and apparatus for debugging software including divisions of an execution history of a debuggee program |
US8612720B2 (en) | 2007-02-09 | 2013-12-17 | Edgewater Computer Systems, Inc. | System and method for implementing data breakpoints |
US8336032B2 (en) | 2007-12-05 | 2012-12-18 | International Business Machines Corporation | Implementing enhanced template debug |
US9032374B2 (en) | 2008-04-03 | 2015-05-12 | International Business Machines Corporation | Metadata-integrated debugger |
US8423965B2 (en) | 2009-06-23 | 2013-04-16 | Microsoft Corporation | Tracing of data flow |
JP2011070256A (ja) * | 2009-09-24 | 2011-04-07 | Toshiba Corp | デバッガおよびプログラム |
US8745597B2 (en) * | 2009-11-25 | 2014-06-03 | International Business Machines Corporation | Providing programming support to debuggers |
US20110154111A1 (en) * | 2009-12-23 | 2011-06-23 | International Business Machines Corporation | Memory Based Hardware Breakpoints |
US8856742B2 (en) * | 2010-06-11 | 2014-10-07 | International Business Machines Corporation | Distributed debugging |
US8578340B1 (en) | 2010-09-24 | 2013-11-05 | Ca, Inc. | Recording and replaying computer program execution with recorded execution event breakpoints |
US9552206B2 (en) * | 2010-11-18 | 2017-01-24 | Texas Instruments Incorporated | Integrated circuit with control node circuitry and processing circuitry |
US8656359B2 (en) * | 2011-03-25 | 2014-02-18 | Sap Ag | Debugging data mappings |
US8522213B2 (en) * | 2011-05-12 | 2013-08-27 | International Business Machines Corporation | Debugger and debugging methods using breakpoints conditioned on the static identity of data |
CN103207830B (zh) * | 2012-01-13 | 2016-12-14 | 上海华虹集成电路有限责任公司 | 带有软件断点的仿真器 |
US8954926B2 (en) * | 2012-03-05 | 2015-02-10 | Microsoft Corporation | Code coverage detection with scriptable language unmodified source |
CN103678073A (zh) * | 2012-09-25 | 2014-03-26 | 上海华虹集成电路有限责任公司 | 仿真系统 |
CN104346274B (zh) * | 2013-07-29 | 2017-06-06 | 国际商业机器公司 | 程序调试器及一种程序的调试方法 |
US9021444B2 (en) | 2013-08-19 | 2015-04-28 | Concurix Corporation | Combined performance tracer and snapshot debugging system |
US9176821B2 (en) | 2013-10-30 | 2015-11-03 | Freescale Semiconductor, Inc. | Watchpoint support system for functional simulator |
US9875173B2 (en) | 2014-06-30 | 2018-01-23 | Microsoft Technology Licensing, Llc | Time travel debugging in managed runtime |
US9588870B2 (en) | 2015-04-06 | 2017-03-07 | Microsoft Technology Licensing, Llc | Time travel debugging for browser components |
US9996448B2 (en) * | 2016-02-25 | 2018-06-12 | Red Hat Israel Ltd | Breakpoint insertion into kernel pages |
-
2017
- 2017-03-20 US US15/463,424 patent/US10169196B2/en active Active
-
2018
- 2018-03-13 WO PCT/US2018/022084 patent/WO2018175139A1/en unknown
- 2018-03-13 EP EP18715318.4A patent/EP3602307B1/en active Active
- 2018-03-13 CN CN201880018952.2A patent/CN110431536B/zh active Active
Also Published As
Publication number | Publication date |
---|---|
EP3602307A1 (en) | 2020-02-05 |
US10169196B2 (en) | 2019-01-01 |
CN110431536A (zh) | 2019-11-08 |
EP3602307B1 (en) | 2023-01-18 |
WO2018175139A1 (en) | 2018-09-27 |
US20180267882A1 (en) | 2018-09-20 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11016891B2 (en) | Facilitating recording a trace file of code execution using a processor cache | |
US10592396B2 (en) | Memory validity states in time-travel debugging | |
US10802946B2 (en) | Presenting differences between code entity invocations | |
RU2769785C1 (ru) | Точки останова воспроизведения трассировки на основе кэша, использующие зарезервированные биты поля тега | |
EP3568767B1 (en) | Efficient breakpoint detection via caches | |
US20180113809A1 (en) | Facilitating recording a trace file of code execution using way-locking in a set-associative processor cache | |
US20190324891A1 (en) | Visualizing last/next known data values in time travel traces | |
CN110431536B (zh) | 实现整个数据结构上的断点 | |
US20230124327A1 (en) | Cross-thread memory indexing in time-travel debugging traces | |
WO2020112420A1 (en) | Indexing and searching a time-travel trace for arbitrary length/arbitrary alignment values | |
US11068378B2 (en) | Memory value exposure in time-travel debugging traces |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |