掌桥专利:专业的专利平台
掌桥专利
首页

将编辑并继续与热重载组合的源代码编辑

文献发布时间:2024-04-18 20:02:40


将编辑并继续与热重载组合的源代码编辑

背景技术

开发和调试软件应用是一个迭代过程。例如,开发人员可以频繁地经历开发工作流程,该开发工作流程包括(i)运行主题应用,(ii)标识需要修改或添加的应用特征,(iii)对主题应用的一个或多个源文件进行改变(例如,使用编辑器)以实施修改/添加,(iv)重建主题应用(例如,使用编译器工具链),(v)重启主题应用,以及(vi)与主题应用交互以验证修改/添加。该工作流程可能是繁琐且耗时的,并且重建和重启主题应用的行动可能花费大量时间。

有时,运行主题应用附加地涉及将调试器附接至应用,以辅助测试和调试应用。虽然调试器具有各种特征,但是调试器的主要用途是使得开发人员能够追踪正在进行的主题应用的操作,并且监测由应用利用的计算机资源的改变。大多数调试器包括在具体点处挂起主题应用的执行(例如,使用断点或观察点)的能力。当主题应用在断点或观察点处被挂起时,一些调试器示出原始源代码中的位置和/或与挂起点相对应的机器代码反汇编。

发明内容

一些开发环境包括调试器或者与调试器互操作,以实施对编辑并继续(EnC)技术的支持。当主题应用与所附接的调试器一起运行并且被挂起(例如,基于断点或观察点)时,在调试器恢复主题应用的执行之前,EnC技术能够检测源代码改变,并且向将那些改变应用于主题应用相对应的存储器内结构“原地”(例如,更新主题应用的一个或多个活动线程的现有类型、对象和堆栈帧)。因此,在恢复主题应用的执行之后,应用与完成集成的那些改变一起执行。然而,由于更新存储器内结构的固有复杂性,ENC能力被限于某些种类的源改变。

备选地,一些开发环境支持热重载技术。与在主题应用正与所附接的调试器一起运行并且被挂起时操作的EnC技术不同,热重载技术在主题应用主动运行时操作。热重载实施方式检测何时对当前会话中的一个或多个源文件进行改变,并且将那些改变应用于运行的应用。与EnC技术不同,这些改变未被“原地”应用,而是创建更新方法的新类型和新版本,并且这些更新方法的新版本仅在热重载更新之后的下一次调用时被执行。由于热重载技术创建了新类型和新方法,而不是更新现有存储器内结构,所以与EnC技术相比,热重载技术对于它们可以支持的源改变的种类通常更有能力。另一方面,无法更新现有类型,对象和方法框架也限制了热重载技术与EnC相比是有益的场景集合。

虽然通常针对类似的目标(即,使得源代码改变能够被应用于应用而不重启应用),EnC技术和热重载技术目前是不兼容的。即,当调试器被附接至应用并且被挂起时,EnC技术是适用的,并且热重载技术在主题应用主动运行时操作。本文中所描述的至少一些实施例通过针对与所附接的调试器一起运行的应用唯一地组合EnC和热重载能力来解决这种无能。具体地,这些实施例使得开发人员能够将源代码改变应用于主题应用,该主题应用(i)当主题应用在断点或观察点处被挂起(即,在EnC模式下)时以及(ii)当主题应用未被挂起(即,在热重载模式下)时与所附接的调试器一起执行。在实施例中,在EnC模式和热重载模式下进行的改变可以在相同的调试器会话期间被应用,并且在EnC模式下进行的改变与在热重载模式下进行的改变无缝交互(反之亦然)。因此,开发人员可以在调试器被附接时的任何时间点编辑源文件(即,应用是否被调试器挂起),并且当用户进行第二代码改变时采取适当的动作(即,EnC模式改变或者热重载模式改变)。附加地,本文中的实施例解决了当热重载的方法的陈旧版本遇到断点并且源代码的旧版本不存在于当前源代码文件或编辑器缓冲器中时可能发生的情况。

针对与所附接的调试器一起运行的应用组合EnC和热重载能力提供了许多技术效果和益处。例如,本文中的实施例消除了开发人员手动地在EnC和热重载模式之间过渡的需要;先前,开发人员将能够在单个应用执行会话期间使用一种模式,并且将需要重启应用以便过渡到另一模式。附加地,本文中的实施例使得即使当应用被附接至调试器时也能够使用热重载来应用代码改变。

在一些实施例中,方法、系统和计算机程序产品启用了将EnC与热重载组合的源代码编辑。这些实施例标识正与所附接的调试器一起运行的软件应用的源代码的第一版本的代码改变,从而产生软件应用的源代码的第二版本。这些实施例还确定代码改变是在软件应用被调试器挂起的情况下发生还是在软件应用未被调试器挂起的情况下发生。

