协助开发工具通过插入的代码声明的制作方法

文档序号:6533948阅读:133来源:国知局
协助开发工具通过插入的代码声明的制作方法
【专利摘要】本发明所描述的主题的各方面涉及协助开发工具。在各方面中,影响运行时行为的声明可被插入程序代码中。例如,插入函数中的声明可设置运行时对象的性质以指示向调试器通知在该函数的范围内遇到的异常。当运行时环境遇到异常时,运行时环境可判断该性质是否适用于当前执行的范围。如果是,则运行时环境可基于性质的值向开发工具通知或不向开发工具通知异常。
【专利说明】协助开发工具通过插入的代码声明
[0001] 背景
[0002] 当在运行时调试软件时,通常期望区分软件开发者不直接负责的代码。例如,软件 开发者可能不想要调试器当在库代码中遇到异常时被激活。一些非动态语言试图通过使用 在编译时可用的编译时属性来解决这个问题。然而,动态语言不具有这一能力。
[0003] 在此要求保护的主题不限于解决任何缺点或仅在诸如上述环境中操作的各个实 施例。相反,提供该背景仅用以示出在其中可实践在此描述的部分实施例的一个示例性技 术领域。
[0004] 概述
[0005] 简言之,本发明所描述的主题的各方面涉及协助开发工具。在各方面中,影响运行 时行为的声明可被插入程序代码中。例如,插入函数中的声明可设置运行时对象的性质以 指示将向调试器通知在该函数的范围内遇到的异常。当运行时环境遇到异常时,运行时环 境可判断该性质是否适用于当前执行的范围。如果是,则运行时环境可基于该性质的值向 开发工具通知或不向开发工具通知该异常。
[0006] 提供本概述是为了简要地标识在以下详细描述中进一步描述的主题的一些方面。 本概述并不旨在标识出所要求保护的主题的关键特征或必要特征,也不旨在用于限制所要 求保护的主题的范围。
[0007] 除非上下文清楚地指出,否则短语"本发明所描述的主题"指的是【具体实施方式】中 描述的主题。术语"方面"应被当作"至少一个方面"。标识【具体实施方式】中所描述的主题 的各方面不旨在标识所要求保护的主题的关键特征或必要特征。
[0008] 上述各方面和本发明所描述的主题的其它方面是作为示例说明的,并且不受附图 限制,附图中相似的参考标号指示相似的元素。

【专利附图】

【附图说明】
[0009] 图1-2是表示本发明所描述主题的各方面可以在其中操作的示例性环境的框图; [0010] 图3是概括地表示根据本发明所描述主题的各方面的、可在运行时环境中进行的 示例性动作的流程图;
[0011] 图4是概括地表示根据本方面所描述的主题的各方面的、可从开发工具的角度进 行的示例性动作的流程图;以及
[0012] 图5是概括地表示根据本发明所描述的主题的各方面的、可在异常发生时进行的 示例性动作的流程图。

