脚本调试方法、设备及计算机存储介质与流程

文档序号:17720775发布日期:2019-05-22 02:08阅读:177来源:国知局
脚本调试方法、设备及计算机存储介质与流程
本发明涉及计算机
技术领域
,尤其涉及脚本调试方法、设备及计算机存储介质。
背景技术
:脚本是使用一种特定描述性语言,依据一定格式编写的可执行文件,又被称为宏或批处理文件。该描述语言也被称为脚本语言(scriptlanguages),它是为了缩短传统的编写、编译、链接、运行过程而创建的计算机编程语言。其中,脚本可理解为一种纯文本保存的程序,可由一系列计算机能执行的操作命令组成。脚本执行过程中,通过需要借助脚本引擎来完成;不同类型的脚本需要不同的脚本引擎,只有在脚本和脚本引擎匹配时,才能正确编译脚本。现有技术提供的脚本调试方案具体为:在启动脚本引擎时,需开启监听接口,监听待执行的调试命令;调试器通过该监听接口与设备中的容器通信,以实现相应地代码调试。在实践中发现,监听接口与用于脚本调试时所使用的调试接口(如jdi接口)是独立的、不一致的。每个监听接口仅允许调试一种脚本。如果同时需要调试多种脚本时,在脚本引擎中需设计多个监听接口;其中,一种脚本文件对应一个监听接口,不同监听接口间不能相互调用,且脚本引擎还需具备调试功能。这样在脚本引擎中将存在多个监听接口,增加设计难度和人力成本。此外,目前很多脚本引擎中并没有提供调试功能,通常采用日志分析的方式确定是否出现问题,其不能直接定位到问题出现的位置;或者后续研发人员通过二分法,删除部分脚本后重新执行以找出问题的位置,但这种方法将延长研发时间、降低效率。相应地,如果让调试引擎具备调试功能,则需修改调试引擎的代码,由于脚本引擎通常是开源代码设计的,增加调试功能比较困难且还容易导致调试引擎运行出错。因此需提出一种在不修改脚本引擎的代码时,也能实现脚本调试、快速定位问题位置的方案。技术实现要素:本发明实施例公开了脚本调试方法、设备及计算机存储介质,能够实现在不修改调试器(脚本引擎)代码的情况下,让不具备调试功能的调试器也能实现脚本调试、快速定位问题位置等功能。第一方面,本发明实施例公开提供了一种脚本调试方法,所述方法包括:设备获取调试指令,所述调试指令携带有待调试的目标行断点,所述目标行断点至少包括用于指示请求调试脚本文件中断点位置所在行代码的行信息;在确定满足断点调试条件的情况下,显示调试结果,所述调试结果包括所述设备对所述目标行断点对应的行代码执行断点处理时所获得的信息,所述断点调试条件至少包括目标接口断点与目标局部变量各自对应的标识信息一致,所述目标接口断点是根据所述目标行断点确定的,所述目标局部变量是根据与所述目标行断点关联的上下行代码确定的。第二方面,本发明实施例公开了一种脚本调试方法,所述方法包括:调试器接收调试触发指令,所述调试触发指令携带有触发待调试的目标接口断点,所述目标接口断点是根据待调试的目标行断点确定的,所述目标行断点至少包括用于指示请求调试脚本文件中断点位置所在行代码的行信息;在确定满足断点调试条件的情况下,显示调试结果,所述调试结果包括所述设备对所述目标行断点对应的行代码执行断点处理时所获得的信息,所述断点调试条件至少包括目标接口断点与目标局部变量各自对应的标识信息一致,所述目标接口断点是根据所述目标行断点确定的,所述目标局部变量是根据与所述目标行断点关联的上下行代码确定的。在一些可能的实施例中,所述方法还包括:获取调试指令,所述调试指令携带有待调试的所述目标行断点;向与所述调试器连接的容器发送调试请求指令,所述调试请求指令携带有所述目标接口断点,以在所述容器执行到所述目标接口断点所对应的断点位置时,向所述调试器发送所述调试触发指令。在一些可能的实施例中,在所述调试指令为单步调试指令时,所述调试指令还携带有所述目标行断点关联的候选调试信息,所述调试触发指令还携带有候选接口断点;其中,所述候选接口断点是根据所述候选调试信息确定的,所述候选调试信息至少包括所述脚本文件中所述目标行断点关联的下一待执行的行代码的行信息。结合第一方面或第二方面,在一些可能的实施例中,所述目标接口断点是根据预存的与所述目标行断点所在行代码所对应的目标类信息确定的,所述目标接口断点为所述设备中调试接口所能识别的断点。结合第一方面或第二方面,在一些可能的实施例中,所述方法还包括:创建多个关键信息与多个类信息之间关联关系,所述多个关键信息与多个行断点关联,所述多个行断点至少包括所述目标行断点,所述多个类信息至少包括所述目标类信息。结合第一方面或第二方面,在一些可能的实施例中,所述在确定满足断点调试条件的情况下,显示调试结果包括:遍历所述脚本文件中所有的行断点,在查找到存在与所述目标行断点对应的目标类信息的情况下,确定与所述目标行断点对应的目标局部变量的标识信息;在所述目标局部变量的标识信息与所述目标接口断点的标识信息一致的情况下,显示调试结果。结合第一方面或第二方面,在一些可能的实施例中,所述方法还包括:创建多个关键信息与多个局部变量之间的映射关系,所述多个关键信息与多个行断点关联,所述多个行断点至少包括所述目标行断点,所述多个局部变量至少与所述目标行断点对应的目标局部变量。结合第一方面或第二方面,在一些可能的实施例中,所述标识信息包括:行信息和/或id信息。结合第一方面或第二方面,在一些可能的实施例中,所述调试指令包括以下中的任一项:断点调试指令、单步调试指令、函数进入指令。结合第一方面或第二方面,在一些可能的实施例中,所述调试结果包括以下中的至少一项:焦点位置信息、堆栈调用信息以及局部变量信息;所述焦点位置信息用于指示所述脚本文件中所述目标行断点所在的行信息,所述堆栈调用信息用于指示调试所述脚本文件时所需调用的堆栈信息,所述堆栈信息至少包括所述目标行断点对应的行代码,所述局部变量信息包括所述目标局部变量在内的至少一个局部变量,所述局部变量是根据所述目标行断点对应的行代码以及与所述行代码关联的上下行代码计算获得的。结合第一方面或第二方面,在一些可能的实施例中,所述方法还包括:在确定不满足断点调试条件的情况下,从所述目标行断点对应的行代码开始恢复执行所述脚本文件。第三方面,本发明实施例公开提供了一种设备,包括用于执行上述第一方面的方法的功能单元。第四方面,本发明实施例公开提供了一种调试器,包括用于执行上述第二方面的方法的功能单元。第五方面,本发明实施例公开提供了一种脚本调试系统,包括调试器和容器;所述调试器为如上第四方面所述提供的调试器;所述容器用于在脚本文件中执行到与目标接口断点对应的断点位置时,向调试器发送调试触发指令,所述调试触发指令携带有触发待调试的目标接口断点,所述目标接口断点是根据待调试的目标行断点确定的,所述目标行断点至少包括用于指示请求调试脚本文件中断点位置所在行代码的行信息。可选地,所述容器用于接收所述调试器发送的调试请求指令,所述调试请求指令携带有所述目标接口断点;存储所述目标行断点,以在所述容器执行到所述目标接口断点所对应的断点位置时,向所述调试器发送所述调试触发指令。关于本发明未示出或未描述的内容可参见前述实施例中的相关介绍这里不再赘述。第六方面,本发明实施例提供了一种设备,包括存储器、通信接口及与所述存储器和通信接口耦合的处理器;所述存储器用于存储指令,所述处理器用于执行所述指令,所述通信接口用于在所述处理器的控制下与其他设备进行通信;其中,所述处理器执行所述指令时执行上述第一方面描述的方法。第七方面,本发明实施例提供了一种调试器,包括存储器、通信接口及与所述存储器和通信接口耦合的处理器;所述存储器用于存储指令,所述处理器用于执行所述指令,所述通信接口用于在所述处理器的控制下与容器进行通信;其中,所述处理器执行所述指令时执行上述第二方面描述的方法。第八方面,提供了一种计算机可读存储介质,所述计算机可读存储介质存储了用于邮件传输的程序代码。所述程序代码包括用于执行上述第一方面描述的方法的指令。第九方面,提供了一种计算机可读存储介质,所述计算机可读存储介质存储了用于邮件传输的程序代码。所述程序代码包括用于执行上述第二方面描述的方法的指令。第十方面,提供了一种包括指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述第一方面描述的方法。第十一方面,提供了一种包括指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述第二方面描述的方法。通过实施本发明实施例,能够在不修改脚本引擎具备调试功能的情况下,实现脚本调试、问题位置的快速定位等功能。附图说明为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍。图1是现有技术提供的一种网络框架示意图;图2是本发明实施例提供的一种网络框架示意图;图3是本发明实施例提供的一种脚本调试方法的流程示意图;图4是本发明实施例提供的又一种脚本调试方法的流程示意图;图5是本发明实施例提供的又一种脚本调试方法的流程示意图;图6a是本发明实施例提供的一种网络设备的结构示意图;图6b是本发明实施例提供的又一种网络设备的结构示意图。具体实施方式下面将结合本发明的附图,对本发明实施例中的技术方案进行详细描述。本申请的发明人在提出本申请的过程中发现:脚本一般都有相应地脚本引擎来解释执行,即脚本文件通过脚本引擎来编译执行。脚本语言有多种,则对应的脚本引擎也有多种,不同的脚本(文件)需要不同的脚本引擎来编译。即一种脚本(文件/语言)对应一种脚本引擎。脚本引擎是一种计算机编程语言的解释器,它的功能是解释执行用户的程序文件,将它编译为计算机能识别执行的机器代码,以完成相应的功能。目前,常用的脚本引擎通常分为以下三类:第一类是将脚本直接编译为类class文件,不需要单独的脚本引擎来执行,可直接调用相关的调试接口,如java调试接口(javadebuginterface,jdi)来完成脚本调试。其中,此处的脚本引擎包括脚本语言描述、执行以及调试等功能,例如groovy、scala、kotlin、fantom、jython、jruby等脚本引擎。由于该类脚本不需要借助脚本引擎来完成编译调试,其不在本发明讨论的范畴中。第二类是具备调试功能的脚本引擎。该脚本引擎支持在脚本执行过程中支持打断点、单步执行等动作的功能,例如python、perl、php、ruby、lua、ant、xslt等脚本引擎。由于在借助具备调试功能的脚本引擎执行脚本时,需将待调试的脚本文件(即代码)放入到该调试引擎中一起执行,此时可将该技术称为侵入式调试技术。第三类是不具备调试功能的脚本引擎,例如freemarker、bpmn、smooks、gradle、shell等脚本引擎。由于该脚本引擎不具备调试功能,其不能用来调试和编译脚本文件,其不能定位脚本中出现问题的位置。在使用脚本引擎编译和调试脚本时,需利用到一些调试接口。例如,以java语言为例,java调试线协议(javadebugwireprotocol,jpda)三层模型中最高层中定义了脚本引擎所需使用的一些调试接口,如jdi接口。基于这些调试接口,调试器可及时了解虚拟机的状态,如虚拟机上有哪些类和容器实例等,此外,调试器还能控制虚拟机的运行,如挂起/恢复虚拟机上的线程、设置断点等等操作。现有技术提出的脚本调试方案为:启动脚本引擎时需开启监听接口,该监听接口用于监听需执行的调试请求命令。调试器(具体可为调试器中的脚本插件)通过该监听接口与脚本引擎连接,以完成脚本的编译和调试。具体如图1示出现有技术提供的框架示意图。研究发现,在调用脚本引擎的调试功能时需开启相应地监听接口,该监听接口与调试接口(如jdi接口)是彼此独立的。每种监听接口仅能调试一种脚本,如果需同时调试多种脚本时,同一调试器需连接脚本引擎的多个监听接口,以实现脚本的编译和调试。不同监听接口之间不能相互调用。如此,将导致同一脚本引擎中会设计多个监听接口,且多个监听接口是不兼容、独立存在的,增大设计难度以及人力成本。此外,针对一些具备调试功能的脚本引擎而言,并不能对脚本进行调试,也无法完成问题的定位。如果想要脚本引擎具备调试功能,则需修改脚本引擎的代码。由于目标脚本引擎的代码是开源设计的,修改困难,且增加调试功能容易导致脚本引擎运行时出现问题。为解决上述问题,本申请提出一种在不修改脚本引擎具备调试功能的情况下,实现脚本的调试、问题位置的快速定位等功能。下面介绍本发明适用的网络框架示意图。具体如图2,该网络框架示意图包括容器和调试器,其中容器和调试器的数量并不限定,图示仅示出一个容器和一个调试器。所述容器可部署/运行在虚拟机上,所述容器中设计有用于脚本编译和调试的脚本引擎。以java容器为例,可具体是指运行脚本引擎的java进程。在启动java容器时,可使用漏洞工具(xdebug)的相关参数来开启java虚拟机(jvm)的调试特性(即调试功能)。java容器中的脚本引擎可以是指具有脚本解析执行能力的jar包,一般都是使用java语言开发的。所述调试器(具体为所述调试器中的插件)可与开启调试功能的脚本引擎通信连接,用于调试脚本(代码)的前端进程。常用例如eclipse、intellijidea、netbeans等调试器。可选实施例中,所述容器与所述调试器通信具体使用的接口为调试接口,如jdi接口等。在脚本、调试过程中,能使用到的调试指令包括但不限于以下指令中的任一项或多项的组合:开始、暂停、回复、步入(stepinto)、单步(stepover)、步出(stepout)、断点设置、断点触发、异常触发、修改变量、读取堆栈等等动作指令。可选的,调试指令与脚本语言密切相关,如以java语言为例,断点设置指令可为bp:build.xml:10。基于图2所示的网络框架示意图,请参见图3是本发明实施例提供的一种脚本调试方法的流程示意图。如图3所示的方法,可包括如下实施步骤:步骤s301、调试器接收调试指令,所述调试指令携带有待调试的目标行断点,所述目标行断点用于指示请求调试脚本文件中的行代码所在行的断点位置。所述调试指令可以是客户端(用户)发送的,所述调试指令至少携带有目标行断点的相关信息,所述目标行断点是指用户在脚本文件中所设置的断点,所述相关信息包括但不限于行断点在脚本文件中对应行代码所在的位置信息(即断点位置,如所述脚本文件中断点所在的行)、行断点设置的数量、设置的断点所对应的脚本文件或脚本文件的标识、或其他与行断点相关的信息等等。可选的,行断点也可称为脚本断点,即在用户层面侧,用户设置用来调试脚本文件的断点。步骤s302、所述调试器将所述目标行断点转换为目标接口断点,并生成相应地断点请求指令,所述断点请求指令携带有所述目标接口断点,所述目标接口断点为调试接口所能识别的断点。步骤s303、所述调试器将所述断点请求指令发送给容器。相应地,所述容器接收所述断点请求指令。步骤s304、所述容器执行到所述目标接口断点对应的断点位置时,向所述调试器发送调试触发指令,所述调试触发指令携带有所述目标接口断点。相应地,所述调试器接收所述调试触发指令。步骤s305、所述调试器在确定到满足断点调试条件时,显示调试结果,所述调试结果为所述调试器执行所述目标行断点所关联的上下行代码所获得的信息;所述断点调试条件包括目标接口断点和目标局部变量各自的标识信息一致,所述目标局部变量是根据所述目标行断点所关联的上下行代码确定的。本申请中,所述容器和所述调试器可被部署在同一设备中,也可被部署到不同设备中,并不限定。下面介绍本申请涉及的一些具体实施例和可选实施例。步骤s301之前,需先开启调试器。该调试器可启动并加载相关的脚本插件,该脚本插件可为所述调试器的内部插件(如图2所示),也可为其他设备中具备脚本调试功能的插件,并不限定。当所述脚本插件为所述调试器的内部插件时,所述调试器可自动在插件目标中查找并加载相关脚本插件。在加载脚本插件后,进一步地,脚本插件可在调试器中注册相关的调试命令使得调试器具备执行这些调试命令的功能,并监听调试端口,以进行脚本调试。关于所述调试命令可参见前述实施例中的相关介绍,这里不再赘述。相应地,研发人员可在调试器中打开脚本文件执行相应地调试动作(如断点设置动作等)。即是客户端可向调试器发送脚本调试请求,所述脚本调试请求用于开启所述调试器的调试功能,以便后续调试脚本文件。步骤s301中,所述调试指令至少携带有用户在脚本文件中所设置的断点的相关信息(即本申请中的目标行断点)。所述相关信息包括但不限于断点位置(如在脚本文件中设置断点所在的行等)等,可参见前述实施例中的相关描述,这里不再赘述。所述调试指令可参见前述所述调试命令的相关阐述,这里不再赘述。应理解的是,脚本文件中每行代码中都有各自对应的关键信息,所述关键信息包括但不限于关键字、关键词。一行代码或几行代码对应可有一个或多个关键信息。所述关键信息用于标识行代码的作用(即用于执行什么操作),例如servicetaskbeginnode、servicetaskendnode等等。步骤s302中,所述调试器可将所述目标行断点转换为调试接口能够识别的目标接口断点。即容器的调试接口根据所述目标接口断点能够识别出其对应在脚本文件中设置的断点(即行断点)的断点位置(如在脚本文件中断点所在的行)。进一步地,所述调试器可生成相应地断点请求指令,并发送给所述容器(具体是指所述容器中的脚本引擎),以便所述容器(即脚本引擎)执行所述断点请求指令。可选的,所述调试器还需预先建立与所述容器之间的通信连接,以便所述调试器将生成的断点请求指令发送给所述容器。下面介绍步骤s302涉及的一种具体实施方式。步骤s302中,所述调试器可根据预存的所述目标行断点对应的目标类信息,确定所述目标接口断点;进一步地,生成相应地断点请求指令。相应地,在步骤s302之前,还可包括:所述调试器创建多个行断点与多个类信息之间的关联关系。可选地,所述行断点与关键信息关联,即每一或多个行代码(行断点)可对应有一个或多个关键信息。即所述调试器也可创建多个关键信息与多个类信息之间的关联关系,且所述多个行断点至少包括所述目标行断点或者所述多个关键信息至少包括与所述目标行断点关联的目标关键信息,所述多个类信息至少包括所述目标类信息。具体的,以所述关键信息为关键字为例,如下表1示出某一脚本文件中脚本关键字与class类信息之间的映射表,即示出脚本关键字与class类名之间的关联关系。表1关键字class类名class行servicetaskbeginnodeabstracttaskclassname42servicetaskendnodeabstracttaskclassname67sequenceflowbeginnodebpmnactivitybehaviorclassname129sequenceflowendnodebpmnactivitybehaviorclassname129starteventbeginnodeexecutionentityclassname381starteventendnodeexecutionentityclassname381endeventbeginnodeexecutionentityclassname399endeventendnodeexecutionentityclassname399由上表1给出:关键字与类信息(具体包括类名以及类在脚本文件中所在的行)之间的关联关系。引用上表1,步骤s302的具体实现方式为:所述调试器可根据所述目标行断点所在脚本文件中的行(即断点位置所在的行),确定该行或与与该行相关的上下行代码中用于标识断点位置的目标关键信息(这里即是关键字);然后从预存的至少一个关键信息和至少一个类信息的关联关系(如上表1关键字与类信息的映射表)中,查找出与所述目标关键信息对应的目标类信息(具体可以是该目标类所在的行);进一步地,所述调试器可将所述目标行断点转换为目标接口断点,即该目标接口断点用于指示所述目标类信息(具体的可指所述断点位置所对应的目标类所在的行),并生成相应地调试请求指令,如jdi调试request指令。其中,所述调试请求指令携带有所述目标接口断点,具体是指所述目标接口断点的指示信息,如所述目标接口断点对应的目标类信息(类名、类所在的行)等。步骤s303中,所述容器接收所述断点请求指令。可选地,还可记录所述断点请求指令中携带的目标接口断点。步骤s304中,所述容器在执行所述脚本文件时,如果执行到所述目标接口断点对应的断点位置时,可向所述调试器发送调试触发指令,所述调试触发指令携带有所述目标接口断点(具体可是所述目标接口断点的指示信息)。步骤s305中,在所述调试器接收所述调试触发指令后,可遍历所述脚本文件中所有已设置的行断点,并判断是否存在满足断点调试条件的所述目标行断点,如果存在,则继续进行后续的断点处理,显示调试结果。下面介绍步骤s305的一种具体实施方式。具体的,步骤s305中调试器在接收到调试请求指令时,可遍历脚本文件中所有的行断点。依据所述调试器中预存的各行断点(或各行断点各自对应的关键信息)与各类信息之间的关联关系,如上表1示出的关键字和类信息之间的映射关系,可确定每个行断点各自对应的类信息;然后确定所述每个行断点各自对应的类信息中是否存在有所述调试触发指令中携带的所述目标类信息(即所述目标接口断点所对应的目标类信息),也即是所述调试器确定所述目标接口断点与所述目标行断点是否匹配,如果存在/匹配,则可继续后续流程;否则,结束流程。在所述目标接口断点和所述目标行断点匹配的情况下,所述调试器可调用相关堆栈信息来计算所述目标行断点相关上下行代码所涉及的一些局部变量。应理解的是,所述目标行断点所对应的行代码以及与该行代码关联的上下行代码中可能会存在多个局部变量,这些局部变量可供研发者查看确认相关代码行是否出现错误,以定位脚本文件(即代码)问题所在的位置。为实现脚本文件的准确调试,这些局部变量中存在一个目标局部变量,以使所述调试器进一步在确定到所述目标局部变量的标识信息和所述目标接口断点的标识信息(也可是所述目标接口断点对应的目标类信息,即目标类在所述脚本文件中所在的行)一致时,方能执行后续的断点处理操作,显示调试结果。所述标识信息包括但不限于行信息、id信息等等。如所述目标局部变量的标识信息可以是所述目标局部变量在所述脚本文件中行代码所在的行;或者用于标识所述目标局部变量的id字段等等。相应地,所述目标接口断点的标识信息也类似,这里不再赘述。其中,所述目标局部变量是根据所述目标行断点确定的。具体的,所述调试器中可预先存储有多个行断点与多个局部变量信息的关联关系;可选地,所述调试器中也可预先多个行断点各自对应的关键信息与多个局部变量信息的关联信息。所述多个行断点至少包括所述目标行断点,或者所述多个关键信息至少包括所述目标行断点对应的目标关键信息。所述多个局部变量信息至少包括所述目标局部变量的信息。以所述关键信息为关键字为例,如下表2示出一种关键字与局部变量信息之间的映射表。表2由上述表2可知,示出的所述局部变量信息可包括局部变量名以及该局部变量所在的堆栈(即表2的堆栈编号)。引用上表2示出的关键字与局部变量信息之间的映射表,步骤s305中在所述调试器确定到所述目标接口断点与所述目标行断点匹配的情况下,所述调试器可根据所述目标行断点所在脚本文件中的行(即断点位置所在的行),确定该行或与与该行相关的上下行代码中用于标识断点位置的目标关键信息(这里即是关键字);然后从预存的至少一个关键信息和至少一个局部变量信息的关联关系(如上表2关键字与局部变量信息的映射表)中,查找出与所述目标关键信息对应的目标局部变量信息(具体可以是目标局部变量名);进一步地,所述调试器可从上述根据所述目标行断点对应的行代码以及上下行代码计算的多个局部变量中,查找出所述目标局部变量名所对应的目标局部变量(即是本申请中所述目标局部变量的标识信息)。然后判断所述目标局部变量的标识信息与所述目标接口断点的标识信息(可以是本申请中目标类信息)是否相同,如果相同,则进行断点处理,显示调试结果。所述调试结果包括但不限于焦点位置信息、堆栈调用信息以及局部变量信息等等。其中,所述焦点位置信息用于指示所述目标行断点在所述脚本文件中断点位置所对应的行代码。所述堆栈调用信息为计算局部变量时所需调用的堆栈信息,其中最顶层堆栈可为所述目标行断点在所述脚本文件中对应的行代码。所述局部变量信息是指上述利用所述目标行断点对应的行代码以及上下文行代码所计算得到的一个或多个局部变量。反之,在所述目标接口断点和所述目标行断点不匹配的情况下,所述调试器可向所述容器发送恢复执行指令。相应地,所述容器接收所述恢复执行指令,并根据所述恢复执行指令的指示所述容器从所述目标接口断点所对应的断点位置处开始继续执行所述脚本文件。通过实施本发明实施例,能够利用不具备调试功能的脚本引擎实现脚本调试,提升了开发效率,缩短了产品上市时间(timetomarketing,ttm)。下面以所述调试指令为断点调试指令和单步调试指令为例,如下图4和图5分别示出断点调试指令和单步调试指令相关的一些具体实施例。以所述调试指令为断点调试指令为例,如图4示出一种脚本调试方法的流程示意图。如图4所示的脚本调试方法可包括如下实施步骤:s111-s112、启动调试器并加载脚本插件,以在所述调试器中完成相关调试指令的注册以及监听调试接口(如java开发中的jdi接口)。s113-s114、用户客户端在启用调试器中的调试功能,即在调试器中执行启动调试功能的操作时,需建立所述调试器与容器(如java容器)之间的通信连接,如socket连接。以用于后续向所述容器通知相关的断点调试指令。s115-s120、用户客户端向所述调试器发送断点调试指令,所述断点调试指令携带有目标行断点。所述调试器将所述目标行断点转换为目标接口断点,并向所述容器发送调试请求指令,所述调试请求指令携带所述目标接口断点。具体的,开发人员在调试器中打开脚本文件,并设置相应的目标行断点,即执行断点设置操作。所述目标行断点用于指示在所述脚本文件中设置断点所在行代码的断点位置。脚本插件接收到该断点设置操作时,可根据预存的多个关键信息(或多个行断点)与多个类信息之间的映射关系,如上表1示出脚本关键字与脚本引擎所能识别的class类信息的映射表,确定出所述目标行断点(或所述目标行断点关联的目标关键信息)所对应的目标类信息(具体可为所述脚本文件中所述目标行断点所在目标类的行信息)。进一步地,可将所述目标行断点转换为目标接口断点(如jdi断点),生成对应的jdi调试请求指令,并发送给所述容器。相应地,所述容器接收所述调试请求指令,并记录所述调试请求指令。具体的,所述容器可记录所述调试请求指令中携带的所述目标接口断点,即记录相关断点信息。s121、所述容器(具体可为脚本引擎)在执行到所述目标接口断点对应的断点位置时,向所述调试器发送调试触发指令(即断点触发事件)。s122-s124、所述调试器接收所述调试触发指令,判断所述目标接口断点是否继续执行。如果是,则可调用堆栈信息计算所述目标行断点关联的上下行代码对应的至少一个局部变量。进一步地,获取所述目标行断点关联的目标局部变量,判断所述目标局部变量的标识信息与所述目标行断点的标识信息是否一致。如果一致,则执行步骤s125显示调试结果。否则继续执行步骤s126。具体的,所述调试器接收所述调试触发指令(或接收到断点触发事件)时,可遍历所述脚本文件中设置的所有行断点,根据如上表1预存的多个关键信息与多个类信息之间的关联关系,可确定各个行断点各自对应的类信息。同时,所述调试器在获取到某一行断点对应的类信息时,检查该类信息是否和所述调试触发指令中携带的所述目标接口断点所指示的目标类信息匹配,如果匹配,则确定到所述目标接口断点可继续执行后续步骤,如步骤s123。如果不匹配,则可遍历所述脚本文件中的其他行断点或结束流程。相应地,在确定到所述目标接口断点可继续执行后,所述调试器(具体可是脚本插件)可调用相关的堆栈信息,计算所述目标接口断点对应所在的行代码以及与该行代码关联的上下行代码所对应的一个或多个局部变量。该局部变量包括所述局部变量的标识信息,如所述局部变量位于所述脚本文件中的行,或者用于标识所述局部变量的id字段等等。进一步地,脚本插件可获取所述目标接口断点关联的目标局部变量,判断所述目标局部变量的标识信息和所述目标行断点的标识信息(可以为所述目标行断点所指示的目标类信息)是否一致,如果一致,则执行后续步骤s125。否则,结束流程。其中,所述目标局部变量可以是所述脚本插件根据预存的多个关键信息与多个局部变量信息之间的关联关系(如上表2示出的脚本关键字与局部变量间的关联关系),查找出与所述目标接口断点对应的目标关键信息所对应的目标局部变量信息。如引用上表2,可获知到目标局部变量名,然后脚本插件根据该目标局部变量名从多个局部变量中获取到所述目标局部变量的标识信息。如果该目标局部变量的标识信息与所述目标接口断点的标识信息一致时,也可理解为所述目标局部变量的值与所述目标接口断点所对应的值一致,则可认为所述容器(具体为脚本引擎)正在执行断点调试指令,即正执行到所述断点位置所在的行代码处。如果不一致,则可认为所述容器并未执行断点调试指令,即未执行到断点位置所在的行代码处,可继续执行s216,即向所述容器发送恢复执行指令,以使得所述容器继续从所述目标行断点对应的断点位置所在的行代码处继续执行所述脚本文件。s125、显示调试结果。具体的,所述调试器可在编辑窗口显示所述脚本文件,并将焦点显示在所述目标行断点对应的断点位置所在的行代码处。可选地,还可在堆栈窗口中显示堆栈调用信息。该堆栈调用信息是指计算局部变量信息时所使用到的堆栈,其中最顶层堆栈可显示为脚本行,如目标行断点对应位于所述脚本文件中的行代码。可选地,还可在局部变量窗口中显示执行上下行代码所产生的多个局部变量。具体可是各个局部变量的标识信息(如所在行、id字段、或数值等)。s126、向所述容器发送恢复执行指令。具体的,如果所述调试器判断到结果不一致时,可向所述容器发送恢复执行指令,以让所述容器继续从所述目标行断点对应的断点位置所在的行代码处继续执行所述脚本文件。图5示出单步调试指令所涉及的脚本调试方法。如图5所示的方法可包括如下实施步骤:s211、调试器在脚本文件中执行到目标行断点所对应的断点位置所在的行代码时,中断了所述脚本文件的继续执行。即在所述行代码处开始中断,后续可使用单步调试功能(如步入stepinto、单步stepover、步出stepout)来完成所述脚本文件的调试。s212-s213、当调试器在目标行断点(断点位置)所在脚本文件中的行代码处中断时,用户客户端(也可为开发人员)在调试器中执行单步调试指令。即所述调试器接收单步调试指令,所述单步调试指令携带有所述目标行断点(即断点位置在所述脚本文件中行代码对应的行信息)。所述调试器可将所述单步调试器指令转发给脚本插件,以便所述脚本插件进行断点转换操作。s214-s217、所述脚本插件可将所述目标行断点转换为目标接口断点。可选地,所述脚本插件还可将所述目标行断点关联的上下行代码都转换为接口断点。所述脚本插件生成响应地单步调试请求指令,所述单步调试请求指令携带所述目标接口断点。具体的,每一个或多个行代码中会存在至少一个关键信息,该关键信息包括但不限于关键字。所述将所述目标行断点转换为目标接口断点其实质是:根据所述目标行断点关联的目标关键信息,确定所述目标行断点所在目标类的信息(即目标类信息,如目标类所在的行),也即是本申请中所述脚本引擎(容器)所能识别的接口断点,即目标类所在脚本文件中的行。作为步骤s214的一种具体实施方式可为:脚本插件可根据预存的多个关键信息与多个单步关键信息之间的关联关系,查找出所述目标行断点关联的关键信息所对应的目标单步关键信息,所述目标单步关键信息包所述目标行断点关联的关键信息以及单步执行所述目标行断点所在行代码的下一个或下几个目标关键信息(如下一个关键字)。然后如上表1,根据预存的多个关键信息与多个类信息,查找出每个目标关键信息各自对应的目标类信息,将其均转换为相应地接口断点。以所述关键信息为关键字为例,如下表3示出脚本关键字与下一个关键字的映射表。表3由上表3可知,脚本插件可根据所述目标行断点所在行代码的关键字查找出所述目标行断点关联的下一关键字。如关键字为servicetaskbeginnode,则其对应的下一关键字为servicetaskendnode。相应地,脚本插件可利用上表1示出的脚本关键字和类信息之间的映射关系,确定出每个关键字各自对应的类信息,然后将其转换为所述容器(脚本引擎)所能识别的接口断点,进一步地可生成相应地调试请求指令,具体可参见前述实施例中的相关描述,这里不再赘述。s218、所述容器(具体可为脚本引擎)在执行到所述目标接口断点对应的断点位置时,向所述调试器发送调试触发指令(即断点触发事件)。s219-s221、所述调试器接收所述调试触发指令,判断所述目标接口断点是否继续执行。如果是,则可调用堆栈信息计算所述目标行断点关联的上下行代码对应的至少一个局部变量。进一步地,获取所述目标行断点关联的目标局部变量,判断所述目标局部变量的标识信息与所述目标行断点的标识信息是否一致。如果一致,则执行步骤s222显示调试结果。否则继续执行步骤s223。s222、显示调试结果。s223、向所述容器发送恢复执行指令,以便所述容器继续从所述目标行断点所在行代码处继续执行所述脚本文件。关于本申请中未描述或未示出的内容,可参见前述图1-图4所述实施例中的相关阐述,例如本申请中步骤s212-步骤s223可参见前述图4所述实施例中步骤s115-步骤s126中的相关描述等,这里不再赘述。需要说明的是,本申请使用的程序编译语言场景并不做限定,例如java平台,其调试接口可为jdi接口;又如,c++等汇编语言开发平台等。其区别在于:接口断点对应的类信息以及行代码所在的行,可能需要更改为汇编语言中导出的函数名和偏移量等等。采用本申请实施例,只需调用脚本引擎的调试接口,避免现有技术中需开启多个监听端口,通过调试接口可对任何语言形式的脚本文件进行调试;且脚本文件的相关调试信息都在脚本插件内部实行,不需借助脚本引擎的支持,即可实现任何脚本语言的调试。这种调试方法也叫做非侵入式脚本语言调试。让没有调试能力的脚本引擎,也能快速实现调试能力,提高了开发效率,缩短了ttm。上述主要从调试器和容器交互的角度出发对本发明实施例提供的方案进行了介绍。可以理解的是,网络设备为了实现上述功能,其包含了执行各个功能相应的硬件结构和/或软件模块。结合本发明中所公开的实施例描述的各示例的单元及算法步骤,本发明实施例能够以硬件或硬件和计算机软件的结合形式来实现。某个功能究竟以硬件还是计算机软件驱动硬件的方式来执行,取决于技术方案的特定应用和设计约束条件。本领域技术人员可以对每个特定的应用来使用不同的方法来实现所描述的功能,但是这种实现不应认为超出本发明实施例的技术方案的范围。本发明实施例可以根据上述方法示例对网络设备进行功能单元的划分,例如,可以对应各个功能划分各个功能单元,也可以将两个或两个以上的功能集成在一个处理单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。需要说明的是,本发明实施例中对单元的划分是示意性的,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式。在采用集成的单元的情况下,图6a示出了上述实施例中所涉及的设备的一种可能的结构示意图。设备600包括:处理单元602和通信单元603。处理单元602用于对设备600的动作进行控制管理。例如在一种可能的实施例中,当所述设备包括调试器和容器时,处理单元602用于支持设备600执行图3中s301-s305,图4中s111-s124,图5中s211-221,和/或用于执行本文所描述的技术的其它步骤。通信单元603用于支持设备600与其它设备的通信,例如,通信单元603用于支持设备600与用户客户端进行通信以接收调试指令。在又一种可能的实施例中,当所述设备为调试器时,处理单元602用于支持设备600执行图3中s302、s305,图4中s111-s112、s116-s118以及s122-s124,图5中s211-221,和/或用于执行本文所描述的技术的其它步骤。通信单元603用于支持设备800与其它设备(如容器)的通信,例如,通信单元603用于支持设备600执行图3中步骤s303,图4中步骤s119、s121、s126,图5中步骤s216、s218以及s223,和/或用于执行本文所描述的技术的其它步骤。设备600还可以包括存储单元601,用于存储设备600的程序代码和数据。其中,处理单元602可以是处理器或控制器,例如可以是中央处理器(英文:centralprocessingunit,cpu),通用处理器,数字信号处理器(英文:digitalsignalprocessor,dsp),专用集成电路(英文:application-specificintegratedcircuit,asic),现场可编程门阵列(英文:fieldprogrammablegatearray,fpga)或者其他可编程逻辑器件、晶体管逻辑器件、硬件部件或者其任意组合。其可以实现或执行结合本发明公开内容所描述的各种示例性的逻辑方框,模块和电路。所述处理器也可以是实现计算功能的组合,例如包含一个或多个微处理器组合,dsp和微处理器的组合等等。通信单元603可以是通信接口、收发器、收发电路等,其中,通信接口是统称,可以包括一个或多个接口,例如设备与其他设备(客户端、运行又容器的其他设备)之间的接口。存储单元701可以是存储器。当处理单元602为处理器,通信单元603为通信接口,存储单元601为存储器时,本发明实施例所涉及的设备可以为图6b所示的设备。参阅图6b所示,该网络设备610包括:处理器612、通信接口613、存储器611。可选地,设备610还可以包括总线614。其中,通信接口613、处理器612以及存储器611可以通过总线614相互连接;总线614可以是外设部件互连标准(英文:peripheralcomponentinterconnect,简称pci)总线或扩展工业标准结构(英文:extendedindustrystandardarchitecture,简称eisa)总线等。所述总线614可以分为地址总线、数据总线、控制总线等。为便于表示,图6b中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。上述图6a或图6b所示的设备的具体实现还可以对应参照图1至图5所示实施例的相应描述,此处不再赘述。结合本发明实施例公开内容所描述的方法或者算法的步骤可以硬件的方式来实现,也可以是由处理器执行软件指令的方式来实现。软件指令可以由相应的软件模块组成,软件模块可以被存放于随机存取存储器(英文:randomaccessmemory,ram)、闪存、只读存储器(英文:readonlymemory,rom)、可擦除可编程只读存储器(英文:erasableprogrammablerom,eprom)、电可擦可编程只读存储器(英文:electricallyeprom,eeprom)、寄存器、硬盘、移动硬盘、只读光盘(cd-rom)或者本领域熟知的任何其它形式的存储介质中。一种示例性的存储介质耦合至处理器,从而使处理器能够从该存储介质读取信息,且可向该存储介质写入信息。当然,存储介质也可以是处理器的组成部分。处理器和存储介质可以位于asic中。另外,该asic可以位于网络设备中。当然,处理器和存储介质也可以作为分立组件存在于设备中。本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。而前述的存储介质包括:rom、ram、磁碟或者光盘等各种可以存储程序代码的介质。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1