基于确定,这些实施例将代码改变应用于软件应用而不重启软件应用。应用代码改变包括执行以下之一:当代码改变在软件应用被调试器挂起的情况下发生时,使用EnC更新将代码改变应用于软件应用,或者当代码改变在软件应用未被调试器挂起的情况下发生时,使用热重载更新将代码改变应用于软件应用。使用EnC更新将代码改变应用于软件应用包括:将原地更新应用于与源代码的第一版本相对应的现有存储器内实体以反映代码改变,将现有存储器内实体转换成与源代码的第二版本相对应的更新后的现有存储器内实体。使用热重载更新将代码改变应用于软件应用包括:创建与源代码的第二版本相对应的新的存储器内实体以反映代码改变,同时保留现有存储器内实体。

在将代码改变应用于软件应用而不重启软件应用之后,这些实施例确定软件应用已被调试器挂起。这些实施例还包括:在用户界面处呈现针对挂起点处的软件应用的调试状态。呈现包括以下之一:呈现软件应用的源代码的第二版本的至少一部分以及挂起点处的与更新后的现有存储器内实体相关联的对应运行时状态(即,至少基于在执行更新后的现有存储器内实体时软件应用被调试器挂起),呈现软件应用的源代码的第二版本的至少一部分以及挂起点处的与新的存储器内实体相关联的对应运行时状态(即,至少基于在执行新的存储器内实体时软件应用被调试器挂起),或者呈现软件应用的源代码的第一版本的至少一部分以及挂起点处的与现有存储器内实体相关联的对应运行时状态(即,至少基于在执行现有存储器内实体时软件应用被调试器挂起)。

提供该发明内容来以简化的形式介绍对于下面在具体实施方式中进一步描述的概念的选择。该发明内容不旨在标识要求保护的主题的关键特征或必要特征,也不旨在被用于辅助确定要求保护的主题的范围。

附图说明

为了描述本发明的上述和其他优点和特征可以被获得的方式,上面简要描述的本发明的更具体的描述将通过参照在附图中图示的其具体实施例来呈现。要理解的是,这些附图仅描绘了本发明的典型实施例,因此不被认为是对其范围的限制,本发明将通过使用附图来利用附加的特异性和细节描述并解释,其中:

图1A图示了便于启用将EnC技术与热重载技术组合的源代码编辑的示例计算机架构;

图1B图示了图1A所图示的实时更新器的示例细节;

图2图示了使用EnC的实时代码更新的示例;

图3图示了使用热重载的实时代码更新的示例;

图4A和4B图示了使用EnC和热重载的组合的实时代码更新的示例;以及

图5图示了用于启用将EnC与热重载组合的源代码编辑的示例方法的流程图。

具体实施方式

图1A图示了便于启用将EnC技术与热重载技术组合的源代码编辑的示例计算机架构100。如所示,计算机架构100包括或利用专用或通用计算机硬件,诸如例如处理器101(或者,多个处理器)、存储器103(例如,主存储器或系统存储器)和持久存储装置102,它们使用总线104(或者,多个总线)通信耦合。

本发明的范围内的实施例包括用于携带或存储计算机可执行指令和/或数据结构的物理和其他计算机可读介质。这种计算机可读介质可以是由通用或专用计算机系统可访问的任何可用介质。存储计算机可执行指令和/或数据结构的计算机可读介质是计算机存储介质。携带计算机可执行指令和/或数据结构的计算机可读介质是传输介质。因此,通过示例而非限制,本发明的实施例可以包括至少两种明显不同的计算机可读介质:计算机存储介质和传输介质。

计算机存储介质是存储计算机可执行指令和/或数据结构的物理存储介质(例如,存储器103和/或持久存储装置102)。物理存储介质包括计算机硬件,诸如RAM、ROM、EEPROM、固态驱动器(“SSD”)、闪存、相变存储器(“PCM”)、光盘存储装置、磁盘存储装置或者其他磁性存储设备或者(多个)任何其他硬件存储设备,它可以被用于以计算机可执行指令或数据结构的形式存储程序代码,该程序代码可以由通用或专用计算机系统访问和执行以实施所公开的本发明的功能性。

传输介质可以包括网络和/或数据链路,它可以被用于携带计算机可执行指令或数据结构形式的程序代码并且可以由通用或专用计算机系统访问。“网络”被定义为能够在计算机系统和/或模块和/或其他电子设备之间运输电子数据的一个或多个数据链路。当信息通过网络或另一通信连接(硬连线、无线或者硬连线或无线的组合)被传送或提供给计算机系统时,计算机系统可以将连接视为传输介质。以上的组合也应该被包括在计算机可读介质的范围内。

