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

文档序号:9553227阅读:来源:国知局
元可能仍然处于进程中、已经完成、或者已被 调度当尚未执行。该系统跟踪构成节点的状态转变,将任意诊断相关信息与节点相关联,以 及提供足以随着时间流逝维护准确的图的边和其他信息。调试程序或其他诊断工具可以通 过使用当前可用节点(诸如与调试程序被停止的当前代码位置相关联的节点)来消费信息 以便遍历该图以计算或检索与理解当前代码执行上下文有关的在进行中的或已经完成的 工作的状态或其他诊断信息。
[0039] 在以下代码所示的异步因果关系建模的示例中,当用户在按钮上点击时调用btn_ OnClickO函数。这创建了其中在使用setTimeout的情况下完成某一长期运行的任务 的承诺。(承诺,有时也互换地用作"将来"或"延迟",指的是用于在一些并发语言中进 行同步的构造并且描述了充当最初未知的结果的代理的对象,因为通常对其值的计算尚 未完成)。在完成工作之后,它激发完成处理程序,其中异步地创建并写入两个文件的 OpenAndWriteToFiles函数被调用。接着联合两个异步写操作的承诺。在完成两个异步操 作之际,代码抵达消息"完成对所有文件的写入(Finished writing to all files)"。
[0042] 该示例示出对图的管理,因为它描述了管理两个不同异步操作的完成的联合操 作。围绕图的管理操作(诸如添加或移除节点、构建边、或其他修剪操作)与工作单元或活 动有关。包括异步工作的若干不同单元的操作可能由于取消而意外地停止。图/执行状态 可以在一组触发之一中的状态转变的基础上来变更。
[0043] 在图的上下文中,诊断信息可包括用于逻辑操作的全局标识符。这一上下文中的 其他标识符可包括线程标识符、操作标识符、状态转变标识符、当前节点标识符、父节点标 识符、用于在图节点之间构建边的标识符、和/或报告节点正向其转变的当前状态的信息。
[0044] 程序调试或调试是发现和减少计算机程序或电子硬件片断中的错误或缺陷数目 以使得计算机程序如预期那样表现的一种方法过程。一般来说,调试是耗时且令人厌烦的 任务,并且程序员常常使用诸如在被调试进程上操作的调试程序之类的软件工具来监视计 算机程序的执行以及执行程序调试。在程序调查期间,程序员可以停止被调试进程的执行, 收集数据值,或者基于变量的值以其他方式影响被调试进程的执行。调试常常作为质保的 一部分在程序部署之前来执行,但终端用户也可在程序使用期间发现问题。如果程序在终 端用户使用程序期间崩溃,则操作系统可以收集关于崩溃的信息,并且通过网络连接将该 信息提供给开发者作为崩溃转储。
[0045] 图3示出了被配置成在计算设备100上运行的示例诊断工具。在一实现中,计算 设备100包括调试程序系统应用300。调试程序系统计算机100的一个实施例(例如图1 中示出的计算设备100)包括与被调试进程计算机306(例如,与图1示出的计算设备100 类似的计算设备)对接的调试程序系统应用300,被调试进程计算机306包括图2中示出的 调试代理308和被调试进程310。
[0046] 调试程序系统应用300、调试代理308、和被调试进程310可以实现在任何合适类 型和合适数量的计算机系统上,诸如图1示出的计算设备100。在一个实施例中,调试程序 系统应用300是驻留在计算设备100上的应用程序之一,调试代理308是驻留在被调试进 程计算机306上的应用程序之一,而被调试进程310是驻留在被调试进程计算机306上的 应用程序之一。然而,调试程序系统应用300可替换地或附加地被具体化为一个或多个计 算机上的计算机可执行指令和/或与图1所示的不同变型。替换地或附加地,调试程序系 统应用300的一个或多个部分可以被存储在系统存储器104中、存储在其他计算机/应用 115上、或存储在用于运行调试程序系统应用的其他此类合适的变型中。
[0047] 在一个实施例中,调试代理308在远离包括调试程序系统应用300的调试程序系 统计算机100的被调试进程计算机306上。然而,在其他实施例中,调试代理308和/或被 调试进程310与调试程序系统应用300驻留在相同的计算机上。调试程序系统应用被配置 成请求被调试进程310的多个线程的当前调用栈。在图3所示的实施例中,被调试进程310 包括线程1、2、…N,它们相应地具有在312a、312b、…312c处指示的线程寄存器和栈存储 器。
[0048] 调试程序系统应用300、调试代理308和被调试进程310的各实施例在诸如程序模 块等由计算机执行的计算机可执行指令的一般上下文中描述。一般而言,程序模块包括执 行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等。实施例可在任 务由通过通信网络链接的远程处理设备来执行的分布式计算环境中实现。在分布式计算机 环境中,程序模块可位于包括媒体存储设备的本地和远程计算机存储介质两者中。
[0049] 在一个示例中,调试程序系统应用300可以是集成开发环境即IDE的一部分。IDE 可包括代码编辑器、编译器、构建工具、调试程序以及用于开发和测试应用的其他工具。IDE 的示例可以从来自微软公司的商标名称"Visual Studio"之下或者来自美国加利福尼亚州 库珀蒂诺市的Apple公司的商标名称"Xcode"之下获得。调试程序系统应用300也可以使 可以与一个或多个IDE包联用的单独产品或者作为独立产品。
[0050] 图4示出了一种与调试程序系统应用或其他软件诊断工具联用以对其中运行时 人工制品在稍后体现的应用进行故障排除或调试的方法400。在402,诊断信息与在应用的 运行时期间记入日志的逻辑操作内的执行单元的状态转变相关联。在一个示例中,状态转 变和诊断信息被记入到数据结构中。在404,调试程序或诊断在所选点处检索诊断信息和状 态转变。在一个示例中,从存储器中的数据结构检索与状态转变相关联的诊断信息。与状 态转变相关联的这一诊断信息可以在运行时期间检索,诸如在应用正在执行的同时。在某 一示例中,在异常或执行中的中断点处,应用可以被停止并且信息被检索。同样,与状态转 变相关联的诊断信息可以从崩溃转储检索。
[0051] 提供了针对JavaScript模型的用于将在计算机可读指令的运行时期间的逻辑操 作内的执行单元的状态转变记入日志并且将逻辑操作的诊断信息与状态转变相关联的示 例代码,如下:
[0052] var HaTpOQii;
[0053]






