软件故障的反向调试制造技术

技术编号:28434016 阅读:24 留言:0更新日期:2021-05-11 18:45
一种调试系统被配置为解决其中写指令被定向到未知目的地地址的存储器别名状况和其中为多个、并发执行的线程收集控制流信息的并发性状况两者。与应用的先前执行对应的记录的状态值和控制流信息二者被获取。

【技术实现步骤摘要】
【国外来华专利技术】软件故障的反向调试
技术介绍
计算机和对应的软件应用正变得越来越复杂,使得用户能够以各种方式来存储、访问以及操纵数据。例如,计算应用可以被用于执行文字处理、图形涉及、声音/视觉处理、数据分析、电子通信以及更多。计算机应用包括由计算机系统的一个或多个处理器执行的可执行指令形式的代码。这些指令由开发者在开发环境中创建并且定序在一起。一旦指令被编译、解译和/或构建,对应的应用就可以被部署以供使用。遗憾的是,计算机系统和应用不总是以所意图或所预期的方式来操作,这可能导致部署之前或之后的应用崩溃。至少出于该原因,调试应用以标识和修复代码中使应用崩溃的指令经常是必需的。还已经创建了不同的开发人员工具来协助开发者编写、编辑、测试和调试应用的可执行指令,以帮助解决系统故障。这些工具中的一些工具包括程序代码文本编辑器、源代码编辑器、调试器和集成开发环境(IDE),仅举几例。然而,遗憾的是,未被注意的程序错误有时会在开发阶段中持续存留,并且将直到软件应用被部署以供一般或广泛使用之后才会被注意到。在应用已经被部署的情况下,调试应用故障可能会更加困难,因为必须检查更大数量的代码以标识引起问题的指令。最近,被称为“时间旅行(timetravel)”调试的调试过程已经出现为一种流行的技术。利用时间旅行调试,跟踪器程序记录处理器指令中所有的处理器指令的状态、以及在程序的执行期间存在的状态中的许多状态。稍后,当程序被调试时,跟踪器数据被用于重创建在执行期间任何点存在的确切的存储器状态和寄存器状态,以便标识代码中引起错误的特定的指令和位置。该技术已经在收集跟踪数据的高资源使用在某种程度上可以接受的开发环境中对开发人员特别有优势。然而,其仍然是不合期望的,因为将被包括在常规时间旅行调试中的繁重的跟踪中的数据记录日志在计算上是昂贵的。附加地,应注意,用于时间旅行调试的该类型的繁重的跟踪对大部分部署后场景非常不实用。从而,大多数部署后调试众所周知地困难,因为与在开发期间所获取的、被收集用于时间旅行调试的大量数据相反,开发者已经必须依赖于非常有限的信息(例如,本质上仅有在部署之后被收集的被包括在存储器转储文件(dump)中的信息)。特别是应注意,应用的整个执行历史(例如时间旅行跟踪数据)经常是不可用的,因为对那些系统的高保真度的程序跟踪过于昂贵(即,客户端不想要连同执行应用一起来运行资源密集的调试程序)。该有限的信息可用性是为何调试已经被部署的应用是如此困难的主要因素中的一个主要因素。已经做出了一些尝试来向开发者提供可以在调试期间被使用的其他数据,诸如从稀疏处理器跟踪所获取的客户端侧调试数据。例如,的ProcessorTrace是一种轻量的硬件跟踪机制,其已经被包括在几乎所有的处理器内。本文中也称为稀疏跟踪、瘦(thin)跟踪、瘦硬件跟踪、稀疏/瘦跟踪、或者稀疏/瘦硬件跟踪的稀疏硬件跟踪标识应用的控制流(即,响应于应用的命令而由计算机系统执行的实际指令的序列)。尽管该信息可以用于标识程序的一般流,该控制流数据仅标识被执行的指令。其不描述数据值或者甚至被使用的存储器地址中的一些存储器地址。因此,该稀疏数据的使用尚未实质改进常规调试技术,特别是时间旅行调试。尽管有前述内容,已经做出一些尝试来导出、或者更确切地说推断以上所叙述的从使用硬件处理器跟踪所获取的控制流信息中缺失的数据值以及缺失的存储器地址。通常,这些尝试将被包括在存储器转储文件内的状态值与轻量级的硬件跟踪数据(即,控制流)组合,并且然后执行递归的后向分析来得到与每个处理器指令对应的未知状态。尽管这些调试技术中的一些调试技术已经是有帮助的,但是这些技术未被广泛采用,因为它们仅成功出标识处理器指令状态的总数目中的一小部分。结合该低性能,利用稀疏硬件跟踪数据调试程序的现有尝试已经遇到限制其可伸缩性和实用性的明显问题。例如,一个这样的问题在本文中被称为“存储器别名(memoryaliasing)”。该类型的问题当在递归的后向推断分析期间遇到针对未知目的地地址的写指令时发生,并且调试器无法知道如何处置针对该未知目的地地址的状态值。为解决该问题,一些现有的提议包括做出尝试来推断针对所有未知存储器位置的可能的选项中的所有可能的选项。然而,该类型的方法在实用上是被禁止的,因为调试系统不能够在不抵达资源的严重故障的情况下来跟踪并且解决针对所有分支的所有可能的推断,特别是针对大型和复杂的程序。另一种方法是避免做出针对未知存储器位置和对应的地址值的任何假设。然而,这种朴素的方法是不实用的,因为其实际上阻止了调试软件标识/推断任何大数量的信息,特别是针对复杂的程序。在这方面,前述方法中的两种方法都是不充分的,并且在实际上是不可伸缩的。当使用稀疏/瘦硬件跟踪数据来调试已经执行了大数量的指令(例如,数千个指令、数万个指令、数十万条指令、或者甚至数百万条指令)的程序是,特别如此。基于稀疏硬件跟踪数据的时间旅行调试具有的另一问题是“并发性”问题,当应用在多个处理器上执行和/或利用被分别跟踪的多个线程执行时,该“并发性”问题存在。该问题具体涉及难以获悉指令序列,因为针对每个跟踪的不同的指令没有各自的时间戳。替代地,在不同的跟踪中的每个跟踪内,指令的块与单个时间戳相关联。使用块时间戳,能够标识每个块的开始时间,但是不可能标识指令块中每个指令的具体时间和相对序列,特别是当并发地与在其他线程上执行的指令一起并发地执行那些指令的块时。由于推断所有可能的定序选项会要求指数式的分支/分析的潜在可能性,现有的调试系统的确不能够处置该并发性问题。鉴于前述内容,将理解,目前存在需要来标识调试解决方案,特别是可以有效地扩展的解决方案,这些解决方案减轻由于利用稀疏/瘦硬件跟踪的时间旅行调试而导致的存储器别名和/或多线程并发性问题。本文中所要求保护的主题不限于解决上述任何缺点或仅在上述环境中操作。更确切地说,仅提供该背景来说明在其中可以实践本文中所描述的一些实施例的一个示例性