进一步地,在到达各种计算机系统组件时,计算机可执行指令或数据结构形式的程序代码可以自动从传输介质传送到计算机存储介质(反之亦然)。例如,通过网络或数据链路接收到的计算机可执行指令或数据结构可以在网络接口模块内的RAM中被缓冲,然后最终传送到计算机系统RAM(例如,存储器103)和/或计算机系统处的更少的易失性计算机存储介质(例如,持久存储装置102)。因此,应该理解的是,计算机存储介质可以被包括在也(甚或主要地)利用传输介质的计算机系统组件中。

例如,计算机可执行指令包括指令和数据,当在一个或多个处理器处执行时,该指令和数据使通用计算机系统、专用计算机系统或专用处理设备执行特定功能或功能组。计算机可执行指令可以是例如机器代码指令(例如,二进制)、中间格式指令(诸如,汇编语言)甚或源代码。

本领域技术人员将了解,本发明可以利用许多类型的计算机系统配置在网络计算环境中实践,包括个人计算机、台式计算机、膝上型计算机、消息处理器、手持式设备、多处理器系统、基于多处理器或可编程的消费性电子产品、网络PC、小型计算机、大型计算机、移动电话、PDA、平板计算机、寻呼机、路由器、交换机等。本发明还可以在分布式系统环境中实践,其中通过网络链接(通过硬连线数据链路、无线数据链路或者通过硬连线和无线数据链路的组合)的本地和远程计算机系统都执行任务。因此,在分布式系统环境中,计算机系统可以包括多个组成计算机系统。在分布式系统环境中,程序模块可以位于本地和远程存储器存储设备中。

本领域技术人员也将了解,本发明可以在云计算环境中实践。云计算环境可以是分布式的,尽管这不是所需的。当是分布式时,云计算环境可以在组织内进行国际分布和/或具有在多个组织上处理的组件。在该描述和以下权利要求中,“云计算”被定义为用于能够对可配置计算资源(例如,网络、服务器、存储装置、应用和服务)的共享池进行按需网络访问的模型。“云计算”的定义不被限于在适当部署时可以从这种模型获得的任何其他许多优点。

云计算模型可以由各种特点组成,诸如按需自助服务、广泛的网络访问、资源池化、快速弹性、测量服务等等。云计算模型还可以以各种服务模型的形式出现,诸如例如软件即服务(“SaaS”)、平台即服务(“PaaS”)和基础设施即服务(“IaaS”)。云计算模型还可以使用不同的部署模型来部署,诸如私有云、社区云、公共云、混合云等等。

一些实施例(诸如,云计算环境)可以包括系统,该系统包括分别能够运行一个或多个虚拟机的一个或多个主机。在操作期间,虚拟机仿真可操作的计算系统,从而支持操作系统以及可能还有一个或多个其他应用。在一些实施例中,每个主机包括管理程序,该管理程序使用从虚拟机的视图中抽象出来的物理资源来仿真虚拟机的虚拟资源。管理程序还提供虚拟机之间的适当隔离。因此,从任何给定虚拟机的角度来看,管理程序提供虚拟机正在与物理资源接口连接的错觉,即使虚拟机仅与物理资源的外观(例如,虚拟资源)接口连接。物理资源的示例包括处理能力、存储器、磁盘空间、网络带宽、介质驱动器等等。

如所图示的,持久存储装置102存储与操作系统105、应用106和开发工具107相对应的计算机可执行指令和/或数据结构。持久存储装置102还存储数据,诸如应用106的源代码111。通常,开发工具107被配置为开发/修改应用106,并且包括例如用于编辑应用106的源代码111的代码编辑器108、用于追踪和控制应用106的执行的调试器109以及用于向应用106应用代码改变而不重启应用106的实时更新器110。

存储器103能够存储各种各样的可执行代码和数据,但出于图示本文中的实施例的目的,存储器103被示出为存储与应用106相对应的应用存储器空间106'。该应用存储器空间106'被示出为存储存储器内实体112(例如,类型、对象、堆栈帧、方法代码等)。存储器103还被示出为存储源代码111',诸如存储在由代码编辑器108创建的编辑器缓冲器中作为编辑源代码111的一部分的源代码。如所示,该源代码111'包括代码改变113,诸如用代码编辑器108对源代码111进行的修订。

如所提及的,开发工具107包括用于向应用106应用代码改变而不重启应用106的实时更新器110。存在多种实时更新技术,并且由实时更新器110可用。例如,当主题应用(应用106)与所附接的调试器(例如,调试器109)一起运行时,以及当该应用在断点或观察点处被挂起时,EnC技术操作。在调试器恢复主题应用的执行之前,EnC技术将在挂起点处“原地”进行的源代码改变应用于与主题应用相对应的存储器内结构(例如,存储器内实体112)。因此,在恢复主题应用的执行之后,应用与完成集成的那些改变一起执行。