【具体实施方式】
[0013] 定义
[0014] 如本文所使用的,术语"包括"及其变体被当作开放式术语,表示"包括但不限于"。 除非上下文另外清楚地指示出,否则术语"或"被当作"和/或"。术语"基于"被当作"至少 部分地基于"。术语"一个实施例"和"一实施例"被当作"至少一个实施例"。术语"另一实 施例"被当作"至少一个其他实施例"。
[0015] 如本文所使用的,诸如"一"和"该"等术语包括了所指示的项或动作中的一个或 多个。具体而言,在权利要求书中,对某一项的引用一般表示存在至少一个这样的项,并且 对一动作的引用表示执行该动作的至少一个示例。
[0016] 本文中有时可使用术语"第一"、"第二"、"第三"等等。没有其他上下文,权利要求 中对这些术语的使用不意在暗示排序,而是用于标识的目的。例如,短语"第一版本"和"第 二版本"不一定意味着第一版本是真正的第一个版本或是在第二版本之前创建的,或甚至 是第一版本是在第二版本之前被请求或操作的。相反,这些短语用于标识不同的版本。
[0017] 如本发明所使用的计算机存储介质包括以用于存储诸如计算机可读指令、数据结 构、程序模块或其它数据等信息的任何方法或技术来实现的易失性和非易失性、可移动和 不可移动介质。计算机存储介质包括:RAM、ROM、EEPROM、固态存储、闪存或其它存储器技术、 CD-ROM、数字多功能盘(DVD)或其它光盘存储、磁盒、磁带、磁盘存储或其它磁存储设备、或 可以用来储存所期望的信息并可由计算机访问的任何其它介质。计算机存储介质不包括通 信介质。
[0018] 标题仅是为了方便;关于给定话题的信息可在其标题指示该话题的章节之外被寻 找到。
[0019] 其他显式或隐式定义可包括在下文中。
[0020] 示例性实施例
[0021] 图1-2是表示本发明所描述主题的各方面可以在其中操作的示例性环境的框图。 图1-2中示出的组件是示例性的且不旨在包括一切的可能需要或包括的组件。在其他实施 例中,结合图1-2描述的组件和/或功能可被包括在其他组件(示出或未示出)中或者被 放置在子组件中而不背离本发明所描述的主题的各方面的精神或范围。在一些实施例中, 结合图1-2描述的组件中的一个或多个可跨可彼此靠近(例如,局域网上)或分散开(例 如,在因特网上的不同地方)的多个设备分布。
[0022] 本发明所描述的主题的各方面可与通用或专用计算系统环境或配置实现。可适用 于本发明所述的主题的各方面的计算机包括个人计算机、服务器计算机(无论是裸金属还 是作为虚拟机)、手持或膝上型设备、多处理器系统、基于微控制器的系统、机顶盒、可编程 和不可编程消费电子设备、网络PC、小型计算机、大型计算机、个人数字助理(PDA)、游戏设 备、打印机、包括机顶盒、媒体中心或其它电器的家电设备、嵌入汽车或附连到汽车的计算 设备、其他移动设备、包括蜂窝电话、无线电话和有线电话的电话设备、包括任何上述系统 或设备的分布式计算环境等等。
[0023] 本发明所述的组件中的一个或多个可在虚拟环境中操作。虚拟环境是由计算机来 模仿或模拟的环境。虚拟环境可模仿或模拟物理机器、操作系统、一个或多个接口的组、以 上各项的部分、或以上各项的组合等等。在机器被模仿或被模拟时,该机器有时被称为虚拟 机。对于在虚拟机上执行的软件来说,虚拟机是一种看上去是物理机器的机器。该软件可 将文件保存在诸如虚拟硬盘驱动器、虚拟软盘等之类的虚拟存储设备中,可从虚拟光学设 备读取文件,可经由虚拟网络适配器来进行通信等等。
[0024] 转向图1,系统105可包括软件开发组件110、存储150,且可包括其它组件(未示 出)。软件开发组件可包括源代码编辑器115、运行时管理器120、调试器125和其它组件 (未示出)。如本发明所使用的那样,术语"组件"要被当作包括以下的全部或一部分来理 解:一个或多个设备、一个或多个软件模块或其部分的集合、一个或多个软件模块或其部分 与一个或多个设备或其部分的某种组合等等。
[0025] 存储150可包括能够存储软件开发所涉及的数据的任何存储介质。术语"数据"要 被宽泛地看作包括可由一个或多个计算机存储元素表示的任何东西。逻辑上,数据可被表 示成易失性或非易失性存储器中的一系列1和〇。在具有非二进制存储介质的计算机中,数 据可根据存储介质的容量来表示。数据可被组织成不同类型的数据结构,包括诸如数字、字 母等之类的简单数据类型,分层、链接或其他相关数据类型、包括多个其他数据结构或简单 数据类型的数据结构等等。数据的某些示例包括信息、程序代码、程序状态、程序数据、其他 数据等等。
[0026] 存储150可被实现为文件系统、数据库、诸如RAM等易失性存储器、其它存储、以上 的某种组合等,并可以跨多个设备分布。存储150可以是外置的、内置的、或包括对托管软 件开发系统105的各组件的设备而言内置和外置两者的组件。
[0027] 在一个实施例中,软件开发组件110可用于与动态编程语言一起工作。在另一实 施例中,本发明描述的技术还可被应用于非动态编程语言环境。动态和非动态编程语言之 间被经常注意到的区别在于非动态语言被编译而动态语言程序被解释。然而,在一些实施 例中,该区别不是必需的。
[0028] 在运行时,动态编程语言环境可执行非动态编程语言环境如果执行的话则在编译 时或在编译时之前执行的一些动作。例如,在程序执行期间,动态编程语言环境可添加新 代码、扩展对象和定义、修改类型系统等。一些示例性动态编程语言包括ActionScript、 BASIC、BeanShell、Clojure、ColdFusion、Lisp、Groovy、JavaScript、VBScript、Perl、PHP、 PowerShell、Python、Ruby、Small talk、Tel 等。一些非动态编程语言包括汇编、C、C++、Java、 Pascal、Fortran 等。
[0029] 源代码编辑器115可允许软件开发者输入、删除和修改程序的源代码。源代码编 辑器115可在显示器上显示程序的源代码并经由用户接口接收输入。
[0030] 运行时管理器120可启动运行时环境来执行源代码。在一个实施例中,运行时环 境可包括Web浏览器。在其它实施例中,运行时环境可包括允许代码在Web浏览器之外被 执行的一个或多个组件。
[0031] 调试器125可与运行时环境交互以测试和调试程序。调试器125可允许软件开发 者逐步执行程序、在程序内的某些点处暂停程序、查看源代码、跟踪变量值和存储器位置、 修改程序状态等。在一个实施例中,调试器125可允许软件开发者指示向调试器125通知 异常的条件。例如,软件开发者可能想要被通知出现在用户代码中但在库代码中被处理的 异常,但不想被通知出现在库代码中并且在库代码中被处理的异常。
[0032] 在另一实施例中,对于每一异常,可向调试器发出通知。然而,基于通知和配置数 据,调试器可不同地对待通知。例如,在一个实现中,如果异常在用户代码中被处理,则该异 常可被突出显示、加粗、或以其它方式更显眼地显示。作为另一示例,如果异常在用户代码 中出现并在库代码中被处理,则对调试器的通知可包括这一信息,且这可导致调试器停止 程序并突出显示与异常相关联的代码。作为另一示例,通知可以是异常被登记到输出窗口, 同时程序执行被允许继续。在又一示例中,取决于通知,异常可被登记到日志文件并被强调 (例如,粗体、下划线或其它方式)。
[0033] 异常可包括关于程序执行期间发生的状况的数据。状况可以是它需要额外的处理 或它不能在没有协助的情况下解决。例如,程序可能会遇到除以〇的状况。作为另一示例, 程序可能会遇到存储器匮乏状况、缺失文件、硬盘错误、函数检测到的无效自变量或某一其 它状况。
[0034] 如本发明所使用地,短语"遇到异常"及其变型可指的是出现异常的位置、异常被 处理的位置或如果执行被允许继续则异常将被处理的位置。例如,用户代码可出现在库代 码中被处理或将在库代码中被处理的异常。类似地,在另一示例中,库代码可出现在用户代 码中被处理或将在用户代码中被处理的异常。除非上下文明确另有所指,否则在备选实施 例中,短语"遇到异常"将被看作包括以上可能性中的至少一个。
[0035] 尽管术语调试器在本发明中经常被使用,本发明的教导也可适用于其它软件开发 工具,而不背离本发明所描述的主题的各方面的精神或范围。软件开发工具可包括用于对 于软件进行开发、测试、诊断或执行其它动作的任何组件。一些示例性的软件开发工具包括 调试器、分析器、构建工具、文本编辑器、栈倾卸器、其它开发工具等。
[0036] 可能存在作为软件开发系统105的一部分的许多其它软件开发组件,而不背离本 发明所描述的主题的各方面的精神或范围。
[0037] 本发明的教导可用于调试动态和非动态语言程序等。例如,用户可能想要当异常 出现在用户编写的代码中且在库代码中被处理时调用调试器,但不想要当异常出现在用户 代码中且在用户代码中被处理时调用调试器。为引起这种类型的行为,库作者可插入声明 以告知运行时环境,它要在异常在该声明的范围内被处理时通知调试器。可被用于处理不 在用户代码中被处理的异常的处理器的示例由以下代码示出:
[0038] function hbraryFunction(input) { Debug.setNonUserCodeExceptions = true; try { callsUserCode(input); } catch (e) {| }
[0039] 在一个实施例中,范围可指的是其中变量名或其它标识符有效且可被使用的计算 机程序内的上下文。在另一实施例中,范围可指的是其中声明起效的上下文。例如,在函 数中声明的变量可具有自该变量被声明的位置到函数结尾存在的范围。作为另一示例,在 块中声明的变量可具有自该变量被声明的位置到块结尾存在的范围。作为另一示例,在文 件中但在任何函数以外被声明的变量可具有其中该变量被声明的文件的范围。作为另一示 例,变量可被声明具有全局范围。
[0040] 以上范围仅是示例性的。基于本发明的教导,本领域技术人员将认识到可使用其 它范围,而不背离本发明所描述的主题的各方面的精神或范围。
[0041] 在动态语言和非动态语言中,取决于声明被放置的地方,声明可具有各种范围。例 如,在诸如JavaScript的动态语言中,可通过将声明放置在文件的适当位置中,声明可具 有文件范围。作为另一示例,通过将非动态语言中的声明放置在适当位置中,该声明也可具 有文件范围。在一个示例中,如果编译器支持句法,则可通过将声明放置在静态的汇编构造 器来向声明给出汇编范围。
[0042] 在本发明中,有时所提及的范围是函数的范围或块的范围。然而,要理解,在其它 实施例中,关于函数或块的范围的教导可被扩展到另一范围,而不背离本发明所述的主题 的各方面的精神或范围。
[0043] 为了例如使声明应用于库函数的范围,库作者可提供对应于以下伪代码的代码:
[0044] Function LibraryFun() { Debug.setNonUserCodeExceptions = true. Statement 1; StatementN; }
[0045] 当评估该代码时,运行时可推断当前执行的范围不是用户代码。如果异常在用户 代码中出现并在LibraryFun的范围中被处理,则运行时可通知调试器。
[0046] 在一实施例中,当遇到声明设置Debug. setNonUserCodeExceptions (调试.设置 非用户代码异常)=true(真)时,该性质还可被应用于在当前执行范围内打开的任何范 围。运行时还可向调试器通知在这些打开的范围内处理的异常。
[0047] 在一实施例中,不跨函数调用继承性质Debug. setNonUserCodeExceptions = true。例如,从具有Debug. setNonUserCodeExceptions = true的另一函数调用的函数不 继承这一性质。为了明确使得运行时当在被调用的函数中处理异常时通知调试器,Debug. setNonUserCodeExceptions = true声明可被放置在被调用函数中。
[0048] 可能存在其中调试器总是被通知的一些情况。例如,如果不存在将处理异常的处 理程序,则开发者可能想要调试器被通知。确定是否有一个处理程序将处理异常可涉及在 一个或多个栈框架中搜索适当的处理程序。体现用于通知调试器的情况的一些示例性伪代 码如下:
[0049] If (IsHandler for top frameQ) {
[0050] If (IsStopOnExceptionThrownOptionEnabledi)) NotifyDebugger(Exception Thrown); } Else { Frame = FindHandlerFraine() If (Frame == null) NotifyDebugger(unhandled) Elseif (FraineJsNonUserCode) NotifyDebugger(UserUnhandled) }
[0051] 以上伪代码指示确定是否要向调试器通知异常的动作。当异常出现时,可执行一 组检查。如果在顶部栈框架中遇到异常,且存在用于顶部栈框架的异常处理程序,则在开发 环境被配置成在抛出异常时停止的情况下,向调试器通知异常。
[0052] 开发环境可被配置成使得软件开发者能够指示要向调试器通知或不要向调试器 通知在顶部框架中处理的异常。
[0053] 如果没有用于顶部栈框架的异常处理程序,则对具有处理程序的框架执行搜索。 这可通过从顶部栈框架到底部栈框架搜索栈框架直到找到或没有找到异常处理程序,通过 咨询指示栈框架的异常处理程序的数据结构,或通过其它机制来完成,而不背离本发明所 述的主题的各方面的精神或范围。
[0054] 如果在任何框架中均没有找到异常处理程序,则可向调试器通知遇到了未被处理 的异常。
[0055] 如果找到了异常处理程序,且异常处理程序不在用户代码中,则可向调试器通知 并告知异常将不被用于异常处理程序处理。
[0056] 对应于以上动作的动作将结合图5更详细描述。
[0057] 插入到代码中的声明可包括对回调函数的引用,其中回调函数未被调用且值被计 算直到运行时评估程序状态以作出关于通知的决定。例如,库作者可提供以下伪代码: [0058] Function LibraryFun()( Debug.setNonUserCodeExceptions = CallBackFunction; Statement 1; StatementN; }
[0059] 在一个示例性实现中,该伪代码可由包括处理程序的以下代码实现:
[0060] function LibraryFun(input)( Debug,setNonlJserCodeExceptions = function() { return global_enableExceptionHandledNotificationsj; try { cal lsUserCode( input.); } catch (e) {j }
[0061] 当运行时遇到在LibraryFun中被处理的异常时,运行时可调用 CallBackFunction (回调函数)来计算用于确定是否要向调试器通知异常的值。 CalIBackFunction可在计算值时使用可用的程序代码。
[0062] 当向调试器通知异常时,运行时环境可向调试器提供与异常相关联的数据以及指 示异常是在用户代码中被处理、在非用户代码中被处理还是未被处理的标志。此外,异常类 型也可被提供。取决于开发环境中指定的偏好,调试器然后选择向软件开发者提供关于异 常的信息。
[0063] 转向图2,环境200包括主机205、开发工具215和其它组件(未示出)。主机205 可包括运行时环境210,运行时环境210可包括异常管理器220、运行时对象221和程序状 态222。开发工具215和运行时环境210或其任何部分可被托管在不同计算机上或一起托 管在单个计算机上。
[0064] 此外,开发工具215和主机205可驻留在同一计算机上或可驻留在不同计算机上。 线条207表示开发工具和运行时环境210之间的通信链路。线条207指示开发工具215和 运行时环境可经由任何类型的网络(包括直接连接、本地网络、非本地网络、因特网、以上 某种组合等)连接(例如逻辑、物理、虚拟或其它)。例如,线条207可包括一个或多个局域 网、广域网、直接连接、虚拟连接、专用网络、虚拟专用网络、进程内或进程间通信信道、以上 的某种组合等。
[0065] 主机205是托管运行时环境的组件。主机205可包括其上安装软件的计算机、虚 拟机或某种其它设备。
[0066] 运行时环境210可以是动态语言运行时环境或非动态语言运行时环境。运行时环 境210可包括Web浏览器或允许代码在Web浏览器之外执行的一个或多个其它组件。运行 时环境210可执行程序代码和维护程序状态(例如,栈框架、变量值、其它数据等)。当执行 代码时,运行时环境210可执行指示关于如果在代码正在执行的同时遇到异常是否要向开 发工具215发送通知的信息的声明。
[0067] 当执行该声明时,运行时环境210可设置运行时对象221的性质。性质是可经由 运行时对象221引用的数据。性质可与指示性质何时有效的范围相关联。运行时对象221 可包括一个或多个性质。通过其性质,运行时对象221可编码可用于管控运行时环境210 的行为的信息。例如,性质可指示如果在声明的范围内出现异常是否要通知开发工具215。
[0068] 当运行时环境210遇到异常时,运行时环境210可使用异常管理器220来确定是 否要向开发工具215通知异常。
[0069] 异常管理器220可用来评估当遇到异常时运行时环境中存在的程序状态。例如, 异常管理器220可确定什么运行时对象性质适用于异常的位置,且可搜索可处理异常的异 常处理程序。异常管理器可基于程序状态222和性质来确定是否要向开发工具215发送通 知。程序状态222可包括多个栈框架,其中栈框架潜在与具有指示是否要向开发工具215 发送通知的性质的不同对象相关联。例如,顶部栈框架可与其中要发送通知的范围相关联, 而较低的栈框架可与其中不要发送通知的范围相关联。之前描述了用于确定是否要向调试 器通知异常的一个示例性算法。
[0070] 开发工具215可访问配置数据来确定是否要对接收到的通知采取动作。例如,调 试器可被配置成忽视在用户代码中处理的异常。在这种情况下,调试器可忽视指示已经在 用户代码中被处理的异常的通知。作为另一示例,调试器可被配置成对每一抛出的异常中 止,无论异常是否将被处理。在这种情况下,调试器可在诸如显示器的图形界面上提供关于 异常的数据。作为示例,调试器可被配置成以某种方式行动(例如,中止、不中止或采取其 它动作),并且忽视/覆盖旨在影响调试器行为的代码中的某些类型甚至全部类型的声明。
[0071] 尽管以上一些讨论关注于基于在哪里处理异常来确定通知调试器,但本发明的教 导还可应用于基于异常在哪里出现或异常在哪里出现以及它将在哪里被处理来确定是否 要通知调试器。例如,开发者可能想要调试器被通知出现在用户代码中且将在库代码中被 处理的异常。作为另一示例,开发者可能不想要调试器被通知出现在库代码中、将在库代码 中被处理的异常。基于本发明的教导,这一行为可被编码在用于确定何时向调试器通知异 常的逻辑中。
[0072] 图3-5是概括地表示根据本发明所描述的主题的各方面可进行的动作的流程图。 为解释简明起见,结合图3-5描述的方法被描绘和描述为一系列动作。可以理解和明白,本 发明所描述的主题的各方面不受所示出的各动作和/或各动作次序的限制。在一个实施例 中,各动作以如下描述的次序发生。然而,在其它实施例中,各动作可以并行地发生、以另一 次序发生、和/或与本发明未呈现和描述的其它动作一起发生。此外,并非所有示出的动作 都是实现根据本发明所描述的主题的各方面的方法所必需的。另外,本领域的技术人员将 了解和明白,方法也可以替代地经由状态图或作为事件表示为一系列相互相关联的状态。
[0073] 图3是概括地表示根据本发明所描述的主题的各方面的、可在运行时环境中进行 的示例性动作的流程图。在框305,动作开始。
[0074] 在框310,代码在运行时环境中被执行。例如,参考图2,动态语言程序的代码可在 运行时环境210中被执行。
[0075] 在框315,执行提供关于在代码正在执行时异常出现的情况下要发送的通知(如 果有的话)的信息的声明。例如,参考图2,运行时环境210可执行设置运行时对象221的性 质以指示在代码正在执行时异常出现的情况下要向调试器发送通知的声明。例如,该声明 可设置指示如果异常在与该声明相关联的范围中被处理则要向调试器发送通知的性质。作 为另一示例,声明可设置指示如果异常在该声明的范围内打开的范围的声明范围中被处理 则要向调试器发送通知的性质。作为另一示例,响应于异常,通知可总是被发送给调试器, 但基于通知和调试器的配置数据,调试器可确定是否经由显示器或某种其它机制来显著地 指示异常。
[0076] 在框320,在执行代码时遇到异常。例如,参考图2,运行时环境210可执行导致异 常被抛出的声明。例如,运行时环境210可执行导致除以0的声明。
[0077] 在框325,评估当异常出现时存在于运行时环境中的程序状态。例如,参考图2,异 常管理器220可在栈框架中搜索对异常的合适的处理程序,且可确定运行时对象221的性 质是否应用于包括该处理程序的范围。
[0078] 在框330,基于程序状态和关于通知的信息,异常管理器220可确定响应于异常要 向开发工具215发送通知。通知可包括例如异常是在或将要在用户代码或非用户代码中被 处理,还是未被或将不被处理。
[0079] 在框335处,可以执行其他动作(如果有的话)。
[0080] 图4是概括地表示根据本发明所描述的主题的各方面的、可从开发工具角度进行 的示例性动作的流程图。在框405,动作开始。
[0081] 在框410处,接收异常的通知。例如,参考图2,开发工具215可接收在运行时环境 210正在执行代码时出现的异常的通知。
[0082] 在框415,访问配置数据以确定是否要经由图形界面提供关于异常的数据。例如, 参考图1,调试器125可访问存储150中的配置数据,以确定响应于调试器125接收到的异 常通知是否要显示数据。配置数据还可指示基于通知的类型、显示数据的显著程度。
[0083] 在框420处,如果数据要被提供给用户,则动作在框425处继续;否则,动作在框 430处继续。
[0084] 在框425处,提供异常的通知。例如,参考图1,调试器125可经由图形界面显示导 致异常被抛出的源代码。调试器125还可显示关于异常的其它相关数据。作为另一示例, 调试器125可通过向用户发送消息或对日志文件写入条目来提供异常的通知。
[0085] 在框430处,可以执行其他动作(如果有的话)。例如,参考图1,调试器可接收指 示指示调试器是否要对在用户代码中处理的异常在图形界面上显示数据的配置数据。
[0086] 图5是概括地表示根据本发明所描述的主题的各方面的、可异常出现时进行的示 例性动作的流程图。在框505,动作开始。
[0087] 在框510,遇到异常(例如,被抛出)。例如,参考图2,运行时环境210在执行程序 代码时遇到异常。
[0088] 在框515,作出关于顶部栈框架中是否存在用于异常的异常处理程序的判断。如果 是,则动作在框520继续;否则,动作在框535继续。
[0089] 在框520,作出关于开发工具是否被设置为只要遇到异常就中止执行的判断。如果 是,则动作在框525继续;否则,动作在框530继续。
[0090] 在一个实施例中,开发工具在异常针对顶部框架时得到通知,且开发工具确定是 否要向用户界面提供对应于异常的数据。在另一实施例中,如果配置数据指示开发工具对 在顶部框架中被处理的异常不感兴趣,则开发工具不被通知。
[0091] 在框525,向调试器通知异常已被抛出且异常将被顶部框架中的代码处理。例如, 参考图2,向开发工具215通知已遇到异常且异常将由用户代码处理。
[0092] 在框530处,可以发生其他动作(如果存在)。
[0093] 在框535,执行针对具有处理异常的处理器的框架的搜索。例如,参考图2,异常管 理器220可搜索程序状态222的一个或多个栈框架以找出处理异常的处理程序。该搜索可 按照从顶部栈框架到底部栈框架前进的方向前进。此外,如前所述,搜索可替换地通过咨询 指示异常处理程序的数据结构或通过其它机制来执行,而不背离本发明所述的主题的各方 面的精神或范围。
[0094] 在框540处,如果找到了框架,则动作在框550处继续;否则,动作在框545处继 续。
[0095] 在框545,向开发工具通知异常未被处理。例如,参考图2,运行时环境210可向开 发工具215告知所遇到的异常不被在运行时环境210内执行的程序的处理程序处理。
[0096] 在框550处,如果代码被断定为非用户代码,则动作在框560处继续;否则,动作在 框555处继续。
[0097] 在框555处,可以执行其他动作(如果有的话)。
[0098] 在框560,向开发工具通知异常将被处理但不被用户代码处理程序处理。例如,参 考图2,运行时环境210可向开发工具215告知遇到的异常将被处理但不被用户代码处理程 序处理。
[0099] 在框565处,可以执行其他动作(如果有的话)。
[0100] 尽管以上的一些描述了用户和非用户代码,本发明的教导还可被应用于N种类型 的代码。例如,对开发工具的通知可被设置用于系统代码、库代码、团队代码、开发商代码 等。
[0101] 此外,尽管以上的一些描述了异常处理,但本发明的教导还可应用于调试的其它 方面。例如,本发明的教导还可应用于逐步调试代码、变量检查、源代码查看等。
[0102] 如从上述详细描述中可以看到,已经描述了与经由代码声明协助开发工具的各方 面。尽管本文所描述的主题的各方面易于作出各种修改和替换构造,但其某些说明性实施 例在附图中示出并在上面被详细地描述。然而,应当理解,并不旨在将所要求保护主题的各 方面限制于所公开的具体形式,而是相反地,目的是要覆盖落入本文所描述的主题的各方 面的精神和范围之内的所有修改、替换构造和等效方案。
【权利要求】
1. 一种至少部分地由计算机实现的方法,所述方法包括: 在代码在运行时环境中执行期间,执行所述代码的声明,所述声明提供关于当在所述 代码正在执行时异常出现的情况下要向调试器发送如果存在的通知的信息; 在执行所述代码时遇到异常; 评估当遇到异常时存在于所述运行时环境中的程序状态,评估程序状态包括搜索将处 理所述异常的异常处理程序;以及 基于所述程序状态和所述信息,确定要响应于所述异常向所述调试器发送如果存在的 通知。
2. 如权利要求1所述的方法,其特征在于,执行所述程序的声明包括设置所述运行时 环境可访问的运行时对象的性质,所述性质指示如果异常在或将在与所述声明相关联的范 围中被处理则向所述调试器发送通知。
3. 如权利要求1所述的方法,其特征在于,执行所述程序的声明包括设置所述运行时 环境可访问的运行时对象的性质,所述性质指示如果异常在或将在所述声明的范围内打开 的范围中被处理则向所述调试器发送通知。
4. 如权利要求1所述的方法,其特征在于,还包括结合确定要响应于所述异常向所述 调试器发送如果存在的通知,调用由所述声明所指示的回调函数,所述回调函数返回要在 确定所述通知时使用的数据。
5. 如权利要求1所述的方法,其特征在于,还包括如果在所述搜索期间找到具有异常 处理器的栈框架,则确定所述栈框架是否指示为调试对象设置了性质,所述性质可由所述 运行时环境访问,所述性质指示所述调试器是否要为由所述异常处理程序处理的异常而被 调用,所述异常潜在地出现在具有所述栈框架的范围之外。
6. 如权利要求1所述的方法,其特征在于,确定要响应于所述异常向所述调试器发送 如果存在的通知包括确定总是向所述调试器发送所述通知,并且还包括基于所述调试器的 配置数据和所述通知来确定是否经由显示器显著地指示所述异常。
7. -种在计算环境中的系统,包括: 用于执行包括声明的代码的运行时环境,所述声明指示关于如果在所述代码正在执行 时遇到异常是否要向开发工具发送通知的信息; 用于在可由所述声明设置的性质中编码所述信息的对象,所述性质与一范围相关联, 所述性质可由所述运行时环境访问;以及 用于评估当在执行所述代码的同时遇到异常时存在于所述运行时环境中的程序状态 的异常管理器,所述异常管理器还用于基于所述程序状态和所述性质确定是否要向所述开 发工具发送所述通知。
8. 如权利要求7所述的系统,其特征在于,所述异常管理器用于在所述程序状态中搜 索处理所述异常的处理程序,所述程序状态具有栈框架,所述栈框架潜在地与具有指示是 否要向所述开发工具发送通知的性质的不同对象相关联。
【文档编号】G06F11/36GK104303158SQ201380025811
【公开日】2015年1月21日 申请日期:2013年5月8日 优先权日:2012年5月17日
【发明者】T·S·莱斯, A·甘地, T·H·基姆, G·B·米斯凯利, M·C·范宁, A·R·斯特兰德 申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1