技术实现思路
所公开的实施例包括被配置为利用稀疏硬件跟踪数据(例如,控制流数据)结合记录的状态值的有限集合来执行调试的计算机系统、方法和硬件存储设备。在一些实例中,以智能确定何时避免做出可能导致禁止的分析的推断的方式来执行调试,由此减轻时间旅行调试期间的存储器别名和/或多线程并发性问题。在一些实施例中,所公开的调试过程包括计算机系统,该计算机系统获取与应用的先前执行对应的一组记录的状态值。作为示例,这些记录的状态值可以被包括在存储器转储文件中(例如,来自应用崩溃),或者作为与被调试的代码内的断点或另一指定位置对应的手动触发的程序停止的结果。附加地,从被包括在应用的先前执行的瘦硬件跟踪中的硬件跟踪数据获取控制流信息。该控制流信息描述在应用的先前执行期间被执行的一组处理器指令的序列。随后,执行对该一组处理器指令的迭代的后向和前向分析,以标识与该处理器指令对应的程序状态或处理器状态中的至少一些程序状态或处理器状态。在迭代的后向和前向分析期间,当存储器写指令遇到未知的目的地写地址(由此引起存储器别名状况)时,迭代的后向和前向本文档来自技高网
...

【技术保护点】
1.一种计算机系统,包括:/n一个或多个处理器;以及/n一个或多个计算机可读硬件存储设备,具有被存储在其上的计算机可执行指令,所述计算机可执行指令能够由所述一个或多个处理器执行,以使所述计算机系统:/n获取与应用的先前执行对应的一组记录的状态值;/n从被包括在所述应用的所述先前执行的瘦硬件跟踪中的硬件跟踪数据获取针对一组处理器指令的控制流信息,所述一组处理器指令在所述应用的所述先前执行期间被执行;/n通过至少执行对在所述应用的所述先前执行期间被执行的所述一组处理器指令的迭代的后向和前向分析,针对所述一组处理器指令中的至少一些处理器指令中的每个处理器指令来标识在对应的执行时间处的特定程序状态;/n在所述迭代的后向和前向分析期间、并且响应于遇到(1)被包括在所述应用的所述先前执行期间被执行的所述一组处理器指令中并且(2)包括其目的地地址未知的存储器写指令的存储器写处理器指令:/n避免推断与所述存储器写指令相关联的所述未知的目的地地址处的未记录的程序状态值,使得至少直到检测到与所述未知的目的地地址相关联的冲突,所述未知的目的地地址中的过期值在所述迭代的后向和前向分析期间保持不被所述存储器写指令修改;以及/n响应于检测到所述冲突,在所述未知的目的地地址中的所述过期值可修正的情况下修正所述过期值,或者备选地,当所述过期值不可修正时,提供所述未知的目的地地址中的所述过期值不可修正的指示。/n...

