1.本说明书涉及互联网技术领域,尤其涉及一种基于解释执行的代码的调试方法、装置以及设备。
背景技术:2.一份程序或者应用在上线前,通常都需要对该程序所对应的代码进行各种调试以确保其运行正常。在当前对于代码的调试过程中,经常采用预先在需要调试的代码中注入用于调试的钩子函数,通过钩子函数来完成诸如断点、逐行执行、读取内存变量以及修改变量等调试基本操作。由于需要提前向代码中注入钩子函数,一方面影响了代码的编译性能,同属也增大了代码的体积。
3.基于此,需要一种更为便利的代码的调试方案。
技术实现要素:4.本说明书一个或多个实施例提供一种基于解释执行的代码的调试方法,用以解决如下技术问题:需要一种更为便利的代码的调试方案。
5.为解决上述技术问题,本说明书一个或多个实施例是这样实现的:
6.在第一方面,本说明书实施例提供一种基于解释执行的代码的调试方法,包括:接收包含中断点位置的调试指令;解释执行所述调试指令所对应的待执行代码;确认执行过程中代码的位置是否匹配所述中断点位置,当匹配时,中断对所述待执行代码的解释执行,获取中断时的上下文信息并发送至所述调试指令的发送方。
7.在第二方面,本说明书实施例提供一种基于解释执行的代码的调试装置,包括:接收模块,接收包含中断点位置的调试指令;执行模块,解释执行所述调试指令所对应的待执行代码;中断模块,确认执行过程中代码的位置是否匹配所述中断点位置,当匹配时,中断对所述待执行代码的解释执行,获取中断时的上下文信息并发送至所述调试指令的发送方。
8.在第三方面,本说明书实施例提供一种电子设备,包括:
9.至少一个处理器;以及,
10.与所述至少一个处理器通信连接的存储器;其中,
11.所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行如第一方面所述的方法。
12.在第四方面,本说明书实施例提供一种非易失性计算机存储介质存储有计算机可执行指令,当计算机读取存储介质中的计算机可执行指令后,该指令使得一个或多个处理器执行如第一方面所述的方法。
13.本说明书一个或多个实施例采用的上述至少一个技术方案能够达到以下有益效果:通过接收包含中断点位置的调试指令;解释执行所述调试指令所对应的待执行代码;确认执行过程中代码的位置是否匹配所述中断点位置,当匹配时,中断对所述待执行代码的
解释执行,获取中断时的上下文信息并发送至所述调试指令的发送方。从而实现基于解释执行的方式,规避了传统调试方法带来的额外处理开销及代码体积膨胀问题,极大地提升了代码编译速度、降低了代码体积,更为便利。
附图说明
14.为了更清楚地说明本说明书实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本说明书中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
15.图1为当前技术中对于代码的调试的示意图;
16.图2为本说明书实施例所提供的一种基于解释执行的代码的调试方法的流程示意图;
17.图3为本说明书实施例所提供的一种远程调试的示意图;
18.图4为本说明书实施例所提供的一种抽象语法树的示意图;
19.图5为本说明书实施例提供的一种基于解释执行的代码的调试装置的结构示意图;
20.图6为本说明书实施例提供的一种电子设备的结构示意图。
具体实施方式
21.本说明书实施例提供一种基于解释执行的代码的调试方法、装置、设备以及存储介质。
22.为了使本技术领域的人员更好地理解本说明书中的技术方案,下面将结合本说明书实施例中的附图,对本说明书实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本技术一部分实施例,而不是全部的实施例。基于本说明书实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都应当属于本技术保护的范围。
23.在当前对于代码的调试方式中,经常需要远程调试。即通过服务端对消费者客户端中所涉及的代码进行调试,此时为了获取相应的调试数据,通常采用的是插桩调试方案。即预先在需要执行的代码中注入用于调试的钩子函数,当调试器执行到指定代码时,通过对应的钩子函数返回当前执行上下文的信息,从而进行调试。以javascript应用所对应的代码为例,如图1所示,图1为当前技术中对于代码的调试的示意图。其主要流程如下:
24.1,对原始javascript应用进行静态分析,得到每个声明级语句调试点需要进行插桩,的位置和每个作用域内的变量;
25.2,对原始javascript应用的javascript代码进行插桩,即对应的调试钩子函数注入。插桩后得到可调式的web应用;
26.3,将可调式web应用运行,被插桩部分的逻辑会与调试服务器进行双向通信,进而可以根据调试服务器的控制指令完成断点、逐行执行、读取内存变量、修改变量等调试基本操作。
27.在上述方式中,由于需要提前插入钩子函数,因此,需要对代原始码进行插桩处
理,在影响编代码的编译性能的同时,也增大了代码的体积。基于此,本说明书实施例提供一种更为便利的代码的调试方案。
28.如图2所示,图2为本说明书实施例所提供的一种基于解释执行的代码的调试方法的流程示意图,包括以下步骤:
29.s201:接收包含中断点位置的调试指令。
30.在本说明书实施例中,对于程序代码的调试可以是发生在消费用户的客户端中。例如,被调试对象可以是在用户应用中的小程序代码或者超文本标记语言h5代码。服务端可以挑选出部分客户端进行相应的调试。调试是指读取程序执行中的状态信息,以隔离、消除的方式对错误进行定位,确定错误产生的原因并提出纠正错误的解决办法。
31.调试方可以通过自己的前端设备向服务端输入中断点位置,并通过服务端发送包含中断点位置的调试指令至前述消费者的客户端中。
32.中断点位置用于指示在执行过程中应当发生中断的代码的位置。例如,其形式可以是“第5行,第1列”,或者,“第xx块的起始行或者结束行”等等。调试指令中包含的中断点位置可以是一个也可以是多个。
33.s203,解释执行所述调试指令所对应的待执行代码。
34.在本说明书实施例中,解释执行指的是释器实时执行待执行代码,其中,待执行代码应当是基于解释型语言(interpreted language)所编写。
35.解释型语言是一种编程语言类型。这种类型的编程语言,会将代码一句一句直接执行,不需要像编译语言(compiled language)一样,经过编译器先行编译为机器代码,之后再执行。解释型语言需要利用解释器,在执行期,动态将代码逐句解释(interpret)为机器代码,或是已经预先编译为机器代码的子程序,之后再执行。
36.例如,orcale java、javascript、python以及shell等等均为前述的解释型语言。其中,orcale java是将java源码先编译成java的字节码,也就是.class文件,这里有个编译的动作,然后将字节码装载到jvm中,逐条解释执行。python同样也是如此,先将python源码编译成字节码,有可能存到.pyc的字节码文件中,然后由解释器来解释执行字节码。javascript早期则是将源码编译成抽象语法树(abstract syntax tree,ast),然后直接执行抽象语法树。
37.s205,确认执行过程中代码的位置是否匹配所述中断点位置,当匹配时,中断对所述待执行代码的解释执行,获取中断时的上下文信息并发送至所述调试指令的发送方
38.解释器在逐条解释执行代码的过程中则每执行一条代码就对比该代码的位置和前述中断点位置是否匹配。例如,假设中断点位置为如下行列号集合{(4,1),(4,5),(7,3)},则解释器在执行到第4行第1列的代码、第4行第5列的代码以及第7行第3列的代码时将会发生中断。
39.当发生匹配时,即中断对所述待执行代码的解释执行。此处的中断执行即为暂停执行。发生中断执行时即可以向服务端发出命中中断点位置的通知信息,获取中断时的上下文信息并发送至所述调试指令的发送方。
40.调试过程中的上下文(context)信息是调试中所必不可少的一组数据。这些数据允许调试中断,在这之后被中断的程序仍可在同一个地方继续执行。
41.以javascript为例,在发生中断时,解释器可以通过维护作用域,以提供调试所需
要的基本信息。作用域对象的基本接口包括诸如parrent、context、find以及var/let/const等等各类接口。其中,parrent接口指向父作用域,形成作用域链;context用于指示包含当前作用域下声明的标志符、find用于进行沿作用域链的标志符查找;以及var、let、const分别进行不同的作用域声明。
42.通过维护前述的作用域,提供中断时的上下文信息,以及,还可以将中断时所产生的相关调试信息发生至服务端进行相应的调试。
43.通过接收包含中断点位置的调试指令;解释执行所述调试指令所对应的待执行代码;确认执行过程中代码的位置是否匹配所述中断点位置,当匹配时,中断对所述待执行代码的解释执行,获取中断时的上下文信息并发送至所述调试指令的发送方。从而实现基于解释执行的方式,规避了传统调试方法带来的额外处理开销及代码体积膨胀问题,极大地提升了代码编译速度、降低了代码体积,更为便利。
44.在一种实施例中,在对一个中断点的调试结束之后,则代码需要继续执行。此时,调试方即可以仍然通过服务端发起释放断点指令。客户端中的解释器在接收到所述释放断点指令之后,即可以结束待执行代码的中断状态,并继续对中断点位置之后的代码进行解释执行。
45.解释器在释放中断点时,由于中断时所对应的上下文信息已经被预先获取并维护,因此,可以基于中断时的上下文继续执行待执行代码,从而保持了调试过程中代码执行的稳定性。
46.如图3所示,图3为本说明书实施例所提供的一种远程调试的示意图。解释器在解释执行过程中查询是否匹配中断点,一旦匹配上级中断执行,并通过服务端向调试方发送相关通知,由调试方进行调试。对于该中断点的调试完成后,调试方可以手动操作释放中断点,解释器继续执行代码。
47.在一种实施例中,若待执行代码是由javascript所编写,则解释器在执行所述待执行代码需要首先对代码进行解析,得到抽象语法树,其中,所述抽象语法树包括多个节点,然后遍历式的解释执行所述抽象语法树的节点;相应的,确认是否匹配所述中断点位置所对应的代码,包括:针对任一待执行的节点,确认该节点是否匹配所述中断点位置。
48.具体而言,在执行所述抽象语法树的节点时,可以从抽象语法树根节点访问抽象语法树,然后按照预设规范(例如,基于欧洲计算机制造商协会(european computer manufacturers association,ecma规范))遍历式的解释执行所述抽象语法树的节点。
49.对于不同类型的节点而言,实现各自的处理函数,对节点的遍历顺序由每个节点类型的在所述预设规范中决定。例如,对于代码:
50.function a(){}
51.a()
52.其对应的ast的可视化结构如图4所示,图4为本说明书实施例所提供的一种抽象语法树的示意图。其中包含了program节点。对于该类型节点会基于前述的ecma规范要求按顺序访问他的每个子节点,即先访问functiondeclaration,再访问expressionstatement。对于callexpression节点,会先计算其callee属性,此例为一个identifier类型的节点,即访问这个节点,从作用域中取得标志符“a”对应的值并返回,回到callexpresison内会继续计算其arguments属性,此例函数a调用没有传参因此为空,最终调用“a”值并返回结果。通
过该方式在解释执行的过程中实现稳定准确的解释执行。
53.在一种实施例中,对于中断点位置采用行列号的形式进行标注。例如,调试方用户在前端增加中断点,调试器前端发出增加断点的调试指令,指令中包含断点位置的行列号,其中,中断点位置所对应的伪码可能如下:
54.{
[0055]“唯一地址”:“https://localhost/index.js”,
[0056]“行编号”:3,
[0057]“列编号”:0
[0058]
}。
[0059]
将第3行第0列确定为中断点位置。相应的,解释器在基于前述emca规范执行各节点时,需要确认该节点是否匹配所述中断点位置时,即需要从抽象语法树中获取所述抽象语法树所包含的行列号信息,从所述行列号信息中获取所述该节点所对应的行列号;进而确定所述该节点所对应的行列号是否匹配所述表征代码位置的行列号。
[0060]
换言之,解释器遍历执行ast中的各节点,每次访问一个新的节点则会查询是否有已经存在的中断点位置,由于ast是携带行列号信息的,因此可以和inspector内的断点行列号进行匹配,如有匹配的上的则认为当前语句上命中断点,则停止语句的继续执行,即进行中断。
[0061]
在一种实施例中,调试中在匹配上中断点并中止执行代码时,需要让整个程序的执行上下文进入暂停执行(pause)状态。在实际场景中,由于还可能存在其它的外部代码。这些外部代码的执行可能会改变中断时的上下文信息。
[0062]
例如,在支付应用对小程序的h5代码进行调试时,h5页面中可能还存在其它的外部代码需要执行,而这部分代码的执行是有可能依赖或者影响所述上下文信息执行,例如,外部代码可能是方基于所述上下文信息向第三方发起调用或者请求远程服务等等,这些外部代码的执行都有可能与本方案前述的待执行代码发生互相调用,这就有可能改变上下文信息,而引起调试异常。
[0063]
基于此,为更准确得控制执行流,在调试中若发现有外部代码需要执行,则可以确定外部代码执行方,进而基于所述上下文信息向所述外部代码执行方发起同步调用。通过同步调用从而可以导致前述外部代码的执行被阻塞,避免上下文信息发生变化。
[0064]
具体而言,基于所述上下文信息向所述外部代码执行方发起同步调用时,可以定所述待执行代码所采用的浏览器;通过所述浏览器的标准函数集接口向所述外部代码执行方发起同步调用。例如,浏览器的标准函数集接口可以是该浏览器的同步的xmlhttprequest api接口,实现中断后的上下文信息的暂停执行
[0065]
本技术的方案可以运行在任意的远程调试的场景中。例如待执行代码包括应用于客户端中的小程序代码或者超文本标记语言h5代码;相应的,所述调试指令的发送方包括所述客户端所对应的服务端。调试方可以将调试协议通过网络发送到调试器前端(即消费者的客户端)。调试过程中依赖于宿主上下文提供的网络接口进行请求,如浏览器内的websocket,node.js监控内的net module等等。因此,在针对不同的平台进行调试时,需要调用不同的api,因此为可以各平台打包出各自的调试包文件即可广泛使用。
[0066]
基于同样的思路,本说明书一个或多个实施例还提供了上述方法对应的装置和设
备,如图5、图6所示。
[0067]
在第二方面,如图5所示,图5为本说明书实施例提供的一种基于解释执行的代码的调试装置的结构示意图,所述装置包括:
[0068]
接收模块501,接收包含中断点位置的调试指令;
[0069]
执行模块503,解释执行所述调试指令所对应的待执行代码;
[0070]
中断模块505,确认执行过程中代码的位置是否匹配所述中断点位置,当匹配时,中断对所述待执行代码的解释执行,获取中断时的上下文信息并发送至所述调试指令的发送方。
[0071]
可选地,所述执行模块503,确定所述代码所对应的抽象语法树,其中,所述抽象语法树包括多个节点;遍历式的解释执行所述抽象语法树的节点;相应的,所述中断模块505,针对任一待执行的节点,确认该节点是否匹配所述中断点位置。
[0072]
可选地,在所述装置中,所述中断点位置为表征代码位置的行列号;相应的,所述中断模块505,获取所述抽象语法树所包含的行列号信息,从所述行列号信息中获取所述该节点所对应的行列号;确定所述该节点所对应的行列号是否匹配所述表征代码位置的行列号。
[0073]
可选地,在所述装置还包括释放模块507,接收所述调试指令的发送方所发送的释放断点指令;执行模块503,从所述中断点位置起,根据所述上下文信息继续执行所述待执行代码。
[0074]
可选地,所述装置还包括阻塞模块509,确定外部代码执行方,其中,所述外部代码执行方基于所述上下文信息执行外部代码,基于所述上下文信息向所述外部代码执行方发起同步调用。
[0075]
可选地,所述阻塞模块509,确定所述待执行代码所采用的浏览器;通过所述浏览器的标准函数集接口向所述外部代码执行方发起同步调用。
[0076]
可选地,所述执行模块503,从所述抽象语法树的根节点开始,基于预设规范遍历式的解释执行所述抽象语法树的节点。
[0077]
可选地,在所述装置中,所述待执行代码包括应用于客户端中的小程序代码或者超文本标记语言h5代码;相应的,所述调试指令的发送方包括所述客户端所对应的服务端。
[0078]
在第三方面,如图6所示,图6为本说明书实施例提供的一种电子设备的结构示意图,所述设备包括:
[0079]
至少一个处理器;以及,
[0080]
与所述至少一个处理器通信连接的存储器;其中,
[0081]
所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行如第一方面所述的方法。
[0082]
在第四方面,基于同样的思路,本说明书实施例还提供了对应于上述方法的一种非易失性计算机存储介质,存储有计算机可执行指令,当计算机读取存储介质中的计算机可执行指令后,该指令使得一个或多个处理器执行如第一方面所述的方法。
[0083]
在20世纪90年代,对于一个技术的改进可以很明显地区分是硬件上的改进(例如,对二极管、晶体管、开关等电路结构的改进)还是软件上的改进(对于方法流程的改进)。然而,随着技术的发展,当今的很多方法流程的改进已经可以视为硬件电路结构的直接改进。
设计人员几乎都通过将改进的方法流程编程到硬件电路中来得到相应的硬件电路结构。因此,不能说一个方法流程的改进就不能用硬件实体模块来实现。例如,可编程逻辑器件(programmable logic device,pld)(例如现场可编程门阵列(field programmable gate array,fpga))就是这样一种集成电路,其逻辑功能由用户对器件编程来确定。由设计人员自行编程来把一个数字系统“集成”在一片pld上,而不需要请芯片制造厂商来设计和制作专用的集成电路芯片。而且,如今,取代手工地制作集成电路芯片,这种编程也多半改用“逻辑编译器(logic compiler)”软件来实现,它与程序开发撰写时所用的软件编译器相类似,而要编译之前的原始代码也得用特定的编程语言来撰写,此称之为硬件描述语言(hardware description language,hdl),而hdl也并非仅有一种,而是有许多种,如abel(advanced boolean expression language)、ahdl(altera hardware description language)、confluence、cupl(cornell university programming language)、hdcal、jhdl(java hardware description language)、lava、lola、myhdl、palasm、rhdl(ruby hardware description language)等,目前最普遍使用的是vhdl(very-high-speed integrated circuit hardware description language)与verilog。本领域技术人员也应该清楚,只需要将方法流程用上述几种硬件描述语言稍作逻辑编程并编程到集成电路中,就可以很容易得到实现该逻辑方法流程的硬件电路。
[0084]
控制器可以按任何适当的方式实现,例如,控制器可以采取例如微处理器或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件或固件)的计算机可读介质、逻辑门、开关、专用集成电路(application specific integrated circuit,asic)、可编程逻辑控制器和嵌入微控制器的形式,控制器的例子包括但不限于以下微控制器:arc 625d、atmel at91sam、microchip pic18f26k20以及silicone labs c8051f320,存储器控制器还可以被实现为存储器的控制逻辑的一部分。本领域技术人员也知道,除了以纯计算机可读程序代码方式实现控制器以外,完全可以通过将方法步骤进行逻辑编程来使得控制器以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种控制器可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。
[0085]
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机。具体的,计算机例如可以为个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。
[0086]
为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本说明书时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
[0087]
本领域内的技术人员应明白,本说明书实施例可提供为方法、系统、或计算机程序产品。因此,本说明书实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本说明书实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。
[0088]
本说明书是参照根据本说明书实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
[0089]
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
[0090]
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
[0091]
在一个典型的配置中,计算设备包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。
[0092]
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flash ram)。内存是计算机可读介质的示例。
[0093]
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
[0094]
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
[0095]
本说明书可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本说明书,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
[0096]
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部
分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置、设备、非易失性计算机存储介质实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
[0097]
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
[0098]
以上所述仅为本说明书的一个或多个实施例而已,并不用于限制本说明书。对于本领域技术人员来说,本说明书的一个或多个实施例可以有各种更改和变化。凡在本说明书的一个或多个实施例的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本说明书的权利要求范围之内。
技术特征:1.一种基于解释执行的代码的调试方法,包括:接收包含中断点位置的调试指令;解释执行所述调试指令所对应的待执行代码;确认执行过程中代码的位置是否匹配所述中断点位置,当匹配时,中断对所述待执行代码的解释执行,获取中断时的上下文信息并发送至所述调试指令的发送方。2.如权利要求1所述的方法,其中,解释执行所述待执行代码,包括:确定所述代码所对应的抽象语法树,其中,所述抽象语法树包括多个节点;遍历式的解释执行所述抽象语法树的节点;相应的,确认是否匹配所述中断点位置所对应的代码,包括:针对任一待执行的节点,确认该节点是否匹配所述中断点位置。3.如权利要求2所述的方法,其中,所述中断点位置为表征代码位置的行列号;相应的,确认该节点是否匹配所述中断点位置,包括:获取所述抽象语法树所包含的行列号信息,从所述行列号信息中获取所述该节点所对应的行列号;确定所述该节点所对应的行列号是否匹配所述表征代码位置的行列号。4.如权利要求1所述的方法,还包括:接收所述调试指令的发送方所发送的释放断点指令;从所述中断点位置起,根据所述上下文信息继续执行所述待执行代码。5.如权利要求1所述的方法,其中,所述方法还包括:确定外部代码执行方,其中,所述外部代码执行方基于所述上下文信息执行外部代码;基于所述上下文信息向所述外部代码执行方发起同步调用。6.如权利要求4所述的方法,其中,基于所述上下文信息向所述外部代码执行方发起同步调用,包括:确定所述待执行代码所采用的浏览器;通过所述浏览器的标准函数集接口向所述外部代码执行方发起同步调用。7.如权利要求2所述的方法,其中,遍历式的解释执行所述抽象语法树的节点,包括:从所述抽象语法树的根节点开始,基于预设规范遍历式的解释执行所述抽象语法树的节点。8.如权利要求1所述的方法,其中,所述待执行代码包括应用于客户端中的小程序代码或者超文本标记语言h5代码;相应的,所述调试指令的发送方包括所述客户端所对应的服务端。9.一种基于解释执行的代码的调试装置,包括:接收模块,接收包含中断点位置的调试指令;执行模块,解释执行所述调试指令所对应的待执行代码;中断模块,确认执行过程中代码的位置是否匹配所述中断点位置,当匹配时,中断对所述待执行代码的解释执行,获取中断时的上下文信息并发送至所述调试指令的发送方。10.一种电子设备,包括:至少一个处理器;以及,与所述至少一个处理器通信连接的存储器;其中,
所述存储器存储有可被所述至少一个处理器执行的指令,所所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行如权利要求1至8任一项所述的方法。
技术总结本说明书实施例公开了一种基于解释执行的代码的调试方法、装置以及设备。通过接收包含中断点位置的调试指令;解释执行所述调试指令所对应的待执行代码;确认执行过程中代码的位置是否匹配所述中断点位置,当匹配时,中断对所述待执行代码的解释执行,获取中断时的上下文信息并发送至所述调试指令的发送方。从而实现基于解释执行的方式,规避了传统调试方法带来的额外处理开销及代码体积膨胀问题。带来的额外处理开销及代码体积膨胀问题。带来的额外处理开销及代码体积膨胀问题。
技术研发人员:曾家龙 郭祥 郁森
受保护的技术使用者:支付宝(杭州)信息技术有限公司
技术研发日:2022.07.25
技术公布日:2022/11/1