logo好方法网

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


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