【技术特征摘要】
【国外来华专利技术】20181001 US 16/148,8101.一种计算机系统,包括:
一个或多个处理器;以及
一个或多个计算机可读硬件存储设备,具有被存储在其上的计算机可执行指令,所述计算机可执行指令能够由所述一个或多个处理器执行,以使所述计算机系统:
获取与应用的先前执行对应的一组记录的状态值;
从被包括在所述应用的所述先前执行的瘦硬件跟踪中的硬件跟踪数据获取针对一组处理器指令的控制流信息,所述一组处理器指令在所述应用的所述先前执行期间被执行;
通过至少执行对在所述应用的所述先前执行期间被执行的所述一组处理器指令的迭代的后向和前向分析,针对所述一组处理器指令中的至少一些处理器指令中的每个处理器指令来标识在对应的执行时间处的特定程序状态;
在所述迭代的后向和前向分析期间、并且响应于遇到(1)被包括在所述应用的所述先前执行期间被执行的所述一组处理器指令中并且(2)包括其目的地地址未知的存储器写指令的存储器写处理器指令:
避免推断与所述存储器写指令相关联的所述未知的目的地地址处的未记录的程序状态值,使得至少直到检测到与所述未知的目的地地址相关联的冲突,所述未知的目的地地址中的过期值在所述迭代的后向和前向分析期间保持不被所述存储器写指令修改;以及
响应于检测到所述冲突,在所述未知的目的地地址中的所述过期值可修正的情况下修正所述过期值,或者备选地,当所述过期值不可修正时,提供所述未知的目的地地址中的所述过期值不可修正的指示。


2.根据权利要求1所述的计算机系统,其中与所述应用的所述先前执行对应的所述一组记录的状态值被包括在作为所述应用的崩溃的结果而生成的存储器转储文件中,或者备选地,所述一组记录的状态值响应于手动触发的事件而生成。


3.根据权利要求1所述的计算机系统,其中数据推断图被维持作为所述迭代的后向和前向分析的一部分,所述数据推断图被用于跟踪如何在所述迭代的后向和前向分析的前向方向和后向方向两者上推断特定数据值,所述特定数据值与被包括在所述一组处理器指令中的特定处理器指令相关联。


4.根据权利要求1所述的计算机系统,其中在所述未知的目的地地址中的所述过期值可修正的情况下修正所述过期值通过以下被执行:选择与所述过期值相关联的至少两个单独的值中的一个值,并且然后使用所选择的所述值用于所述存储器写指令。


5.根据权利要求1所述的计算机系统,其中在所述未知的目的地地址中的所述过期值可修正的情况下修正所述过期值通过以下被执行:恢复所述未知的目的地地址,并且然后使用经恢复的所述未知的目的地地址来推断所述过期值的实际值。


6.根据权利要求1所述的计算机系统,其中避免推断所述未知的目的地地址处的所述未记录的程序过期值通过忽略所述存储器写指令被执行。


7.一种计算机系统,包括:
一个或多个处理器;以及
一个或多个计算机可读硬件存储设备,具有被存储在其上的计算机可执行指令,所述计算机可执行指令能够由所述一个或多个处理器执行,以使所述计算机系统:
获取与应用的先前执行对应的一组记录的状态值;
标识与所述应用的所述先前执行对应的瘦硬件跟踪数据,所述瘦硬件跟踪数据包括硬件跟踪数据,所述硬件跟踪数据包括:(1)针对在所述应用的所述先前执行期间被执行的处理器指令的多个操作块的控制流信息;以及(2)针对被包括在所述多个操作块中的每个操作块的对应的操作块时间戳,其中所述多个操作块中的至少一些操作块由不同的处理器线程执行;
通过基于所述多个操作块中的每个操作块的对应的操作块时间戳对每个操作块顺序排序,来生成所述多个操作块的单个合并序列列表;以及
通过至少执行对被包括在所述多个操作块的所述单个合并序...

【专利技术属性】
技术研发人员:崔伟东葛馨阳B·C·C·卡斯克西牛犇王若愚尹寅洙
申请(专利权)人:微软技术许可有限责任公司
类型:发明
国别省市:美国;US

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1