利用所应用的存储器区域生命期的比特精确跟踪分析制造技术

技术编号:25449139 阅读:25 留言:0更新日期:2020-08-28 22:34
基于应用的执行的可重放跟踪来检测和提供在应用的先前执行期间的非故障存储器访问的通知。实施例包括从应用的先前执行的可重放跟踪重放应用的先前执行的(多个)部分,同时跟踪由应用使用的(多个)存储器区域的生命期。基于跟踪存储器区域的生命期,检测在应用的先前执行期间由应用进行的非故障但不适当的(多个)存储器访问。在用户界面处和/或向软件组件提供关于这些非故障但不适当的(多个)存储器访问的通知。

【技术实现步骤摘要】
【国外来华专利技术】利用所应用的存储器区域生命期的比特精确跟踪分析
技术介绍
常见的编程错误类别包括导致线程执行超出所分配存储器的存储器读取和/或写入操作(即,越界存储器访问)的错误。例如,一类编程错误是由存储器分配函数保留的存储器使用不当引起的。很多编程语言和/或库提供使得进程能够请求指定大小的存储器块的分配(例如,从可用存储器池,诸如堆)的一个或多个存储器分配函数调用(例如,C标准库中的malloc())、以及用于稍后重新分配该存储器的一个或多个存储器重新分配函数调用(例如,C标准库中的free())。通常,存储器分配函数从存储器池中定位和保留指定大小的连续的可用存储器块,并且在该块的开始返回指向存储器地址的指针。然后,线程可以基于距该指针的整数偏移来访问该保留的存储器块中的存储器位置。但是,很多编程语言可能很少或根本没有提供保护以防止线程实际访问保留块之外的存储器地址。如果线程向其保留块之外的存储器写入,则存在可能会不适当地覆盖有效的存储器值(例如,作为不同数据结构的部分和/或由另一线程使用的值)的风险。如果线程从其保留块之外的存储器中读取数据,则存在以下风险:可能读取意外数据(例如,来自不同数据结构和/或由另一线程写入的数据),读取未定义数据(例如,尚未被写入的存储器位置),或通过尝试访问不可访问存储器而导致访问冲突。另一类常见的编程错误涉及导致线程在其有效性状态已经转变之后从存储器位置不适当地访问存储器的错误。例如,在很多计算机架构中,每个执行线程与称为“堆栈”的存储器区域相关联,该存储器区域在线程执行时存储临时本地信息。通常,每次函数被调用时,新的“堆栈框架”被添加到堆栈,并且在该函数终止时,该函数的堆栈框架从堆栈中移除。因此,堆栈在线程的执行期间动态地增长和收缩。每个堆栈框架会为函数的任何局部变量分配一个或多个存储器位置。这些存储器位置在函数执行时对于要使用的函数是“有效”的,但是在从堆栈中移除堆栈框架时对于要使用的任何函数是“无效”的。但是,即使堆栈框架已经从堆栈中移除(并且存储器位置已经变为无效),编码错误也可能导致对这些存储器位置的访问(读取和/或写入)。编程语言可能很少或根本没有提供保护以防止线程执行这些类型的基于堆栈的不适当的存储器访问。这些类型的不适当的存储器访问可能特别难以定位和调试,因为它们实际上并不会在所有情况下都导致线程执行失败(故障)。如本文中使用的,引起故障的不适当的存储器访问是导致错误(例如,分段故障、访问冲突、未处理异常等)的访问,该错误导致线程的执行终止。这与适当的存储器访问相反,适当的存储器访问可能会导致通常称为“故障”(例如,页面故障)的事件,但是该事件实际上并不会错误地导致线程的执行终止。导致执行失败的错误可能在读取和依赖无效数据并且无效数据以某种方式导致执行“失败”时发生,或者在线程访问不允许访问或实际上不对应于合法存储器地址的存储器位置时发生。但是,超出所分配存储器的每次访问或对不再有效的存储器的每次访问都不一定会导致发生这些故障之一。例如,即使存储器访问可能不适当,它也可能读取有效数据(例如,线程先前写入的并且随后未被覆盖的数据),它可能是对线程被允许访问的存储器位置的访问,等等。因此,出于本说明书的目的,术语“非故障”包括非错误的页面故障(诸如在大多数虚拟存储系统中用于允许临时“调出”存储器的页面故障)。类似地,术语“执行故障”(或其变体)通过排除非错误页面故障而更具限制性,并且旨在涵盖影响继续执行能力的故障(例如,访问冲突、分段故障、未处理异常等)。当然,术语“非执行故障”(或其变体)因此表示“执行故障”的反义词。已经进行了先前的尝试来定位不适当的非故障存储器访问,但是它们不能检测所有实例,并且可能不利地改变程序执行状态。例如,一种尝试是使用调试程序来设置写断点以观察每个存储器写入,并且手动确定它是否在范围之内。但是,这很繁琐,并且在生产软件上也不可行。另一尝试是在程序出现故障之后解析存储器转储,以便尝试确定其原因。然而,这也很繁琐并且丢失状态。其他先前尝试试图鼓励这些不适当的存储器访问中的一些出错。例如,一些工具在邻近所分配缓冲区的线程的地址空间内(例如,在堆内和/或在线程的堆栈空间之后)插入(多个)存储器页面,其中这些页面包含作为非法地址或该线程不允许访问的存储器地址。如果线程试图读取的内容超出所分配缓冲区并且进入这些“保护页面”之一,则会发生故障(例如,分段故障、访问冲突等)。然而,保护页面将仅能够检测第一类编程错误(即,读取超出所分配缓冲区),并且即使那样,保护页面也不能用于检测超出所分配缓冲区的所有访问。例如,在所分配缓冲区与保护页面之间可能仍然存在允许线程访问的存储器位置。这些存储器位置可能包括用于存储器对准的填充、其他所分配缓冲区等。尝试鼓励不适当的存储器访问错误的另一种先前尝试涉及使用预定义的任意值来预填充堆栈位置,以增加在读取未初始化的值的情况下导致错误的可能性。但是,预填充堆栈位置会带来附加的执行开销,并且无法捕获所有未初始化的值的使用。此外,调试技术的最新发展已经包围了通常被称为“时间旅行”跟踪(TTT)的内容。通常,TTT涉及记录应用程序的一个或多个线程的实时执行的比特精确跟踪,从而使得能够在稍后的时间完整且精确地重放这些线程的先前执行。因此,TTT能够创建“时间旅行”调试程序,该调试程序能够在正反两个方向上忠实地重放一个或多个线程的执行并且执行其他类型的丰富分析。
技术实现思路
本文中描述的至少一些实施例应用时间行进跟踪的比特精确跟踪分析以跟踪线程在其先前执行期间实际使用的存储器区域的生命期。特别地,实施例使用所跟踪的存储器区域的生命期来标识线程何时对所分配存储器之外的(多个)存储器位置进行了非故障但不适当的(多个)访问和/或当存储器位置在有效与无效之间转变时线程何时对(多个)存储器位置进行了非故障但不适当的(多个)访问。这样,实施例可以标识否则难以发现的编程错误,这些错误导致这些非故障存储器访问在线程的先前执行期间发生。一些实施例基于应用的执行的可重放跟踪来检测在应用的先前执行期间的非故障存储器访问。这些实施例包括方法、系统和计算机程序产品,该方法、系统和计算机程序产品从应用的执行的可重放跟踪重放应用的先前执行的一个或多个部分,同时跟踪由应用使用的存储器区域的生命期。基于跟踪存储器区域的生命期来检测在应用的先前执行期间由应用进行的一个或多个非故障存储器访问,并且向用户界面或其他组件提供关于一个或多个非故障存储器访问的通知。可以检测的非故障存储器访问的一个示例包括:由应用进行的超出请求大小的存储器(例如,超出所分配缓冲区)的存储器访问。另一示例包括在至少以下各项的有序序列之后,由应用进行的从堆栈位置的读取:(i)在堆栈位置有效的同时对堆栈位置的写入;(ii)使堆栈位置无效;以及(iii)使堆栈位置有效,并且其中在使堆栈位置有效与读取之间,堆栈位置未被写入。又一示例包括在至少以下各项的有序序列之后,由应用进行的从堆栈位置的读取:(i)使堆栈位置有效,(ii)使堆栈位置无效,以及(iii)在堆栈位置无效的同时对堆栈位置写入,并且其中在本文档来自技高网
...

