状态转变的诊断的制作方法_2

文档序号:9553227阅读:来源:国知局
进行定向的能力。
[0024] 计算机应用常常调用用于在主应用之外执行操作的方法。各示例包括访问资源、 卸载困难计算、以及从存储读取文件。一般而言,用于执行各种方法的办法包括同步操作和 异步操作。同步操作一般在该方法执行任务的同时停止主应用的执行。停止应用具有在同 步操作完成的同时保持有价值的计算资源(诸如用户界面(UI)呈现线程)的风险。在方 法返回结果之后,主应用被恢复。作为对比,异步操作允许应用在方法执行任务的同时继续 执行工作。只要应用调用将会等待不确定且相对较长时间的方法(诸如访问计算机网络上 的资源)时,相比于同步操作而言优选异步操作。
[0025] 开发者已经发现与常用且相对直接的同步编程模型相比异步编程模型难以理解 或实现。开发者奋力地推理关于异步工作,因为它是并行完成的。而编写同步代码的开发 者能够容易得推理串联状态转变,异步操作可并发地处理转变。异步操作中的转变可以同 步或异步地发生,并且这些状态转变的结果可以影响之后的状态转变,这意味着开发者需 要更好的工具来推理这一类型的编程办法。由于提供更多特征来促进流行语言、框架和 运行时中的异步编程的越来越多的趋势,这一点尤其如此。各示例包括用于JavaScript Promise (承诺)类的Microsoft Windows Library (微软窗口库)、C#语言版本5.0中介 绍的async (异步)和await (等待)关键词、以及Microsoft Visual Basic.NET 11中介 绍的Await (等待)和Async (异步)关键词。
[0026] 在其中发生中断的代码片断的源头在执行期间实际发生问题时是未知的情形中, 调试或故障排除代码是困难的。一个示例包括控制转移,诸如回调。回调是对作为自变量被 传递给其他代码的可执行代码片断的引用。这允许较低层级的软件层调用在较高层级层中 定义的子例程或函数。现代编程语言中的异步编程常常用回调来实现,并且与许多不同事 件或线程相关联的异步回调可以用始发自具体事件或线程使用的无效参数来执行。当有关 异常被抛出(由于例如空参数中的解除引用)时,最初封装有问题参数的代码通常不再在 栈上可供检查。这一问题对于强类型语言和弱类型语言两者以及其中事件驱动的应用编程 接口(API)常用的静态类型化语言和动态类型化语言中的一者或两者而言是典型的问题, 如同线程池、web工作器等那样。
[0027] 除了异步控制转移中呈现的问题之外,如web浏览器中执行的JavaScript尤其易 于遭受一组特定的控制转移相关问题。例如,调试网页文档对象模型(DOM)元素可能是困 难的,因为常常没有与页面中的特定元素的源头有关的可用信息(因为那些元素可能是在 运行时由多种机制中的任一种动态构建的,而非在静态HTML代码中统一描述的)。这些源 头细节对于调试某类问题(诸如诊断存储器泄漏,其中确定什么代码负责构建和/或注入 未被正确清除的页面对象是重要的)可能是至关重要的。DOM是用于表示对象以及与标记 语言(例如HTMUXHTML和XML)文档中的对象交互的跨平台且与语言无关的约定。DOM树 中的对象可以通过对对象使用各种方法来寻址和操纵,并且DOM的公共接口在其API中指 定。对于开发者而言在代码中设置在具体元素类型的每一次构建时会停止的中断点是不可 行的。在许多运行时环境中,只要向DOM添加具体种类的元素就设置中断点也是不可行的。 更新近的浏览器环境支持DOM改变事件,包括为对DOM的每一种类变更调用一组丰富的回 调。然而,这些事件可能不是调试具体问题的优选或有效(高效)的方式,并且当前没有浏 览器诊断工具集能够展现使用这一机制来跟踪对象源头以便调试问题或进行故障排除的 一般方法。
[0028] 图2解说了一种用于解决在诊断运行时人工制品中呈现的挑战的方法200,在运 行时人工制品中存在应用中的执行控制的转移,诸如构建对象、发起回调、调度参数化工作 器线程、使用与DOM元素相关联的状态和事件处理程序等。
[0029] 代码中导致执行控制转移的点的一些示例包括关联回调或构建对象。公共回调可 以与许多始发者相关联。回调也可与诸如事件、XMLHttpRequest (XHR)请求、线程池请求以 及其他之类的异步操作相关联。在接收到回调之际,栈可能不再包含与该回调及其相关联 的参数所源自的代码位置有关的信息。然而,这一信息常常被用来解决中断,诸如用来修复 参数构建逻辑。在另一示例中,中断点可以在包括显式构建函数的强类型化语言中设置以 便在构建对象实例时停止。在动态语言中,这并非总是可能的,因为不存在表示DOM提供的 类型的构建函数的源代码位置。例如,开发者无法在构建任何画布元素上设置中断点。诸 如函数定义之类的一些对象可能源自用于'eval (求值)'的调用或者在JavaScript/DOM 中可用的若干其他动态代码生成API之一,诸如setTimeout、setlnterval、Function ()、 execScript 等。
[0030] 在web应用中,许多问题由于与DOM元素相关联的状态或事件处理程序有关的问 题而产生。在这些情形中,知道相关DOM元素被插入到文档中的源代码位置常常是有帮 助的。然而,如上所述,这一信息在运行时对于所有对象而言通常是不可用的。DOM元素 和HTML/JavaScript应用中的其他运行时对象可以源自各种各样的API、createElement、 setlnnerHtml、document, write、eval 等。
[0031] 方法200关联与其中运行时问题往往在稍后才体现的运行时人工制品的源头有 关的诊断信息。诊断信息可包括源代码位置,诸如栈帧和其他诊断信息。开发者在对照那 些目标进行标准的诊断操作时可以咨询这一信息,标准的诊断操作诸如命中受影响的回调 中的中断点或者检查处于非正确状态的DOM元素。诊断信息可被用来执行标准调试和故障 排除操作(诸如跳转到代码)以便对表示问题的根本原因的始发代码进行故障排除。所有 对象构建的调用栈位置也可被收集以便协助存储器剖析、协助调试存储器泄漏等。
[0032] 在方法200中,在202,逻辑操作内的执行单元的状态转变在计算机可读指令的运 行时期间被记入日志。一个示例的状态转变包括创建操作单元。在一个示例中,该逻辑操 作可包括异步操作而执行单元可包括同步工作项。在这一示例中,异步操作是异步工作的 抽象。异步操作创建一个或多个同步工作项,并且可以与除了其创造者之外的零个或多个 工作项有关。同步工作项是同步工作片断的抽象。同步工作项与创建它们的异步操作相关 联。同步工作项可以创建零个或更多附加异步操作。出于解说而使用异步操作,但各示例 可适用于其他的控制转移。在204,诊断信息(诸如调用栈帧和其他信息)与该逻辑操作相 关联。在206,记入日志的状态转变和相关联的诊断信息被提供以供在所选点处进行检索, 该所选点诸如在中断点处或者在抛出异常时。
[0033] 在202,状态转变可以被记入持久存储位置中,诸如被记入到存储器104中创建的 数据结构中。记入日志可包括通过发布事件或调用注册以供通知的回调来广播状态转变, 以及用相关信息来注释运行时对象,相关信息可包括状态转变或其他诊断细节。例如,在用 动态语言来构建对象时,相关信息可被直接添加到对象实例。在创建对象时,信息可以被推 送至对象内以携带该信息。记入日志可进一步包括用处理或提出通知并且将相关信息维护 在数据结构中的包装器来替换运行时对象或类。
[0034] 如所述的,诊断信息可包括与关联于状态转变的调用栈有关的信息。另外,诊断信 息可包括与状态转变相关联的时间戳。此外,诊断信息可包括各种标识符,这些标识符可用 于标识在异步操作的生存期期间的异步操作。此类标识符的示例可包括,可吸住跟踪同步 工作子单元的执行上下文标识符、进程标识符、实际线程标识符、操作标识符、平台标识符、 逻辑工作单元标识符、伏标识符、以及标识当前处理器102或计算设备100的信息。一种类 型的标识符可包括组件对象模型(COM)技术中由操作系统用来与诸如在从微软公司可获 得的商标名称Windows下可用的那些操作系统进行通信的逻辑线程标识符。在一些示例 中,该标识符可以被表示为多位(64位、128位等)标识符,诸如通用唯一标识符(UUID)。在 其他示例中,该标识符可以被呈现为文本、评论、或其他对开发者友好的记号。
[0035] 其他诊断信息可包括与XHR请求相关联的统一资源定位符(URL),例如,统一资源 定位符(URL)可以流向在请求完成时被执行的回调。这一信息可以在调试期间使用以便确 定原始URL请求是否经由不安全的协议并且因此遭受篡改。
[0036] 在一个示例中,为任何动态构建的代码提供栈信息,即,当命中代码中由对求值 的调用或其等效函数之一产生的中断点时,知道当代码被动态构建时(诸如通过对求值、 setTimeout或其他的调用)是当前的栈将是有帮助的。另一示例将栈与注入到DOM中的代 码位置相关联。例如,用于innerHTML设置程序的调用可能导致构建任意DOM元素,包括脚 本元素或与元素相关联的可调试JavaScript位,例如,mouseover (置鼠标于上方)处理程 序。此处的异步操作是构建一组DOM元素和事件处理程序以及对这些处理程序的任何实际 调用。命中一个同步工作项中的中断点(例如mouseover回调)可以提供对与单独的同步 工作项相关联的栈信息的访问,诸如innerHTML或某一其他DOM注入机制、appendChild或 其他最初被调用的代码位置。
[0037] 方法200可以被实现为在计算设备100上运行的工具。在一个示例中,该工具是 软加程序或软件包的一部分,诸如操作系统或者在托管环境适用的情况下的托管环境。软 件程序可被包括在存储计算机可执行指令的计算机可读存储介质中,该计算机可执行指令 用于控制计算设备(诸如计算设备1〇〇)以执行方法200。
[0038] 方法200描述了一种用于构建和维护包括各个节点和边的图的机制,这些节点和 边表示某一逻辑操作(例如异步操作)的执行和过程。该图组织在各种上下文、跨各个线 程、进程等进行的执行。各个节点或执行子单
当前第2页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1