为了图示EnC,图2示出了使用EnC的实时代码更新的示例200。示例200示出了示例存储器布局201a,包括应用空间存储器202,诸如由操作系统105分配给应用106的应用存储器空间106'。示例200还示出了存储在应用空间存储器202中的存储器内实体203a(例如,存储器内实体112中的一个存储器内实体112)。示例200还示出了在被表示为存储器内实体203b的存储器内实体203a的EnC更新之后的另一示例存储器布局201b。此处,存储器内实体203a和存储器内实体203b之间的阴影的改变示出了存储器内实体203a已被原地更新以将存储器内实体203a转换成存储器内实体203b。由于存在原地更新,所以在代码执行恢复之后,所有代码基于存储器内实体203b执行。

在另一示例中,热重载技术仅在主题应用在没有所附接的调试器的情况下正运行时(并且因此,在诸如能够使用断点和观察点等调试器功能性不可用时)操作。热重载实施方式通过创建更新方法的新类型和新版本向运行的应用应用源代码改变。然后,这些更新方法在热重载更新之后的下一次调用时被执行。因此,当应用使用热重载来更新时,在热重载之前调用的方法的较旧“陈旧”版本可以在热重载之后继续执行(例如,在一个线程中),同时并发地执行该方法的新版本(例如,在热重载之后调用该方法的另一线程中)。

为了图示热重载,图3示出了使用热重载的实时代码更新的示例300。示例300示出了示例存储器布局301a,包括应用空间存储器302,诸如用于应用106的应用存储器空间106'。示例300还示出了存储在应用空间存储器302中的存储器内实体303a(例如,存储器内实体112中的一个存储器内实体112)。示例300还示出了热重载更新之后的另一示例存储器布局301b。此处,存储器内实体303a保持不受影响,而存储器内实体的新版本被添加为存储器内实体304。由于现在存在存储器内实体的两个版本(即,存储器内实体303a和存储器内实体304),因此可以基于存储器内实体303a来执行在热重载之前进行的方法调用,同时基于存储器内实体304来执行在热重载之后进行的方法调用。

由于当调试器被附接至应用并且被挂起时,EnC技术是适用的,并且当主题应用主动运行时,热重载技术是适用的,因此EnC技术和热重载技术目前是不兼容的。在实施例中,当应用106与所附接的调试器109一起运行时,实时更新器110通过唯一地组合EnC和热重载能力两者来解决这种无能。在(i)当应用106在断点或观察点处被调试器109挂起时(即,在EnC模式下)以及(ii)当应用106未被调试器109挂起时(即,在热重载模式下)时附接调试器109时,实时更新器110使得对源代码111进行的源代码改变能够被应用于应用106。

图4A和4B图示了使用EnC和热重载的组合的实时代码更新的示例。最初,图4A图示了在EnC更新之前应用热重载更新的示例400a。示例400a示出了示例存储器布局401a,包括应用空间存储器402,诸如用于应用106的应用存储器空间106'。示例400a还示出了存储在应用空间存储器302中的存储器内实体403a(例如,存储器内实体112中的一个存储器内实体112)。此处,存储器内实体403a保持不受影响,而存储器内实体的新版本被添加为存储器内实体404。示例400a还示出了在被表示为存储器内实体403b的存储器内实体403a的EnC更新之后的另一示例存储器布局401c。

交替地,图4B图示了在热重载更新之前应用EnC更新的示例400b。示例400a示出了示例存储器布局401a',包括应用空间存储器402',诸如用于应用106的应用存储器空间106'。示例400b还示出了存储器内实体403a'。示例400b还示出了在被表示为存储器内实体403b'的存储器内实体403a'的EnC更新之后的另一示例存储器布局401b'。示例400b还示出了热重载更新之后的另一示例存储器布局401c'。此处,存储器内实体403b'保持不受影响,而存储器内实体的新版本被添加为存储器内实体404'。

在实施例中,实时更新器110在EnC模式和热重载模式下进行的改变可以在相同的调试器会话期间被应用,并且在EnC模式下进行的改变与在热重载模式下进行的改变无缝交互(反之亦然)。因此,源代码111'可以在调试器109被附接至应用106时的任何时间点被编辑(即,应用106是否被调试器挂起),并且实时更新器110取决于应用106在改变时是否被挂起而采取适当动作(即,EnC模式改变或热重载模式改变)。这意味着本文中的实施例消除了开发人员在EnC和热重载模式之间手动过渡的需要。