【技术保护点】
1.一种计算机系统,包括:/n一个或多个处理器;以及/n一个或多个计算机可读介质,其上存储有计算机可执行指令,所述计算机可执行指令由所述一个或多个处理器可执行以基于应用的执行的可重放跟踪来检测在所述应用的先前执行期间的非故障存储器访问,所述计算机可执行指令可执行以引起所述计算机系统至少执行以下各项:/n从应用的执行的可重放跟踪重放所述应用的先前执行的一个或多个部分,同时跟踪由所述应用使用的存储器区域的生命期;/n基于跟踪所述存储器区域的生命期,检测在所述应用的先前执行期间由所述应用进行的一个或多个非故障存储器访问,包括以下一项或多项:/n由所述应用进行的、超出请求大小的所分配存储器的存储器访问;/n在至少以下各项的有序序列之后,由所述应用从第一堆栈位置的第一读取:(i)在所述第一堆栈位置有效的同时对所述第一堆栈位置的写入,(ii)使所述第一堆栈位置无效,以及(iii)使所述第一堆栈位置有效,并且其中在使所述第一堆栈位置有效与所述第一读取之间,所述第一堆栈位置未被写入;/n在至少以下各项的有序序列之后,由所述应用从第二堆栈位置的第二读取:(i)使所述第二堆栈位置有效,(ii)使所述第二堆栈位置无效,以及(iii)在所述第二堆栈位置无效的同时对所述第二堆栈位置写入,并且其中在当所述第二堆栈位置无效的同时对所述第二堆栈位置写入与所述第二读取之间,在所述第二堆栈位置为有效堆栈位置的同时所述第二堆栈位置未被写入;或者/n在至少以下各项的有序序列之后,由所述应用对第三堆栈位置的第一写入:(i)使所述第三堆栈位置有效,以及(ii)使所述第三堆栈位置无效,并且其中所述第三堆栈位置在所述第一写入时无效;以及/n提供所述一个或多个非故障存储器访问的通知。/n...

