CN114625660A - 调试方法及装置 - Google Patents
调试方法及装置 Download PDFInfo
- Publication number
- CN114625660A CN114625660A CN202210286721.8A CN202210286721A CN114625660A CN 114625660 A CN114625660 A CN 114625660A CN 202210286721 A CN202210286721 A CN 202210286721A CN 114625660 A CN114625660 A CN 114625660A
- Authority
- CN
- China
- Prior art keywords
- debugging
- bytecode
- javascript
- devtools
- communication protocol
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 68
- 238000004891 communication Methods 0.000 claims abstract description 72
- 238000013515 script Methods 0.000 claims abstract description 36
- 238000012545 processing Methods 0.000 claims description 6
- 230000006870 function Effects 0.000 description 39
- 238000011161 development Methods 0.000 description 6
- 238000010586 diagram Methods 0.000 description 4
- 238000004590 computer program Methods 0.000 description 3
- 230000000694 effects Effects 0.000 description 3
- 230000003287 optical effect Effects 0.000 description 2
- VYZAMTAEIAYCRO-UHFFFAOYSA-N Chromium Chemical compound [Cr] VYZAMTAEIAYCRO-UHFFFAOYSA-N 0.000 description 1
- 230000005540 biological transmission Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000002093 peripheral effect Effects 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
- 238000012360 testing method Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3624—Software debugging by performing operations on the source code, e.g. via a compiler
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3644—Software debugging by instrumenting at runtime
Abstract
本申请实施例提供调试方法及装置,应用于嵌入式设备上的JavaScript引擎,该引擎中配置有调试器模块,调试器模块中封装有与DevTools通信的通信协议;其中,该引擎中注入有单步调试功能;其方法包括:获取JavaScript脚本,并编译JavaScript脚本中的JavaScript代码,得到至少一个字节码;根据至少一个字节码,通过通信协议,确定是否检测到调试信息,调试信息是通过DevTools确定的;若确定检测到调试信息,则根据单步调试功能,运行当前的字节码。解决了现有技术对于在嵌入式设备上,无法便捷有效地进行JavaScript代码的调试,同时无法实时查看程序运行状态。
Description
技术领域
本申请实施例涉及计算机技术领域,尤其涉及一种调试方法及装置。
背景技术
在嵌入式设备上,使用JavaScript语言来开发越来越普及,业界也有了一些针对嵌入式领域的JavaScript引擎(即是一个专门处理JavaScript脚本的虚拟机),如:物联网JavaScript引擎(如JerryScript)、精简的嵌入式JavaScript引擎(如Duktape)、轻量且可嵌入的JavaScript引擎(如QuickJS)等。
目前,普遍采用的是使用console.log方式,在控制台中查看程序运行中输出的日志来判断JavaScript程序运行状态。该方式需要通过修改代码的方式,增加日志(log)打印,并更新到设备上运行,并且无法查看程序运行到某个点时候的栈帧状态。
因此,现有技术的调试方式,对于在嵌入式设备上,无法便捷有效地进行JavaScript代码的调试,同时无法实时查看程序运行状态。
发明内容
本申请实施例提供一种调试方法及装置,以解决现有技术对于在嵌入式设备上,无法便捷有效地进行JavaScript代码的调试,同时无法实时查看程序运行状态。
第一方面,本申请实施例提供一种调试方法,应用于嵌入式设备上的JavaScript引擎,所述JavaScript引擎中配置有调试器模块,所述调试器模块中封装有与调试工具DevTools通信的通信协议;其中,所述JavaScript引擎中注入有单步调试功能;所述方法包括:
获取JavaScript脚本,并编译所述JavaScript脚本中的JavaScript代码,得到至少一个字节码;
根据所述至少一个字节码,通过所述通信协议,确定是否检测到用于表示调试当前待运行的字节码的调试信息,所述调试信息是通过所述DevTools确定的;
若确定检测到所述调试信息,则根据所述单步调试功能,运行当前的所述字节码。
可选的,所述根据所述至少一个字节码,通过所述通信协议,确定是否检测到用于表示调试当前待运行的字节码的调试信息,包括:
根据所述至少一个字节码,确定各个操作码;
从各个所述操作码中确定当前待执行的目标操作码,执行下述步骤:
从所述至少一个字节码中确定与所述目标操作码对应的目标字节码,将所述目标字节码作为所述当前待运行的字节码;
根据所述目标字节码,通过所述通信协议,确定是否检测到所述调试信息;
其中,所述目标操作码为任一个所述操作码。
可选的,所述根据所述目标字节码,通过所述通信协议,确定是否检测到所述调试信息,包括:
根据所述目标字节码,通过所述通信协议确定所述JavaScript代码中当前运行步骤所指的代码语句,所述代码语句中包含所述目标字节码;
根据所述通信协议,检测所述DevTools中是否在所述代码语句中有断点或所述DevTools中是否存在用于表示暂停的点击操作;
若有断点或存在用于表示暂停的点击操作,则确定检测到所述调试信息。
可选的,所述断点是用户通过在所述DevTools中点击代码语句的操作生成的;
所述根据所述通信协议,检测所述DevTools中是否在所述代码语句中有断点,包括:
通过所述通信协议,若所述DevTools中存在点击代码语句的操作,则确定检测到所述DevTools中的所述代码语句中有断点。
可选的,在所述运行当前的所述字节码之后,所述方法还包括:
生成当前的所述字节码对应的栈帧信息;
根据所述通信协议,将所述栈帧信息发送至所述DevTools,以使所述DevTools根据所述栈帧信息,在所述DevTools对应的界面上显示当前的所述字节码对应的运行状态。
可选的,所述方法还包括:
在运行当前的字节码之后,若根据所述通信协议,检测到所述DevTools中存在用于表示下一步或继续的点击操作时,则从各个所述操作码中确定下一个目标操作码;
将下一个目标操作码作为当前待执行的目标操作码。
可选的,所述若确定检测到所述调试信息,则根据所述单步调试功能,运行当前的所述字节码,包括:
若检测到所述DevTools中存在断点或用于表示暂停的点击操作时,则停止运行所述JavaScript脚本,并根据单步调试功能,单步执行当前的所述字节码。
可选的,所述方法还包括:
若检测到所述调试信息时,则通过所述通信协议,向所述DevTools发送事件通知。
可选的,所述获取JavaScript脚本,包括:
查找是否存在待执行的所述JavaScript脚本,若存在,则获取所述JavaScript脚本。
第二方面,本申请实施例提供一种调试装置,应用于嵌入式设备上的JavaScript引擎,所述JavaScript引擎中配置有调试器模块,所述调试器模块中封装有与调试工具DevTools通信的通信协议;其中,所述JavaScript引擎中注入有单步调试功能;所述装置包括:
获取JavaScript脚本,并编译所述JavaScript脚本中的JavaScript代码,得到至少一个字节码;
根据所述至少一个字节码,通过所述通信协议,确定所述调试器模块是否检测到用于表示调试当前待运行的字节码的调试信息,所述调试信息是通过所述DevTools确定的;
若确定所述调试器模块检测到所述调试信息,则根据所述单步调试功能,运行当前的所述字节码。
本申请实施例提供的调试方法及装置,该方法应用于嵌入式设备上的JavaScript引擎,所述JavaScript引擎中配置有调试器模块,所述调试器模块中封装有与调试工具DevTools通信的通信协议;其中,所述JavaScript引擎中注入有单步调试功能。通过获取JavaScript脚本,并编译所述JavaScript脚本中的JavaScript代码,得到至少一个字节码,然后根据所述至少一个字节码,通过所述通信协议,确定是否检测到用于表示调试当前待运行的字节码的调试信息,所述调试信息是通过所述DevTools确定的,通过向嵌入式设备上的JavaScript引擎注入调试器模块,并且在调试器模块中配置通信协议与DevTools通信,进而使得嵌入式设备上的JavaScript引擎具备调试功能;若确定检测到所述调试信息,则根据所述单步调试功能,运行当前的所述字节码。因此,通过借助DevTools的调试功能,在无需修改JavaScript代码的情况下,即可允许开发者进行嵌入式设备上进行真机单步调试,便捷有效地实现了调试嵌入式设备上的JavaScript引擎的JavaScript代码,并且基于DevTools的特点以及单步调试功能,可以实时查看程序运行状态。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本申请实施例提供的调试方法的流程示意图;
图2为本申请另一实施例提供的调试方法的流程示意图;
图3为本申请实施例提供的调试装置的结构示意图;
图4为本申请实施例提供的电子设备的硬件结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例还能够包括除了图示或描述的那些实例以外的其他顺序实例。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
目前,普遍采用的是使用console.log方式,在控制台中查看程序运行中输出的日志来判断JavaScript程序运行状态。该方式需要通过修改代码的方式,增加log打印,并更新到设备上运行,并且无法查看程序运行到某个点时候的栈帧状态。因此,现有技术的调试方式,对于在嵌入式设备上,无法便捷有效地进行JavaScript代码的调试,同时无法实时查看程序运行状态。
为了解决上述问题,本申请的发明构思为:在嵌入式设备的JavaScript引擎中注入调试器模块以及单步调试功能,并在调试器模块中注入与调试工具DevTools通信的通信协议,然后通过通信协议,基于调试工具DevTools,在无需修改JavaScript代码的情况下,即可允许进行嵌入式设备上进行真机单步调试,可以插入断点,抓取栈帧信息,实时查看程序运行状态。
下面以具体实施例对本申请的技术方案进行详细说明。下面这几个具体的实施例可以相互结合,对于相同或相似的概念或过程可能在某些实施例不再赘述。
本申请实施例提供的调试方法,可以应用于嵌入式设备,可以在该嵌入式设备上使用不同的开发语言进行开发并实现便捷有效地进行开发语言的代码调试,同时能够实时查看程序运行状态。其中,该调试方法应用于嵌入式设备上的目标引擎,该目标引擎可以为开发语言运行的任一引擎,所述目标引擎中配置有调试器模块,所述调试器模块中封装有与调试工具DevTools通信的通信协议(比如WebSocket协议);其中,所述目标引擎中注入有单步调试功能。
具体地,获取开发语言对应的脚本,并编译所述脚本中的代码,得到至少一个字节码;根据所述至少一个字节码,通过所述通信协议,确定是否检测到用于表示调试当前待运行的字节码的调试信息,所述调试信息是通过所述DevTools确定的;若确定检测到所述调试信息,则根据所述单步调试功能,运行当前的所述字节码。下述以JavaScript为例,对调试方法进行详细说明。
图1为本申请实施例提供的调试方法的流程示意图,本实施例的方法可以由嵌入式设备上的JavaScript引擎执行,本实施例的方法应用于嵌入式JavaScript代码调试的场景,具体地,该调试方法应用于嵌入式设备上的JavaScript引擎,所述JavaScript引擎中配置有调试器模块,所述调试器模块中封装有与调试工具DevTools通信的通信协议。其中,DevTools是一套内置于浏览器中的Web开发和调试工具。如图1所示,本实施例的方法,可以包括:
S101、获取JavaScript脚本,并编译所述JavaScript脚本中的JavaScript代码,得到至少一个字节码。
本实施例中,首先启动JavaScript引擎,并初始化JavaScript引擎,执行获取到的某个JavaScript脚本。在实际应用中,JavaScript脚本在JavaScript引擎内,不是以一个文本的方式执行的,JavaScript引擎是把JavaScript脚本解析成一个个字节码,形成字节码集合。
可选的,获取JavaScript脚本,可以通过以下步骤实现:
查找是否存在待执行的所述JavaScript脚本,若存在,则获取所述JavaScript脚本。
本实施例中,初始化JavaScript引擎后,首先要查找是否存在可执行的JavaScript脚本,若存在,则执行该JavaScript脚本。
S102、根据所述至少一个字节码,通过所述通信协议,确定是否检测到用于表示调试当前待运行的字节码的调试信息,所述调试信息是通过所述DevTools确定的。
其中,这里的通信协议可以是WebSocket协议,是基于传输控制协议(Transmission Control Protocol,TCP)的一种新的网络协议(基于TCP的全双工通信协议)。
本实施例中,解析到的字节码可能有很多的操作,即从字节码中可以获取相应的操作码,操作码为至少一个。其中,字节码是代码逻辑,操作码是字节码类型。比如字节码是a+b,操作码是+。其中,JavaScript代码在JavaScript引擎运行的过程中,遍历这些操作码。
具体地,通过通信协议,从DevTools中检测是否有调试信息,比如是否有断点或是暂停操作,若有断点或是暂停操作,则将有断点或是暂停操作作为调试信息,说明DevTools主动发起了调试请求,即可暂停JavaScript代码在JavaScript引擎中运行。
S103、若确定检测到所述调试信息,则根据所述单步调试功能,运行当前的所述字节码。
本实施例中,若确定检测到所述调试信息,则通过单步调试功能,一步一步地执行代码逻辑。其中,单步调试功能是在程序开发中采用的一种调试手段,一步一步跟踪程序执行的流程,根据栈帧变量的值,找到错误的原因。
本申请提供的调试方法,该方法应用于嵌入式设备上的JavaScript引擎,所述JavaScript引擎中配置有调试器模块,所述调试器模块中封装有与调试工具DevTools通信的通信协议;其中,所述JavaScript引擎中注入有单步调试功能。通过获取JavaScript脚本,并编译所述JavaScript脚本中的JavaScript代码,得到至少一个字节码,然后根据所述至少一个字节码,通过所述通信协议,确定是否检测到用于表示调试当前待运行的字节码的调试信息,所述调试信息是通过所述DevTools确定的,通过向嵌入式设备上的JavaScript引擎注入调试器模块,并且在调试器模块中配置通信协议与DevTools通信,进而使得嵌入式设备上的JavaScript引擎具备调试功能;若确定检测到所述调试信息,则根据所述单步调试功能,运行当前的所述字节码。因此,通过借助DevTools的调试功能,在无需修改JavaScript代码的情况下,即可允许开发者进行嵌入式设备上进行真机单步调试,便捷有效地实现了调试嵌入式设备上的JavaScript引擎的JavaScript代码,并且基于DevTools的特点以及单步调试功能,可以实时查看程序运行状态。
可选的,根据所述至少一个字节码,通过所述通信协议,确定是否检测到用于表示调试当前待运行的字节码的调试信息,可以通过以下步骤实现:
步骤a1、根据所述至少一个字节码,确定各个操作码。
步骤a2、从各个所述操作码中确定当前待执行的目标操作码,执行下述步骤:
步骤a21、从所述至少一个字节码中确定与所述目标操作码对应的目标字节码,将所述目标字节码作为所述当前待运行的字节码;
步骤a22、根据所述目标字节码,通过所述通信协议,确定是否检测到所述调试信息;
其中,所述目标操作码为任一个所述操作码。
本实施例中,解析成字节码后,这些字节码中可能涉及到多个操作码,在JavaScript引擎运行的过程中,去遍历这些操作码。首先,选择操作码,确定该操作码对应的是个什么操作即选择的操作码对应的字节码,比如是一个加操作、减操作或是乘法操作等。不同的字节码会对应的到JavaScript引擎里面不同的执行函数。然后每次执行一个字节码的时候,通过通信协议检测DevTools中是否有断点或是暂停操作。这里的断点或暂停操作可以作为调试信息。
可选的,本实施例在上述实施例的基础上,如何确定检测到调试信息进行了详细说明。根据所述目标字节码,通过所述通信协议,确定是否检测到所述调试信息,可以通过以下步骤实现:
步骤b1、根据所述目标字节码,通过所述通信协议,确定所述JavaScript代码中当前运行步骤所指的代码语句,所述代码语句中包含所述目标字节码。
步骤b2、根据所述通信协议,检测所述DevTools中是否在所述代码语句中有断点或所述DevTools中是否存在用于表示暂停的点击操作。
步骤b3、若有断点或存在用于表示暂停的点击操作,则确定检测到所述调试信息。
本实施例中,在JavaScript引擎运行的过程中,在DevTools的界面上显示包含字节码的代码语句,该代码语句中可能包含至少一个字节码。若JavaScript引擎通过通信协议检测到DevTools中显示的包含有目标字节码的代码语句所在位置处含有断点,或者检测到用户点击DevTools中的暂停按钮,则说明JavaScript引擎检测到DevTools发起的调试请求。这里的用户可以是调试人员,在此不做具体限定。
可选的,根据所述通信协议,检测所述DevTools中是否在所述代码语句中有断点,可以通过以下步骤实现:
通过所述通信协议,若所述DevTools中存在点击代码语句的操作,则确定检测到所述DevTools中的所述代码语句中有断点。
其中,所述断点是用户通过在所述DevTools中点击代码语句的操作生成的。
可选的,若确定检测到所述调试信息,则根据所述单步调试功能,运行当前的所述字节码,可以包括以下步骤:
若检测到所述DevTools中存在断点或用于表示暂停的点击操作时,则停止运行所述JavaScript脚本,并根据单步调试功能,单步执行当前的所述字节码。
本实施例中,基于DevTools的特点,当标记断点时,只需在DevTools中显示的代码语句所在位置进行点击即可,当运行到断点所在位置或是在某一位置处点击暂停按钮,则暂停程序。具体地,代码执行到断点位置了,或者调试的人在DevTools的界面上主动点击暂停,程序都会停住;然后就可以开始单步往下执行。能够实时查看程序运行状态,插入断点,抓取栈帧信息。
可选的,在所述运行当前的所述字节码之后,所述方法还可以通过以下步骤实现:
步骤c1、生成当前的所述字节码对应的栈帧信息。
步骤c2、根据所述通信协议,将所述栈帧信息发送至所述DevTools,以使所述DevTools根据所述栈帧信息,在所述DevTools对应的界面上显示当前的所述字节码对应的运行状态。
本实施例中,以在断点处停住的场景为例,DevTools会自动发起请求获取栈帧信息,然后在DevTools的界面上显示出来,让调试的人看到程序运行状态。其中,运行字节码时产生的过程状态,作为栈帧信息,提供给DevTools。运行字节码是在JS引擎中执行,基于栈帧信息显示程序运行状态是在DevTools的界面上显示,用以供调试人员查看。
可选的,所述方法还可以包括以下步骤:
步骤d1、在运行当前的字节码之后,若根据所述通信协议,检测到所述DevTools中存在用于表示下一步或继续的点击操作时,则从各个所述操作码中确定下一个目标操作码;
步骤d2、将下一个目标操作码作为当前待执行的目标操作码。
本实施例中,如果运行字节码后,需要等待调试器模块返回的是否继续执行的指令,比如在DevTools上点击下一步或继续的按钮,则DevTools向JavaScript引擎发起下一步或继续的请求,JavaScript引擎基于通信协议接收到该请求后,执行下一步或继续操作,比如,继续选择下一个操作码,实现上述针对操作码的循环操作。比如,从所述至少一个字节码中确定与该操作码对应的目标字节码,将该目标字节码作为所述当前待运行的字节码,根据该目标字节码,通过所述通信协议,确定是否检测到所述调试信息。
可选的,所述方法还可以包括以下步骤:
若检测到所述调试信息时,则通过所述通信协议,向所述DevTools发送事件通知。
本实施例中,通过通信协议,向所述DevTools发送事件通知,使得所述DevTools执行所述调试信息对应的操作。比如,JavaScript运行到断点位置了,就会通知到DevTools。DevTools执行单步调试的操作。实现了灵活控制,允许开发者在嵌入式设备上进行真机单步调试。
结合图2所示,图2为本申请另一实施例提供的调试方法的流程示意图。嵌入式设备上的,在JS引擎上扩展出来调试器,与chrome浏览器的调试工具DevTools通信。具体地,首先启动,初始化JS引擎(即JavaScript引擎),执行JS脚本(即JavaScript脚本),编译JS为字节码,选择操作码,然后通过调试器(模块)判断是否调试,等待调试器返回用于表示是否调试的结果。其中,调试器是注入到JS引擎里的一个功能模块。在DevTools中,当代码执行到断点位置了,或者调试的人在DevTools的界面(这里可以指JS代码测试界面)上主动点击暂停,都会停住;然后就可以开始单步往下走(可以利用单步调试功能)。在断点处停住的时候,会自动发起请求拿栈帧信息,然后在DevTools的界面上显示出来,让调试的人看到程序运行状态。其中,DevTools具有多种功能(参照图2中的功能区域),比如暂停、继续、单步调试、设置断点等。
其中,step表示单步调试,step包括step into(进入函数)、step out(跳出当前函数栈)以及step over(跳过当前语句)。具体地,step into:单步执行,遇到子函数就进入并且继续单步执行(即,进入子函数)。step over:在单步执行时,在函数内遇到子函数时不会进入子函数内单步执行,而是将子函数整个执行完再停止,也就是把子函数整个作为一步;其中,经过我们简单的调试,在不存在子函数的情况下是和step into效果一样的(即,越过子函数,但子函数会执行)。step out:当单步执行到子函数内时,用step out就可以执行完子函数余下部分,并返回到上一层函数。
本申请中,对JavaScript引擎的配置过程中,借助Web调试工具DevTools来调试嵌入式设备上的JavaScript代码,需要在嵌入式设备上实现DevTools中对于JavaScript调试器的协议,基于WebSocket通信;需要在嵌入式JavaScript引擎(包括JerryScript、Duktape、QuickJS等)中注入单步调试功能,需要在运行字节码前判断是否暂停JavaScript,并按协议要求抓取栈帧信息。因此,基于调试工具DevTools,在无需修改JavaScript代码的情况下,即可允许开发者进行嵌入式设备上进行真机单步调试,便捷有效地实现了调试嵌入式设备上的JavaScript引擎的JavaScript代码,并且可以插入断点,抓取栈帧信息,实时查看程序运行状态。
基于同样的思路,本申请实施例还提供了上述方法对应的装置,如图3所示,图3为本申请实施例提供的调试装置的结构示意图。该调试装置应用于嵌入式设备上的JavaScript引擎,所述JavaScript引擎中配置有调试器模块,所述调试器模块中封装有与调试工具DevTools通信的通信协议;其中,所述JavaScript引擎中注入有单步调试功能。该调试装置可以包括:
处理模块301,用于获取JavaScript脚本,并编译所述JavaScript脚本中的JavaScript代码,得到至少一个字节码;
第一调试模块302,用于根据所述至少一个字节码,通过所述通信协议,确定是否检测到用于表示调试当前待运行的字节码的调试信息,所述调试信息是通过所述DevTools确定的;
第二调试模块303,用于在确定检测到所述调试信息时,根据所述单步调试功能,运行当前的所述字节码。
本实施例中,通过处理模块301、第一调试模块302、第二调试模块303,通过获取JavaScript脚本,并编译所述JavaScript脚本中的JavaScript代码,得到至少一个字节码,然后根据所述至少一个字节码,通过所述通信协议,确定是否检测到用于表示调试当前待运行的字节码的调试信息,所述调试信息是通过所述DevTools确定的,通过向嵌入式设备上的JavaScript引擎注入调试器模块,并且在调试器模块中配置通信协议与DevTools通信,进而使得嵌入式设备上的JavaScript引擎具备调试功能;若确定检测到所述调试信息,则根据所述单步调试功能,运行当前的所述字节码。因此,通过借助DevTools的调试功能,在无需修改JavaScript代码的情况下,即可允许开发者进行嵌入式设备上进行真机单步调试,便捷有效地实现了调试嵌入式设备上的JavaScript引擎的JavaScript代码,并且基于DevTools的特点以及单步调试功能,可以实时查看程序运行状态。
可选的,第一调试模块302包括第一调试单元和第二调试单元;
第一调试单元,用于根据所述至少一个字节码,确定各个操作码;
第二调试单元,用于从各个所述操作码中确定当前待执行的目标操作码,执行下述步骤:
从所述至少一个字节码中确定与所述目标操作码对应的目标字节码,将所述目标字节码作为所述当前待运行的字节码;根据所述目标字节码,通过所述通信协议,确定是否检测到所述调试信息;
其中,所述目标操作码为任一个所述操作码。
可选的,第二调试单元,具体用于:
根据所述目标字节码,通过所述通信协议确定所述JavaScript代码中当前运行步骤所指的代码语句,所述代码语句中包含所述目标字节码;
根据所述通信协议,检测所述DevTools中是否在所述代码语句中有断点或所述DevTools中是否存在用于表示暂停的点击操作;
若有断点或存在用于表示暂停的点击操作,则确定检测到所述调试信息。
可选的,所述断点是用户通过在所述DevTools中点击代码语句的操作生成的;第二调试单元,具体用于:
通过所述通信协议,若所述DevTools中存在点击代码语句的操作,则确定检测到所述DevTools中的所述代码语句中有断点。
可选的,该调试装置还包括第三调试模块;第三调试模块,用于在所述运行当前的所述字节码之后,根据所述通信协议,将所述栈帧信息发送至所述DevTools,以使所述DevTools根据所述栈帧信息,在所述DevTools对应的界面上显示当前的所述字节码对应的运行状态。
可选的,第三调试模块,还用于:
在运行当前的字节码之后,若根据所述通信协议,检测到所述DevTools中存在用于表示下一步或继续的点击操作时,则从各个所述操作码中确定下一个目标操作码;
将下一个目标操作码作为当前待执行的目标操作码。
可选的,所述第二调试模块,具体用于:
在检测到所述DevTools中存在断点或用于表示暂停的点击操作时,停止运行所述JavaScript脚本,并根据单步调试功能,单步执行当前的所述字节码。
可选的,该调试装置,还包括第四调试模块;第四调试模块,用于:
若检测到所述调试信息时,则通过所述通信协议,向所述DevTools发送事件通知。
可选的,处理模块,具体用于:
查找是否存在待执行的所述JavaScript脚本,若存在,则获取所述JavaScript脚本。
本实施例,基于调试工具DevTools,在无需修改JavaScript代码的情况下,即可允许开发者进行嵌入式设备上进行真机单步调试,便捷有效地实现了调试嵌入式设备上的JavaScript引擎的JavaScript代码,并且可以插入断点,抓取栈帧信息,实时查看程序运行状态。
本申请实施例提供的装置,可以实现上述如图1-2所示的实施例的方法,其实现原理和技术效果类似,此处不再赘述。
图4为本申请实施例提供的电子设备的硬件结构示意图。如图4所示,本实施例提供的电子设备400包括:处理器401,以及与所述处理器通信连接的存储器。其中,处理器401、存储器402通过总线403连接。
在具体实现过程中,处理器401执行所述存储器402存储的计算机执行指令,使得处理器401执行上述方法实施例中的方法。
处理器401的具体实现过程可参见上述方法实施例,其实现原理和技术效果类似,本实施例此处不再赘述。
在上述的图4所示的实施例中,应理解,处理器可以是中央处理单元(英文:Central Processing Unit,简称:CPU),还可以是其他通用处理器、数字信号处理器(英文:Digital Signal Processor,简称:DSP)、专用集成电路(英文:Application SpecificIntegrated Circuit,简称:ASIC)等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合发明所公开的方法的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。
存储器可能包含高速RAM存储器,也可能还包括非易失性存储NVM,例如至少一个磁盘存储器。
总线可以是工业标准体系结构(Industry Standard Architecture,ISA)总线、外部设备互连(Peripheral Component Interconnect,PCI)总线或扩展工业标准体系结构(Extended Industry Standard Architecture,EISA)总线等。总线可以分为地址总线、数据总线、控制总线等。为便于表示,本申请附图中的总线并不限定仅有一根总线或一种类型的总线。
本申请实施例还提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机执行指令,当处理器执行所述计算机执行指令时,实现上述方法实施例的调试方法。
本申请实施例还提供一种计算机程序产品,包括计算机程序,所述计算机程序被处理器执行时,实现如上所述的调试方法。
上述的计算机可读存储介质,上述可读存储介质可以是由任何类型的易失性或非易失性存储设备或者它们的组合实现,如静态随机存取存储器(SRAM),电可擦除可编程只读存储器(EEPROM),可擦除可编程只读存储器(EPROM),可编程只读存储器(PROM),只读存储器(ROM),磁存储器,快闪存储器,磁盘或光盘。可读存储介质可以是通用或专用计算机能够存取的任何可用介质。
一种示例性的可读存储介质耦合至处理器,从而使处理器能够从该可读存储介质读取信息,且可向该可读存储介质写入信息。当然,可读存储介质也可以是处理器的组成部分。处理器和可读存储介质可以位于专用集成电路(Application Specific IntegratedCircuits,简称:ASIC)中。当然,处理器和可读存储介质也可以作为分立组件存在于设备中。
本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上各实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述各实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的范围。
Claims (10)
1.一种调试方法,其特征在于,应用于嵌入式设备上的JavaScript引擎,所述JavaScript引擎中配置有调试器模块,所述调试器模块中封装有与调试工具DevTools通信的通信协议;其中,所述JavaScript引擎中注入有单步调试功能;所述方法包括:
获取JavaScript脚本,并编译所述JavaScript脚本中的JavaScript代码,得到至少一个字节码;
根据所述至少一个字节码,通过所述通信协议,确定是否检测到用于表示调试当前待运行的字节码的调试信息,所述调试信息是通过所述DevTools确定的;
若确定检测到所述调试信息,则根据所述单步调试功能,运行当前的所述字节码。
2.根据权利要求1所述的方法,其特征在于,所述根据所述至少一个字节码,通过所述通信协议,确定是否检测到用于表示调试当前待运行的字节码的调试信息,包括:
根据所述至少一个字节码,确定各个操作码;
从各个所述操作码中确定当前待执行的目标操作码,执行下述步骤:
从所述至少一个字节码中确定与所述目标操作码对应的目标字节码,将所述目标字节码作为所述当前待运行的字节码;
根据所述目标字节码,通过所述通信协议,确定是否检测到所述调试信息;
其中,所述目标操作码为任一个所述操作码。
3.根据权利要求2所述的方法,其特征在于,所述根据所述目标字节码,通过所述通信协议,确定是否检测到所述调试信息,包括:
根据所述目标字节码,通过所述通信协议确定所述JavaScript代码中当前运行步骤所指的代码语句,所述代码语句中包含所述目标字节码;
根据所述通信协议,检测所述DevTools中是否在所述代码语句中有断点或所述DevTools中是否存在用于表示暂停的点击操作;
若有断点或存在用于表示暂停的点击操作,则确定检测到所述调试信息。
4.根据权利要求3所述的方法,其特征在于,所述断点是用户通过在所述DevTools中点击代码语句的操作生成的;
所述根据所述通信协议,检测所述DevTools中是否在所述代码语句中有断点,包括:
通过所述通信协议,若所述DevTools中存在点击代码语句的操作,则确定检测到所述DevTools中的所述代码语句中有断点。
5.根据权利要求2或3任一项所述的方法,其特征在于,在所述运行当前的所述字节码之后,所述方法还包括:
生成当前的所述字节码对应的栈帧信息;
根据所述通信协议,将所述栈帧信息发送至所述DevTools,以使所述DevTools根据所述栈帧信息,在所述DevTools对应的界面上显示当前的所述字节码对应的运行状态。
6.根据权利要求5所述的方法,其特征在于,所述方法还包括:
在运行当前的字节码之后,若根据所述通信协议,检测到所述DevTools中存在用于表示下一步或继续的点击操作时,则从各个所述操作码中确定下一个目标操作码;
将下一个目标操作码作为当前待执行的目标操作码。
7.根据权利要求1-3任一项所述的方法,其特征在于,所述若确定检测到所述调试信息,则根据所述单步调试功能,运行当前的所述字节码,包括:
若检测到所述DevTools中存在断点或用于表示暂停的点击操作时,则停止运行所述JavaScript脚本,并根据单步调试功能,单步执行当前的所述字节码。
8.根据权利要求1-3任一项所述的方法,其特征在于,所述方法还包括:
若检测到所述调试信息时,则通过所述通信协议,向所述DevTools发送事件通知。
9.根据权利要求1-3任一项所述的方法,其特征在于,所述获取JavaScript脚本,包括:
查找是否存在待执行的所述JavaScript脚本,若存在,则获取所述JavaScript脚本。
10.一种调试装置,其特征在于,应用于嵌入式设备上的JavaScript引擎,所述JavaScript引擎中配置有调试器模块,所述调试器模块中封装有与调试工具DevTools通信的通信协议;其中,所述JavaScript引擎中注入有单步调试功能;所述装置包括:
处理模块,用于获取JavaScript脚本,并编译所述JavaScript脚本中的JavaScript代码,得到至少一个字节码;
第一调试模块,用于根据所述至少一个字节码,通过所述通信协议,确定是否检测到用于表示调试当前待运行的字节码的调试信息,所述调试信息是通过所述DevTools确定的;
第二调试模块,用于在确定检测到所述调试信息时,根据所述单步调试功能,运行当前的所述字节码。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210286721.8A CN114625660A (zh) | 2022-03-22 | 2022-03-22 | 调试方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210286721.8A CN114625660A (zh) | 2022-03-22 | 2022-03-22 | 调试方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114625660A true CN114625660A (zh) | 2022-06-14 |
Family
ID=81903255
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210286721.8A Pending CN114625660A (zh) | 2022-03-22 | 2022-03-22 | 调试方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114625660A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115794639A (zh) * | 2022-12-05 | 2023-03-14 | 北京领雁科技股份有限公司 | 基于流程的可视化测试及可视化仿真模拟测试系统和方法 |
CN116955118A (zh) * | 2023-09-19 | 2023-10-27 | 统信软件技术有限公司 | 性能分析方法、系统、计算设备及存储介质 |
Citations (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20130318503A1 (en) * | 2012-05-25 | 2013-11-28 | Fujitsu Limited | Symbolic execution and automatic test case generation for javascript programs |
US20140282417A1 (en) * | 2013-03-15 | 2014-09-18 | Microsoft Corporation | Javascript debugging using just my code |
CN106201893A (zh) * | 2016-07-21 | 2016-12-07 | 恒宝股份有限公司 | 一种Java字节码调试器及调试方法 |
CN107967139A (zh) * | 2016-10-17 | 2018-04-27 | 网易(杭州)网络有限公司 | 游戏的热更新方法及装置 |
CN110837473A (zh) * | 2019-11-07 | 2020-02-25 | 腾讯科技(深圳)有限公司 | 应用程序调试方法、装置、终端及存储介质 |
CN111209210A (zh) * | 2020-01-15 | 2020-05-29 | 北京明略软件系统有限公司 | 一种生成测试用例方法、装置、电子设备及存储介质 |
CN111831538A (zh) * | 2019-04-18 | 2020-10-27 | 腾讯科技(深圳)有限公司 | 调试方法、装置以及存储介质 |
CN112199274A (zh) * | 2020-09-18 | 2021-01-08 | 北京大学 | 基于V8引擎的JavaScript动态污点跟踪方法及电子装置 |
CN112214392A (zh) * | 2019-07-10 | 2021-01-12 | 腾讯科技(深圳)有限公司 | Js代码调试方法、装置、终端及存储介质 |
CN113704706A (zh) * | 2021-09-23 | 2021-11-26 | 深圳市腾讯信息技术有限公司 | 代码加固方法、装置 |
-
2022
- 2022-03-22 CN CN202210286721.8A patent/CN114625660A/zh active Pending
Patent Citations (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20130318503A1 (en) * | 2012-05-25 | 2013-11-28 | Fujitsu Limited | Symbolic execution and automatic test case generation for javascript programs |
US20140282417A1 (en) * | 2013-03-15 | 2014-09-18 | Microsoft Corporation | Javascript debugging using just my code |
CN106201893A (zh) * | 2016-07-21 | 2016-12-07 | 恒宝股份有限公司 | 一种Java字节码调试器及调试方法 |
CN107967139A (zh) * | 2016-10-17 | 2018-04-27 | 网易(杭州)网络有限公司 | 游戏的热更新方法及装置 |
CN111831538A (zh) * | 2019-04-18 | 2020-10-27 | 腾讯科技(深圳)有限公司 | 调试方法、装置以及存储介质 |
CN112214392A (zh) * | 2019-07-10 | 2021-01-12 | 腾讯科技(深圳)有限公司 | Js代码调试方法、装置、终端及存储介质 |
CN110837473A (zh) * | 2019-11-07 | 2020-02-25 | 腾讯科技(深圳)有限公司 | 应用程序调试方法、装置、终端及存储介质 |
CN111209210A (zh) * | 2020-01-15 | 2020-05-29 | 北京明略软件系统有限公司 | 一种生成测试用例方法、装置、电子设备及存储介质 |
CN112199274A (zh) * | 2020-09-18 | 2021-01-08 | 北京大学 | 基于V8引擎的JavaScript动态污点跟踪方法及电子装置 |
CN113704706A (zh) * | 2021-09-23 | 2021-11-26 | 深圳市腾讯信息技术有限公司 | 代码加固方法、装置 |
Non-Patent Citations (3)
Title |
---|
BYEONGCHEOL LEE 等: "Debug all your code: portable mixed-environment debugging", 《OOPSLA \'09: PROCEEDINGS OF THE 24TH ACM SIGPLAN CONFERENCE ON OBJECT ORIENTED PROGRAMMING SYSTEMS LANGUAGES AND APPLICATIONS》, 25 October 2009 (2009-10-25), pages 207 - 226 * |
匡开圆: "基于WebAssembly的JavaScript代码虚拟化保护方法研究与实现", 《中国优秀硕士学位论文全文数据库 信息科技辑》, 15 January 2019 (2019-01-15), pages 138 - 214 * |
炒酱: "在 Chrome DevTools 中调试 JavaScript", Retrieved from the Internet <URL:https://zhuanlan.zhihu.com/p/112855600> * |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115794639A (zh) * | 2022-12-05 | 2023-03-14 | 北京领雁科技股份有限公司 | 基于流程的可视化测试及可视化仿真模拟测试系统和方法 |
CN115794639B (zh) * | 2022-12-05 | 2023-09-26 | 北京领雁科技股份有限公司 | 基于流程的可视化测试及可视化仿真模拟测试系统和方法 |
CN116955118A (zh) * | 2023-09-19 | 2023-10-27 | 统信软件技术有限公司 | 性能分析方法、系统、计算设备及存储介质 |
CN116955118B (zh) * | 2023-09-19 | 2023-12-29 | 统信软件技术有限公司 | 性能分析方法、系统、计算设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109800159B (zh) | 程序调试方法、程序调试装置、终端设备及存储介质 | |
EP2368189B1 (en) | Debugging pipeline | |
Carreira et al. | Xception: A technique for the experimental evaluation of dependability in modern computers | |
US10540262B2 (en) | Using edit and continue to dynamically set and unset optimizations in source code while debugging | |
CN114625660A (zh) | 调试方法及装置 | |
US9009678B2 (en) | Software debugging with execution match determinations | |
US20080209405A1 (en) | Distributed debugging for a visual programming language | |
US10083029B2 (en) | Detect application defects by correlating contracts in application dependencies | |
CN111459495A (zh) | 单元测试代码文件生成方法、电子装置及存储介质 | |
US20060168568A1 (en) | Method, system and computer program product for testing computer programs | |
US20080307397A1 (en) | Program Analysis by Partial Emulation | |
CN114356779A (zh) | 编程语言调试方法、装置及终端设备 | |
CN113127329B (zh) | 脚本调试方法、装置及计算机存储介质 | |
Blanqui et al. | Designing a CPU model: from a pseudo-formal document to fast code | |
EP0528019A1 (en) | METHOD AND DEVICE FOR COMPUTER CODE PROCESSING IN A CODE TRANSLATOR. | |
CN114510429A (zh) | 一种基于动态符号执行的调试方法、系统和介质 | |
CN110096888B (zh) | 一种加快验证及分析smm安全隐患的方法及系统 | |
US7162618B2 (en) | Method for enhancing the visibility of effective address computation in pipelined architectures | |
CN113760701A (zh) | 测试处理方法及装置 | |
CN113836046B (zh) | Mcu上虚拟机应用程序调试方法及系统 | |
Maezawa et al. | Automated verification of pattern-based interaction invariants in Ajax applications | |
US8510719B2 (en) | Real-time user configurable debugging framework | |
McInnes | Modeling and analysis of TinyOS sensor node firmware: a CSP approach | |
Volodymyr et al. | Access to struct members and undefined behavior of C code | |
CN117130929A (zh) | 被调用库函数的解析方法、装置、计算机设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
TA01 | Transfer of patent application right |
Effective date of registration: 20220824 Address after: No.12 Zhuantang science and technology economic block, Xihu District, Hangzhou City, Zhejiang Province Applicant after: Aliyun Computing Co.,Ltd. Address before: 310056 room 508, floor 5, building 4, No. 699, Wangshang Road, Changhe street, Binjiang District, Hangzhou, Zhejiang Applicant before: Alibaba (China) Co.,Ltd. |
|
TA01 | Transfer of patent application right |