[0060] 以下示例Javascript代码示出了将文件的异步打开与在打开完成时执行的代码 相关联的单次控制转移。这一示例阐述了方法链接、或连贯接口、模式编程模型。
[0061] file. openAsync(FileAccessMode. read)
[0062] . done (function(stream){
[0063] //code to process stream omitted(略去用于处理流的代码)
[0064] })
[0065] 该示例开始于环境工作项,即,当示例代码执行时正在执行的无论什么工作项。 StorageFile对象被存储在名为"file"的变量中。第一行代码是对file的OpenAsync函 数的调用,它是异步函数并且与环境工作项相关联。OpenAsync函数创建单个工作项,它是 完成处理程序。完成处理程序工作项经由OpenAsync作业回头与环境工作项相关联。这一 连接将在完成处理程序中执行的工作的因果关系绑定回环境工作项。
[0066] 在完成处理程序工作项中,创建可以从完成处理程序工作项创建的另一异步工作 项操作是可能的。例如,以上的示例代码可以被修改以添加经由DataReader的流数据处 理。
[0068] 经修改的示例代码引入了第二异步调用,即,在OpenAsync的完成处理程序中的 reader. LoadAsync。第二异步操作是与创建在其中的工作项相关联的作业,在该示例中是 OpenAsync完成处理程序工作项而非环境工作项。该异步操作创建单个完成处理程序工作 项,该完成处理程序工作项将处理来自流的数据并且最终关闭DataReader。相应地,该示例 提供了与异步操作作业绑定在一起的一系列三个工作项。
[0069] 许多异步作业排他地执行被调用方指定工作。例如,StorageFile. OpenFile函数 由StorageFile对象实现。从调用方的角度,被调度的工作是实现StorageFile对象的实 现细节。这被称为"内部"因果关系工作项,因为被调度的工作对于作业的实现而言是内部 的。
[0070] 作为对比,一些异步作业执行调用方指定工作。一个示例是ThreadPool. RunAsync,它取得调用方提供的委托。ThreadPool RunAsync作业调度ThreadPool线程 上的工作来执行所提供的委托。被调度的工作对于作业的实现而言是外部的。具有外部 因果关系工作项的作业的其他示例包括CoreDispatcher. RunAsync、CLR的Task. Run以及 JavaScript的Web工作器。对于具有内部因果关系工作项的作业,该作业的开始和完成状 态与单个因果关系相关。对于具有外部工作项的作业,该作业的外部工作和完成处理程序 往回与单个因果关系中的初始工作项有关。
[0071] 以下C#的示例代码涉及使用线程池。
[0072] //Point 1 (点 1)
[0073] ThreadPool. RunAsync (() =>{
[0074] //Point 2(点 2)
[0075] Dispatcher. RunAsync(CoreDispatcherPriority. Normal, () =>{
[0076] //Point 3(点 3)
[0077] }
[0078] });
[0079] 该代码经由ThreadPool. RunAsync使用线程池线程来调度要完成的
当前第3页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1