附加地,由于应用106可以在实时更新之后继续执行陈旧代码(例如,图4A中的存储器内实体403a、存储器内实体404;以及图4B中的存储器内实体403b'),实时更新器110解决了当被热重载的方法的陈旧版本遇到断点并且源代码的旧版本不存在于当前源代码文件或编辑器缓冲器中时可能发生的情况。

图1B图示了图1A所图示的实时更新器110的示例细节,包括便于启用将EnC技术与热重载技术组合的源代码编辑的示例组件。要了解的是,所描绘的组件—包括其标识、子组件和布置—仅被呈现为辅助描述本文中所描述的实时更新器110的各种实施例,并且这些组件不限于软件和/或硬件可以如何实施本文中所描述的各种实施例或其特定功能性。

简而言之,当应用106被附接至调试器109时,代码改变标识器114确定何时已对与应用106相对应的源代码111和/或源代码111'进行了代码改变113,并且如果需要,则版本追踪器119保留源代码的先前版本以用于挂起点处的稍后呈现。基于所标识的代码改变113,改变类型确定器115确定代码改变113时的应用调试状态。具体地,改变类型确定器115确定代码改变113是否在应用106被调试器109挂起(例如,断点或观察点)时被接收到,或者应用106是否在附接至调试器109时主动执行。然后,当在应用106被调试器109挂起的同时接收到代码改变113时,改变应用器116使用EnC(即,EnC组件117)来应用改变,或者当在应用106在附接至调试器109的同时主动执行时接收到代码改变113时,改变应用器116使用热重载(即,热重载组件118)来应用改变。版本追踪器119将现有的和更新后的或新的存储器内实体与源代码的适当版本相关联。稍后,挂起检测器120检测到应用106已被挂起,并且呈现组件121呈现挂起点处的调试状态,包括基于使存储器内实体与源代码的适当版本相关联而在用户界面处呈现源代码的适当版本。因此,即使应用106可以执行成员内实体的不同版本,呈现组件121也呈现对应源代码的正确版本。在实施例中,当呈现源代码的较旧或“陈旧”版本时,呈现组件121提供所呈现的源代码不是最新版本的视觉指示符。

现在在图5的上下文内给出实时更新器110的进一步描述,图5图示了用于启用将EnC与热重载组合的源代码编辑的示例方法500的流程图。因此,以下讨论现在涉及许多方法和方法行动。虽然方法行动可以按特定顺序讨论或者可以在流程图中被图示为按特定顺序发生,除非特别规定,否则不需要特定排序,或者因为行动取决于在该行动被执行之前完成的另一行动而需要。在实施例中,用于实施方法500的指令被编码为存储在硬件存储设备(例如,持久存储装置102)上的计算机可执行指令(例如,实时更新器110),这些计算机可执行指令由处理器(例如,处理器101)可执行以使计算机系统(例如,计算机架构100)执行方法500。

如图5所示,方法500包括标识正与所附接的调试器一起运行的应用

方法500还包括当代码改变发生时确定应用是否被挂起的行动502。在一些实施例中,行动502包括确定代码改变是在软件应用被调试器挂起的情况下发生还是在软件应用未被调试器挂起的情况下发生。在示例中,改变类型确定器115确定在进行代码改变113时应用106是否被调试器109挂起的执行,或者在进行代码改变113时应用106是否主动执行(但在调试器109的控制下)。

在一些实施例中,方法500还包括确定代码改变是否兼容的行动503。在示例中,取决于行动502的结果(即,当代码改变发生时应用106是否被挂起),版本追踪器119确定代码改变是否与热重载兼容(行动503a),或者确定代码改变是否与EnC兼容(行动503b)。

在实施例中,行动503a包括当代码改变在软件应用未被调试器挂起的情况下发生时,基于热重载所固有的一个或多个限制来确定代码改变是否与热重载兼容。在示例中,改变应用器116使用热重载组件118来确定所标识的代码改变是否是与热重载兼容的类型。如果是,则改变应用器116进行到行动504a以应用改变。否则,方法500终止。在实施例中,热重载具有与EnC不同的限制/不兼容性集合。

在实施例中,行动503b包括当代码改变在软件应用被调试器挂起的情况下发生时,基于EnC固有的一个或多个限制来确定代码改变是否与EnC兼容。在示例中,改变应用器116使用EnC组件117来确定所标识的代码改变是否是与ENC兼容的类型。如果是,则改变应用器116进行到行动504B以应用改变。否则,方法500终止。在实施例中,EnC具有与热重载不同的限制/不兼容性集合。

方法500还包括应用代码改变而不重启应用的行动504。在一些实施例中,行动504包括基于该确定,将代码改变应用于软件应用而不重启软件应用。在示例中,取决于行动502的结果(即,当代码改变发生时应用106是否被挂起),改变应用器116使用

在实施例中,行动504a包括当代码改变在软件应用未被调试器挂起的情况下发生时,使用热重载更新将代码改变应用于软件应用,包括创建与源代码的第二版本相对应的新的存储器内实体以反映代码改变,同时保留现有存储器内实体。在示例中,改变应用器116使用热重载组件118来使用热重载来应用改变。参照示例400a,在一个示例中,改变应用器116创建存储器内实体404。参照示例400b,在另一示例中,改变应用器116创建存储器内实体404'。在实施例中,版本追踪器119将源代码的第一版本与现有存储器内实体相关联,并且将源代码的第二版本与新的存储器内实体相关联。

如行动503a和行动504a之间的箭头所指示的,在实施例中,仅当在行动503a中确定代码改变与热重载兼容时,才使用热重载更新将代码改变应用于软件应用。

在实施例中,行动504b包括当代码改变在软件应用被调试器挂起的情况下发生时,使用EnC更新将代码改变应用于软件应用,包括向与源代码的第一版本相对应的现有存储器内实体应用原地更新以反映代码改变,将现有存储器内实体转换成与源代码的第二版本相对应的更新后的现有存储器内实体。在示例中,改变应用器116使用EnC组件117来应用使用EnC的改变。参照示例400a,在一个示例中,改变应用器116将存储器内实体403a转换成存储器内实体403b。参照示例400b,在另一示例中,改变应用器116将存储器内实体403a'转换成存储器内实体403b'。在实施例中,版本追踪器119将源代码的第一版本与现有存储器内实体相关联,并且将源代码的第二版本与更新后的现有存储器内实体相关联。在实施例中,应用106的执行也在行动504b之后以及在行动505之前恢复。

如行动503b和行动504b之间的箭头所指示的,在实施例中,仅当在行动503b中确定代码改变与EnC兼容时,才使用EnC更新将代码改变应用于软件应用。

在某个时间,在完成行动504之后,方法500还包括确定应用被调试器挂起的行动505。在一些实施例中,行动505包括在将代码改变应用于软件应用而不重启软件应用之后,确定软件应用已被调试器挂起。在示例中,应用106在行动504之后的至少某个时间段内在调试器109内执行。这可能是因为在行动504(即,行动504a)时应用未被挂起,或者是因为在行动504之后(即,在行动504b的执行之后)恢复了应用的执行。无论如何,挂起检测器120确定应用106的执行是否已被调试器109挂起。

方法500还包括在用户界面处呈现调试信息的行动506。在一些实施例中,行动506包括在用户界面处呈现挂起点处的针对软件应用的源代码,包括以下之一:当在新的或更新后的存储器实体中挂起时呈现较新版本的源代码(行动506a),或者当在旧的存储器实体中挂起时呈现较旧版本的源代码(行动506b)。在示例中,呈现组件121基于结合行动504(包括行动504a和行动504b)描述的关联,使用版本追踪器119来确定要在用户界面处呈现的源代码的适当版本。呈现组件121然后使该源代码版本由调试器109呈现。

在实施例中,行动506a包括至少基于在执行更新后的现有存储器内实体时软件应用被调试器挂起,呈现软件应用的源代码的第二版本的至少一部分以及挂起点处的与更新后的现有存储器内实体相关联的对应运行时状态。参照示例400a,在一个示例中,在执行存储器内实体403b期间应用被调试器109挂起,并且呈现组件121使调试器109呈现与存储器内实体403b相对应的源代码的当前版本以及与存储器内实体403b相关联的运行时状态(例如,局部变量的值、存储器位置的值、当前机器代码指令等)。

在其他实施例中,行动506a包括至少基于在执行新的存储器内实体时软件应用被调试器挂起,呈现软件应用的源代码的第二版本的至少一部分以及挂起点处的与新的存储器内实体相关联的对应运行时状态。参照示例400b,在一个示例中,在执行存储器内实体404'期间应用被调试器109挂起,并且呈现组件121使调试器109呈现与存储器内实体404'相对应的源代码的当前版本以及与存储器内实体404'相关联的运行时状态(例如,局部变量的值、存储器位置的值、当前机器代码指令等)。

在实施例中,行动506b包括至少基于在执行现有存储器内实体时软件应用被调试器挂起,呈现软件应用的源代码的第一版本的至少一部分以及挂起点处的与现有存储器内实体相关联的对应运行时状态。参照示例400b,在一个示例中,在执行存储器内实体403b'期间应用被调试器109挂起,并且呈现组件121使调试器109呈现与存储器内实体403b'相对应的源代码的陈旧版本以及与存储器内实体403b'相关联的运行时状态(例如,局部变量的值、存储器位置的值、当前机器代码指令等)。在实施例中,这包括提供所呈现的源代码不是最新版本的视觉指示符。

尽管图5中未示出,但是在实施例中,方法500包括:将挂起位置从源代码的第一版本内的第一位置重新映射到源代码的第二版本内的第二位置。在示例中,当在行动501中在应用被挂起的情况下标识出代码改变时,调试器109知道源代码的第一版本中的对应挂起位置(例如,基于断点)。当使用EnC来应用代码改变时,该应用也被挂起。因此,在实施例中,实时更新器110将源代码的第一版本中的该挂起位置重新映射到源代码的第二版本中的对应挂起位置。在实施例中,重新映射的挂起位置被呈现在用户界面处(例如,由呈现组件121)。

为了图示通过方法500的第一示例路径,在实施例中,在应用106被调试器109挂起时接收代码改变。因此,在行动503中,将代码改变应用于软件应用而不重启软件应用包括:使用EnC更新将代码改变应用于软件应用(即,行动503b),它将现有存储器内实体转换成与源代码的第二版本相对应的更新后的现有存储器内实体。在实施例中,应用106稍后在执行该更新后的现有存储器内实体时被挂起。因此,在行动506中,在用户界面处呈现挂起点处的针对软件应用的调试状态包括:至少基于在执行更新后的现有存储器内实体时软件应用被调试器挂起,呈现软件应用的源代码的第二版本的至少一部分以及挂起点处的与更新后的现有存储器内实体相关联的对应运行时状态(即,行动506a)。

为了图示通过方法500的第二示例路径,在实施例中,在应用106未被调试器109挂起时接收代码改变。因此,在行动503中,将代码改变应用于软件应用而不重启软件应用包括:使用热重载更新将代码改变应用于软件应用(即,行动503a),它创建与源代码的第二版本相对应的新的存储器内实体,同时保留现有存储器内实体。在实施例中,应用106稍后在执行该新的存储器内实体时被挂起。因此,在行动506中,在用户界面处呈现挂起点处的针对软件应用的调试状态包括:至少基于在执行新的存储器内实体时软件应用被调试器挂起,呈现软件应用的源代码的第二版本的至少一部分以及挂起点处的与新的存储器内实体相关联的对应运行时状态(即,行动506a)。

为了图示通过方法500的第三示例路径,在实施例中,在应用106未被调试器109挂起时接收代码改变。因此,在行动503中,将代码改变应用于软件应用而不重启软件应用包括:使用热重载更新将代码改变应用于软件应用(即,行动503a),它创建与源代码的第二版本相对应的新的存储器内实体,同时保留现有存储器内实体。在实施例中,应用106稍后在执行现有存储器内实体时被挂起。因此,在行动506中,在用户界面处呈现在挂起点处的针对软件应用的调试状态包括:至少基于在执行现有存储器内实体时软件应用被调试器挂起,呈现软件应用的源代码的第一版本的至少一部分以及挂起点处的与现有存储器内实体相关联的对应运行时状态(即,行动506b)。

如连接行动504和行动501的箭头所指示的,在实施例中,方法500在行动501和行动504之间循环一次或多次,这可以创建源代码的各种版本和对应的存储器内实体。因此,在方法500的一个示例实施例中,行动501至行动504的第一环路通过将代码改变应用于软件应用而不重启软件应用,通过使用EnC更新将代码改变应用于软件应用来结束(即,行动504b)。然后,在行动501至行动504的第二环路中,方法500的该示例实施例还包括标识软件应用的源代码的第二版本的后续代码改变,从而产生软件应用的源代码的第三版本(即,行动501)。尽管未在图5中示出,但在实施例中,方法500包括保留软件应用的源代码的第二版本。在示例中,如果需要,则版本追踪器119保存源代码的第二版本(例如,在源代码111'内)以供稍后呈现。在行动501至行动504的该第二环路中,方法500的该示例实施例还包括确定在软件应用未被调试器挂起时发生了后续代码改变(即,来自行动502的“否”)。因此,在行动501至行动504的该第二环路中,方法500的该示例实施例还包括基于确定,使用热重载更新将后续代码改变应用于软件应用,包括创建与源代码的第三版本相对应的第二新的存储器内实体以反映代码改变,同时保留新的存储器内实体(即,行动504a)。在行动501至行动504的该第二环路之后的某个时间,方法500的该示例实施例还包括:在将后续代码改变应用于软件应用而不重启软件应用之后,确定软件应用已被调试器挂起(即,行动505),并且在用户界面处呈现用于在第二挂起点处的软件应用的调试状态(即,行动506)。在实施例中,行动506包括至少基于在执行第二新的存储器内实体时软件应用被调试器挂起,呈现软件应用的源代码的第三版本的至少一部分以及第二挂起点处的与第二新的存储器内实体相关联的对应运行时状态(即,行动506a),或者至少基于在执行新的存储器内实体时软件应用被调试器挂起,呈现软件应用的源代码的第二版本的至少一部分以及第二挂起点处的与新的存储器内实体相关联的对应运行时状态(即,行动506b)。

在方法500的另一示例实施例中,行动501至行动504的第一环路通过将代码改变应用于软件应用而不重启软件应用,通过使用热重载更新将代码改变应用于软件应用来结束(即,行动504a)。然后,在行动501至行动504的第二环路中,方法500的该示例实施例还包括标识软件应用的源代码的第二版本的后续代码改变,从而产生软件应用的源代码的第三版本(即,行动501)。尽管未在图5中示出,但在实施例中,方法500包括保留软件应用的源代码的第二版本。在示例中,如果需要,则版本追踪器119保存源代码的第二版本(例如,在源代码111'内)以供稍后呈现。在行动501至行动504的该第二环路中,方法500的该示例实施例还包括确定在软件应用被调试器挂起时发生了后续代码改变(即,来自行动502的“是”)。因此,在行动501至行动504的该第二环路中,方法500的该示例实施例还包括基于确定,使用EnC更新将后续代码改变应用于软件应用,包括将原地更新应用于与源代码的第二版本相对应的新的存储器内实体以反映代码改变,将新的存储器内实体转换成与源代码的第三版本相对应的更新后的新的存储器实体(即,行动504b)。在行动501至行动504的该第二环路之后的某个时间,方法500的该示例实施例还包括:在将后续代码改变应用于软件应用而不重启软件应用之后,确定软件应用已被调试器挂起(即,行动505),并且在用户界面处呈现用于在第二挂起点处的软件应用的调试状态(即,行动506)。在实施例中,行动506包括至少基于在执行更新后的新的存储器内实体时软件应用被调试器挂起,呈现软件应用的源代码的第三版本的至少一部分以及第二挂起点处的与更新后的新的存储器内实体相关联的对应运行时状态(即,行动506a)。

值得注意的是,当对软件应用执行热重载更新时,一些实施例不仅用新的存储器内实体(例如,方法和类型)来实时更新应用本身,而且还通知其他软件组件(例如,高级库)来清除可能通过应用代码改变而无效的缓存和/或视觉地刷新应用的用户界面,使得改变可以生效。因此,在方法500的一些实施例中,当将代码改变应用于软件应用而不重启软件应用包括使用热重载更新将代码改变应用于软件应用时,方法500还包括(i)通知第一外部软件组件清除受热重载更新影响的缓存,或(ii)通知第二外部软件组件视觉地刷新应用用户界面中的至少一项。在各种实施例中,第一外部软件组件和第二外部软件组件是相同的组件,或者是不同的组件。

因此,本文中所描述的实施例通过使得开发人员能够将源代码改变应用于主题应用来解决针对与所附接的调试器一起运行的应用的EnC与热重载能力之间的传统无能,该主题应用(i)当主题应用在断点或观察点处被挂起时(即,在EnC模式下)和(ii)当主题应用未被挂起时(即,在热重载模式下)与所附接的调试器一起执行。在实施例中,在EnC模式和热重载模式下进行的改变可以在相同的调试器会话期间被应用,并且在EnC模式下进行的改变与在热重载模式下进行的改变无缝交互(反之亦然)。本文中的实施例还解决了当热重载的方法的陈旧版本遇到断点并且源代码的旧版本不存在于当前源代码文件或编辑器缓冲器中时可能发生的情况。

尽管主题已用特定于结构特征和/或方法行动的语言描述,但是要理解的是,在所附权利要求中限定的主题并不一定被限于所描述的特征或上述行动或者上述行动的顺序。相反,所描述的特征和行动被公开为实施权利要求的示例形式。

本发明可以在不脱离其基本特性的情况下以其他具体形式实施。这种实施例可以包括数据处理设备,该数据处理设备包括用于执行本文中所描述的一种或多种方法的部件;包括指令的计算机程序,当程序由计算机执行时,该指令使计算机执行本文中所描述的一种或多种方法;和/或包括指令的硬件存储设备,在由计算机执行时,该指令使计算机执行本文中所描述的一种或多种方法。所描述的实施例在所有方面仅被认为是说明性的,而不是限制性的。因此,本发明的范围是由所附权利要求指示的,而不是由前述描述指示的。落入权利要求的等效含义和范围内的所有变化都会被包含在其范围内。当在所附权利要求中引入元素时,冠词“一”、“一个”、“该”和“所述”旨在表示存在一个或多个元素。术语“包括”、“包含”和“具有”旨在是包括性的,并且表示可能存在不同于所列举元素的附加元素。

相关技术
  • 用于对经优化代码的编辑并继续以及增强的经优化调试的技术
  • 用于对经优化代码的编辑并继续以及增强的经优化调试的技术
技术分类

06120116587222