【技术特征摘要】
【国外来华专利技术】20180109 US 15/865,6991.一种计算机系统,包括:
一个或多个处理器;以及
一个或多个计算机可读介质,其上存储有计算机可执行指令,所述计算机可执行指令由所述一个或多个处理器可执行以基于应用的执行的可重放跟踪来检测在所述应用的先前执行期间的非故障存储器访问,所述计算机可执行指令可执行以引起所述计算机系统至少执行以下各项:
从应用的执行的可重放跟踪重放所述应用的先前执行的一个或多个部分,同时跟踪由所述应用使用的存储器区域的生命期;
基于跟踪所述存储器区域的生命期,检测在所述应用的先前执行期间由所述应用进行的一个或多个非故障存储器访问,包括以下一项或多项:
由所述应用进行的、超出请求大小的所分配存储器的存储器访问;
在至少以下各项的有序序列之后,由所述应用从第一堆栈位置的第一读取:(i)在所述第一堆栈位置有效的同时对所述第一堆栈位置的写入,(ii)使所述第一堆栈位置无效,以及(iii)使所述第一堆栈位置有效,并且其中在使所述第一堆栈位置有效与所述第一读取之间,所述第一堆栈位置未被写入;
在至少以下各项的有序序列之后,由所述应用从第二堆栈位置的第二读取:(i)使所述第二堆栈位置有效,(ii)使所述第二堆栈位置无效,以及(iii)在所述第二堆栈位置无效的同时对所述第二堆栈位置写入,并且其中在当所述第二堆栈位置无效的同时对所述第二堆栈位置写入与所述第二读取之间,在所述第二堆栈位置为有效堆栈位置的同时所述第二堆栈位置未被写入;或者
在至少以下各项的有序序列之后,由所述应用对第三堆栈位置的第一写入:(i)使所述第三堆栈位置有效,以及(ii)使所述第三堆栈位置无效,并且其中所述第三堆栈位置在所述第一写入时无效;以及
提供所述一个或多个非故障存储器访问的通知。


2.根据权利要求1所述的计算机系统,其中所述非故障存储器访问包括由所述应用进行的所述第一读取、由所述应用进行的所述第一读取或由所述应用进行的所述第一写入中的至少一项,并且其中使所述第一堆栈位置无效、使所述第二堆栈位置无效以及所述使所述第三堆栈位置无效中的每一项包括第一堆栈框架从所述应用的堆栈的移除,并且其中使所述第一堆栈位置有效、使所述第二堆栈位置有效以及使所述第三堆栈位置有效中的每一项包括第二堆栈框架向所述应用的堆栈的添加。


3.根据权利要求1所述的计算机系统,其中所述非故障存储器访问包括由所述应用进行的所述第一读取。


4.根据权利要求1所述的计算机系统,其中所述非故障存储器访问包括由所述应用进行的所述第二读取,在使所述第二堆栈位置有效与使所述第二堆栈位置无效之间,所述第二堆栈位置已经被写入。


5.根据权利要求1所述的计算机系统,其中所述非故障存储器访问包括由所述应用进行的所述第一读取、由所述应用进行的所述第二读取或由所述应用进行的所述第一写入中的至少一项,并且其中所述第一堆栈位置、所述第二堆栈位置和所述第三堆栈位置包括函数局部变量。


6.根据权利要求1所述的计算机系统,其中所述非故障存储器访问包括由所述应用进行的、超出请求大小的所分配存储器的存储器访问,并且其中所述非故障存储器访问包括对被分配为存储器对准填充的存储器位置的读取或写入。


7.根据权利要求1所述的计算机系统,其中所述非故障存储器访问包括由所述应用...

【专利技术属性】
技术研发人员:H·加布里杰尔斯基J·莫拉
申请(专利权)人:微软技术许可有限责任公司
类型:发明
国别省市:美国;US

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

1