CN109669876A - 一种javascript代码的调试控制方法及系统 - Google Patents
一种javascript代码的调试控制方法及系统 Download PDFInfo
- Publication number
- CN109669876A CN109669876A CN201811644744.1A CN201811644744A CN109669876A CN 109669876 A CN109669876 A CN 109669876A CN 201811644744 A CN201811644744 A CN 201811644744A CN 109669876 A CN109669876 A CN 109669876A
- Authority
- CN
- China
- Prior art keywords
- code
- debugging
- function
- debugger
- javascript
- 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.)
- Granted
Links
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
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种javascript代码的调试控制方法及系统,该系统包括代码模块、调试器及调试工具,其中:代码模块,用于:加载原代码,为原代码加入特定标记得到标记代码,其中,原代码为javascript代码,特定标记为调用调试器中对应函数实现进入函数、跳出函数或执行代码语句行的操作的函数;调试工具,用于:加载原代码,以及在用户基于原代码实现的控制下发送相应调试指令至调试器;调试器,用于:加载及执行标记代码,在执行标记代码的过程中接收调试工具发送的调试指令,并基于调试指令通过控制与特定标记对应的函数控制标记代码的执行,以实现对应的代码调试。本申请能够减少开发工作量及维护工作量、提高开发效率。
Description
技术领域
本发明涉及软件开发技术领域,更具体地说,涉及一种javascript代码的调试控制方法及系统。
背景技术
现有的用于实现javascript代码调试的调试工具在开发过程中,通常采用javascript引擎提供的调试接口功能实现对应的调试控制功能。
参见图1,图1是现有javascript调试工具结构关系示意图(注意现有javascript调试工具大多采用调试器与调试工具集成于一体的方式呈现,例如常见的网页浏览器软件其内部就同时存在调试工具装置和调试器装置的实现)。现有的javascript调试工具的调试控制功能由于需要javascript引擎的调试接口支持,而目前市面上的javascript引擎的种类繁多,调试接口各异,常用的javascript引擎(如:v8,Internet Explorer所携带javascript引擎等)由于某些原因无法在全平台运行(如:v8不能在ios中运行,InternetExplorer所携带javascript引擎只能在windows上运行等),并且实现质量也参差不齐,同时在后期维护过程中还需要应对由于javascript引擎调试接口的变更而增加的维护工作量。因此,若采用现有的实现方式将不可避免的需要针对不同的javascript引擎调试接口编写不同的调试器,且当用户有跨平台(如windows,android,ios等)需求时,将不可避免的面临需要支持多种javascript引擎的问题。这无疑会增加开发人员的开发工作量、降低开发效率、增大维护工作量。
综上所述,现有技术中用于实现javascript代码调试的技术方案存在开发工作量较大、开发效率较低、维护工作量较大的问题。
发明内容
本发明的目的是提供一种javascript代码的调试控制系统,以解决现有技术中用于实现javascript代码调试的技术方案存在的开发工作量及维护工作量较大、开发效率较低的问题。
为了实现上述目的,本发明提供如下技术方案:
一种javascript代码的调试控制系统,包括代码模块、调试器及调试工具,其中:
所述代码模块,用于:加载原代码,为所述原代码加入特定标记得到标记代码,其中,所述原代码为javascript代码,所述特定标记为调用所述调试器中对应函数实现进入函数、跳出函数或执行代码语句行的操作的函数;
所述调试工具,用于:加载所述原代码,以及在用户基于所述原代码实现的控制下发送相应调试指令至所述调试器;
所述调试器,用于:加载及执行所述标记代码,在执行所述标记代码的过程中接收所述调试工具发送的调试指令,并基于所述调试指令通过控制与所述特定标记对应的函数控制所述标记代码的执行,以实现对应的代码调试。
优选的,所述调试器包括:
堆栈管理单元,用于:跟踪所述标记代码中的特定标记,并基于跟踪所得信息为所述标记代码维护包括表示函数调用关系的函数调用堆栈的堆栈数据结构,以支持所述调试器其他对应功能的实现。
优选的,所述调试器包括:
断点管理单元,用于:在所述调试指令的触发下,为所述标记代码添加、启用、禁用、编辑或移除断点;
调试控制单元,用于:在所述调试指令的触发下,实现对应的调试控制功能,所述调试控制功能包括启动调试、停止调试、进入函数、跳出函数、单步及由暂停调试或命中断点状态返回的继续调试。
优选的,所述调试器包括:
变量操作单元,用于:当在执行所述标记代码的过程中命中断点时,在所述调试指令的触发下实现针对指定变量的取值、更改值、变量类型识别的操作。
优选的,所述调试器包括:
断点命中通知单元,用于:按照所述调试指令暂停调试或命中断点时,将当前执行到的代码语句行的行号、当前代码语句行所属对象、当前代码语句行所属函数以及当前的函数调用堆栈发送给所述调试工具。
优选的,所述调试器包括:
应用关闭通知单元,用于:当所述用户手动关闭所述标记代码的程序或所述标记代码的程序自行关闭时,向所述调试工具发送应用关闭通知,以告知所述调试工具所述调试器即将关闭。
优选的,所述调试器包括:
性能统计单元,用于:在执行所述标记代码的过程中,统计所述标记代码的代码语句行、任意相邻两个断点之间的代码语句行及各函数分别执行的时间,并上报给所述调试工具。
优选的,所述调试器包括:
日志上报单元,用于:向所述调试工具发送所述调试器当前的日志数据,以告知所述用户所述调试器的运行状态;
所述调试器及所述调试工具均包括:
设备信息发送单元,用于:向所述调试工具或所述调试器发送本设备的预设参数信息。
优选的,所述调试工具包括:
展示界面,用于:展示加载得到的原代码、所述原代码中与执行的标记代码当前运行位置对应的位置及所述调试器返回的各项信息。
一种javascript代码的调试控制方法,包括:
加载原代码,为所述原代码加入特定标记得到标记代码,其中,所述原代码为javascript代码,所述特定标记为调用所述调试器中对应函数实现进入函数、跳出函数或执行代码语句行的操作的函数;
执行所述标记代码,在执行所述标记代码的过程中,在用户基于所述原代码实现的控制下生成对应的调试指令,并基于所述调试指令通过控制与所述特定标记对应的函数控制所述标记代码的执行。
本发明提供的技术方案中,在原代码(待调试的javascript代码)中加入能够调用对应的具有调试功能的函数以实现进入函数、跳出函数或执行代码语句行的操作的特定标记得到标记代码(带有特定标记的待调试的javascript代码),由调试工具加载原代码供用户基于原代码通过调试工具下发相应调试指令以执行调试操作,由调试器加载及执行标记代码,并通过控制与特定标记需调用的函数实现与调试指令对应的调试控制,从而实现了对javascript代码的调试;可见,本申请中调试器基于特定标记即可完成用户通过调试工具下发的调试指令对应操作,进而顺利实现javascript代码的调试,而无需调用javascript引擎的调试接口,也就避免了现有技术中依赖javascript的调试接口实现javascript代码调试时,由于针对一种javascript引擎的调试接口开发的javascript调试器只能采用该javascript引擎,更换javascript引擎后无法进行调试的情况,即若要开发一种可以支持多种javascript引擎的调试器必须相应的针对不同的javascript引擎进行开发且当javascript引擎的调试接口变更时还必须针对相应的调试器进行修改的情况,所存在的开发工作量及维护工作量较大、开发效率较低的问题,因此本申请公开的技术方案既能够减少针对多款javascript引擎开发javascript调试器的开发工作量,提高开发效率和维护效率,也能够减少针对单一javascript引擎开发javascript调试器的维护工作量,提高维护效率。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1是现有技术中的javascript代码调试方法的工作流程示意图。
图2是本发明实施例公开的一种javascript代码的调试控制系统的结构示意图。
图3是本发明实施例公开的一种javascript代码的调试控制系统的工作流程示意图。
图4是本发明实施例公开的一种javascript代码的调试控制系统中的调试工具的工作流程示意图。
图5是本发明实施例公开的一种javascript代码的调试控制系统中的调试工具的结构示意图。
图6是本发明实施例公开的一种javascript代码的调试控制系统中的调试控制协议的示意图。
图7是本发明实施例公开的一种javascript代码的调试控制系统中的调试器工作流程示意图。
图8是本发明实施例公开的一种javascript代码的调试控制系统中的调试器的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
请参阅图2至图8,其中,图2是本发明实施例公开的一种javascript代码的调试控制系统的结构示意图;图3是本发明实施例公开的一种javascript代码的调试控制系统的工作流程示意图;图4是本发明实施例公开的一种javascript代码的调试控制系统中的调试工具的工作流程示意图;图5是本发明实施例公开的一种javascript代码的调试控制系统中的调试工具的结构示意图;图6是本发明实施例公开的一种javascript代码的调试控制系统中的调试控制协议的示意图;图7是本发明实施例公开的一种javascript代码的调试控制系统中的调试器工作流程示意图;图8是本发明实施例公开的一种javascript代码的调试控制系统中的调试器的结构示意图。
请参阅图2,其示出了本发明实施例提供的一种javascript代码的调试控制系统的结构示意图,该调试控制系统可以包括代码模块11、调试器12及调试工具13,其中:
代码模块11,用于:加载原代码,为原代码加入特定标记得到标记代码,其中,原代码为javascript代码,特定标记为调用调试器12中对应函数实现进入函数、跳出函数或执行代码语句行的操作的函数;
调试工具13,用于:加载原代码,以及在用户基于原代码实现的控制下发送相应调试指令至调试器12;
调试器12,用于:加载及执行标记代码,在执行标记代码的过程中接收调试工具13发送的调试指令,并基于调试指令通过控制与特定标记对应的函数控制标记代码的执行,以实现对应的代码调试。
需要说明的是,原代码即为待调试的javascript代码,标记代码即为加入特定标记后的待调试的javascript代码,本申请提供的调试控制系统无需实现原代码的存储,而是可以直接获取存储在硬盘上的原代码进而对其进行分析、展示等操作。代码模块加载原代码之后,可以为原代码加入特定标记得到标记代码,特定标记本质上即是一条调用调试器中采用javascript代码编写的调试代码的函数,其参数均以未带有特定标记的javascript代码为参照,从而使得特定标记可以确保带有特定标记的javascript代码能与未带有特定标记的javascript代码保持确定的对应关系;即执行带有特定标记的javascript代码时,通过特定标记即可知道当前正在执行未带特定标记的javascript代码的哪个位置。因此本实施例中的特定标记用于确定加入特定标记前后javascript代码的对应关系以及用于供调试器基于特定标记跟踪javascript代码当前执行位置和必要参数的获取。其中,基于特定标记跟踪执行位置即为实现代码定位,具体可以由以下参数共同确定:当前代码语句行的所属类、当前代码语句行处于所属类中的哪个函数、当前代码语句行处于所属类中的那个函数中的第几行(当前代码语句行即为实现代码定位时所针对的任一代码语句行)。例如:在函数起始处具有标记EnterPBFunction("test3","open",36,55,function(s){return eval(s);},this);,在当前代码语句行处具有标记EonBreakPoint(3);,则认为当前正在执行的javascript代码语句行处于类名称为test3的类中的open函数中;且open函数从代码文件的36行开始定义,到代码文件的55行定义结束,而行号3表示当前执行的代码语句行相对于open函数的偏移为3,即当前正在执行的代码语句行在代码文件中的行号为36+3=39行。
其中,特定标记可以包括分别通过调用调试器中对应函数实现进入函数、跳出函数及执行代码语句行的函数入口标记、函数出口标记及代码语句行标记;函数入口标记用于指示当前程序执行流程即将进入某一处javascript函数体,函数出口标记用于指示当前程序执行流程即将跳出某一处javascript函数体,代码语句行标记用于指示当前程序执行流程即将执行某一句javascript代码。具体来说,函数入口标记即在每一个javascript代码的函数入口处插入一条调用调试器中以javascript代码编写而成的相应函数的函数,并为该调试器中的相应函数传递当前函数(当前函数为当前所说明的函数,此处的当前函数即为插入函数入口标记的函数)所属对象名、当前函数名、当前函数的起始行号、当前函数的结束行号、当前函数所属对象指针以及专为存取当前函数变量值而添加的匿名函数指针等参数。函数出口标记即在每一个javascript代码的函数出口处插入一条调用调试器中以javascript代码编写而成的相应函数的函数,并为该调试器中的相应函数传递当前函数(当前函数为当前所说明的函数,此处的当前函数即为插入函数出口标记的函数)所属对象名和当前函数名参数。代码语句行标记即在每一句javascript代码的语句前插入一条调用调试器中以javascript代码编写而成的相应函数的函数,并在该调试器中的相应函数中传递当前javascript代码语句行(当前javascript代码语句行为当前所说明的javascript代码语句行,此处的当前javascript代码语句行即为插入代码语句行标记的代码语句行)所在的行号。
具体来说,函数入口标记包括如下参数:当前javascript函数所属的javascript对象名,用于确定当前javascript函数所属的javascript对象;当前javascript函数的函数名,用于确定当前javascript函数名;当前javascript函数所属的javascript对象指针,用于后续调试器进行对象实例变量操作时,使用该对象指针访问对象的实例变量,其中,对象实例变量指在对象内部定义的一种变量,其生命周期跟随所属对象的创建而创建,跟随所属对象的销毁而销毁;当前javascript函数在javascript代码的文件中的起始行号,用于确定当前javascript函数在未带有特定标记的javascript代码的文件中的起始位置;当前javascript函数在javascript代码的文件中的截止行号,用于确定当前javascript函数在未带有特定标记的javascript代码的文件中的截止位置;为当前javascript函数特别编写的用于针对当前javascript函数中变量进行操作的匿名函数指针,匿名函数指在javascript代码中没有指定函数名的javascript函数,其是直接书写在调用语句体内,因此其不需要命名,仅需要将其指针传递到调试器的相应函数即可,又因其定义在当前javascript函数体内部,因此使用该匿名函数可以直接访问当前javascript函数体中所定义的所有变量。
函数出口标记包括如下参数:当前javascript函数所属的javascript对象名,用于确定当前javascript函数的javascript对象;当前javascript函数的函数名,用于确定当前javascript函数名。
代码语句行标记包括如下参数:当前代码语句行号,用于确定当前代码语句行在未带有特定标记的javascript代码的文件中的位置。
以下对上述特定标记进行举例说明,未带有特定标记的javascript代码片段可以如下所示:
添加特定标记后,上述javascript代码片段如下所示:
在上述javascript代码片段中,EnterPBFunction("EonApp","OPEN",32,38,function(s){return eval(s);},this);即为函数入口标记。具体来说,“EnterPBFunction”为调试器的入栈函数名,当调试器的入栈函数被调用时,即可判断为当前的javascript代码执行即将进入一个函数体;“EonApp”为当前函数(EonApp.OPEN)属于对象名为EonApp的内部函数;“OPEN“为当前函数的函数名;32表示当前函数处于所在javascript代码文件中的32行,即当前函数从代码文件的32行开始(functionEonApp.OPEN(Commandline)书写;38表示当前函数处于所在javascript代码文件中的38行,即当前函数从代码文件的第38行结束(最后一个}书写;function(s){return eval(s);}为用于操作本函数内部变量的匿名函数;this为用于操作当前函数所属对象(EonApp)的实例变量的指针。
LeavePBFunction("EonApp","OPEN")为函数出口标记,具体来说,LeavePBFunction为调试器的出栈函数名,当调试器的出栈函数被调用时,即可判断为当前的javascript代码执行即将跳出当前正在执行的函数体;"EonApp"表示当前函数(EonApp.OPEN)属于对象名为EonApp的内部函数;“OPEN“为当前函数的函数名;
EonBreakPoint(1)为代码语句行标记,具体来说,EonBreakPoint为调试器的代码语句行改变函数名,当调试器的代码语句行改变函数被调用时,即可判断出当前javascript引擎即将执行代码语句行标记中参数所指示的javascript代码语句行;1表示当前代码语句行位于其所在未带有特定标记的JavaScript代码中的函数中的相对于函数起始定义行号的偏移行号,即每个函数中的代码语句行号都是从1开始,若要求出该代码语句行相对于未带有特定标记的javascript代码文件中的行号,则需要使用该代码语句行的行号加上所属函数定义的起始行号(如:这里open的起始行号为32,特定标记EonBreakPoint(1)所代表的未带有特定标记的javascript代码文件中的行号就是32+1=33)。
在为原代码加入上述特定标记后,能够得到对应的标记代码,调试器能够利用其包含的javascript引擎执行标记代码;在执行标记代码时由于执行的javascript代码包含特定标记,而特定标记本质上即是调用采用javascript代码编写的调试代码的函数,因此采用javascript代码编写的调试代码中的特定函数将在每个带有特定标记的javascript函数的入口、出口以及带有特定标记的每一条javascript语句处得到执行控制权并得到当前特定标记所携带的参数信息。调试器便可以在特定标记处执行断点命中判断、创建调用堆栈、进行性能统计、通过获取的参数信息进行变量操作等调试工作;如调试器通过控制函数入口标记对应的函数即可实现创建函数调用堆栈、进入函数(响应调试工具发送的进入函数的调试指令)功能;而调试工具在加载原代码后可以将原代码进行展示,用户在展示的原代码的基础上确定需要实现的调试控制,并通过调试工具将对应的调试指令发送至调试器,调试器基于接收到的调试指令通过上述方式控制标记代码的执行,以实现对应的代码调试。简单来说,调试工具作为用户和调试器的界面接口装置,用户将通过其来加载未带有特定标记的javascript代码,以及其所提供的调试控制协议中定义的调试指令的界面接口来完成调试工作。调试器作为调试工作的具体执行装置,其将用于完成调试工具的调试指令执行,调试状态反馈,带特定标记的javascript代码中的特定标记的解析,调试数据结构的构造等功能。另外,调试工具可以通过socket(套接字)与调试器相连接,并依据调试控制协议与调试器进行交互。用户在调试过程中通过调试工具实时向调试器下发调试指令,等待调试器的执行反馈和事件通知,并根据调试器的执行反馈和事件通知探知当前javascript代码的运行情况以及决定调试的下一步动作。
另外,调试器可以包括用于执行带有特定标记的javascript代码的javascript引擎,该javascript引擎可以根据应用场景进行合理搭配(即可根据实际应用场景嵌入特定的javascript引擎)。鉴于当前针对javascript引擎的嵌入技术应用面较广,且大多数的javascript引擎的嵌入接口相较于各javascript引擎的调试接口还是简单得多,且可用于检索的资料也相对丰富的多。因此仅更换嵌入的javascript引擎相对于现有技术中利用javascript引擎的调试接口实现代码调试,能够减少维护成本及提高开发效率。
本发明提供的技术方案中,在原代码(待调试的javascript代码)中加入能够调用对应的具有调试功能的函数以实现进入函数、跳出函数或执行代码语句行的操作的特定标记得到标记代码(带有特定标记的待调试的javascript代码),由调试工具加载原代码供用户基于原代码通过调试工具下发相应调试指令以执行调试操作,由调试器加载及执行标记代码,并通过控制与特定标记需调用的函数实现与调试指令对应的调试控制,从而实现了对javascript代码的调试;可见,本申请中调试器基于特定标记即可完成用户通过调试工具下发的调试指令对应操作,进而顺利实现javascript代码的调试,而无需调用javascript引擎的调试接口,也就避免了现有技术中依赖javascript的调试接口实现javascript代码调试时,由于针对一种javascript引擎的调试接口开发的javascript调试器只能采用该javascript引擎,更换javascript引擎后无法进行调试的情况,即若要开发一种可以支持多种javascript引擎的调试器必须相应的针对不同的javascript引擎进行开发且当javascript引擎的调试接口变更时还必须针对相应的调试器进行修改的情况,所存在的开发工作量及维护工作量较大、开发效率较低的问题,因此本申请公开的技术方案既能够减少针对多款javascript引擎开发javascript调试器的开发工作量,提高开发效率和维护效率,也能够减少针对单一javascript引擎开发javascript调试器的维护工作量,提高维护效率。
本发明实施例提供的一种javascript代码的调试控制系统,调试器可以包括:
堆栈管理单元,用于:跟踪标记代码中的特定标记,并基于跟踪所得信息为标记代码维护包括表示函数调用关系的函数调用堆栈的堆栈数据结构,以支持调试器其他对应功能的实现;
断点管理单元,用于:在调试指令的触发下,为标记代码添加、启用、禁用、编辑或移除断点;
调试控制单元,用于:在调试指令的触发下,实现对应的调试控制功能,调试控制功能包括启动调试、停止调试、暂停调试、进入函数、跳出函数、单步及由暂停调试或命中断点状态返回的继续调试;
变量操作单元,用于:当在执行标记代码的过程中命中断点时,在调试指令的触发下实现针对指定变量的取值、更改值、变量类型识别的操作;
断点命中通知单元,用于:按照调试指令暂停调试或命中断点时,将当前执行到的代码语句行的行号、当前代码语句行所属对象、当前代码语句行所属函数以及当前的函数调用堆栈发送给调试工具;
应用关闭通知单元,用于:当用户手动关闭标记代码的程序或标记代码的程序自行关闭时,向调试工具发送应用关闭通知,以告知调试工具调试器即将关闭;
性能统计单元,用于:在执行标记代码的过程中,统计标记代码的代码语句行、任意相邻两个断点之间的代码语句行及各函数分别执行的时间,并上报给调试工具;
日志上报单元,用于:向调试工具发送调试器当前的日志数据,以告知用户调试器的运行状态;
设备信息发送单元,用于:向调试工具发送本设备的预设参数信息。
本发明实施例提供的一种javascript代码的调试控制系统,调试工具可以包括:
设备信息发送单元,用于:向调试器发送本设备的预设参数信息;
展示界面,用于:展示加载得到的原代码、原代码中与执行的标记代码当前运行位置对应的位置及调试器返回的各项信息。
本实施例中调试器及调试工具中包含的上述各项单元实现的上述各项功能是基于调试器与调试工具间预先根据实际需要设定的调试控制协议实现的,具体来说,调试器及调试工具基于预先设定的调试控制协议进行交互,而用户通过操作调试工具实现对应的调试工作;由此调试器及调试工具能够通过基于调试控制协议的交互实现调试控制协议能够实现的各项功能,完善了调试控制系统的功能。其中预先设定的调试控制协议具体可以包含:
调试配对:用于调试工具与调试器开始连接的参数交换以及初始化各自的环境等,调试器在调试配对完成后将等待调试工具发送启动调试、断点管理及性能统计等调试指令。
启动调试:调试器在接收到调试工具发送的启动调试的调试指令后,开始执行带有特定标记的javascript代码。
调试停止:调试器在接收到调试工具发送的停止调试的调试指令后,调试器将停止执行带有特定标记的javascript代码。
暂停调试:调试器接收到调试工具发送的暂停调试的调试指令后,调试器将在下一次执行到特定标记(这里不区分具体的标记类型,即函数入口标记、函数出口标记及代码语句行标记等所有标记均会执行该操作)对应的标记函数(标记函数即为带有特定标记的函数)时,暂停执行带有特定标记的javascript代码并向调试工具发送命中断点消息。
继续调试:调试器在接收到调试工具发送的继续调试的调试指令后,调试器从暂停调试或者命中断点的状态返回,继续执行后续的带有特定标记的javascript代码。
单步:调试器在接收到调试工具发送的单步调试指令后,调试器将在后续执行一条带有特定标记的javascript代码之后发送断点命中通知给调试工具,中断代码执行并等待调试工具的调试指令。
进入函数:调试器在接收到调试工具发送的进入函数调试指令后,若当前带有特定标记的javascript代码语句为一个函数调用语句,调试器将在进入函数后向调试工具发送断点命中通知,并进入等待调试工具的调试指令的模式;若当前带有特定标记的javascript代码语句不是一个函数调用语句,则等同于单步。
跳出函数:调试器在接收到调试工具发送的跳出函数调试指令后,若当前函数从当前代码语句行到函数结束之间有断点记录,则等同于继续调试;若当前代码语句行到函数结束之间没有断点记录,那么调试器直接运行到当前函数结束,并在上层调用栈的当前函数调用代码处向调试工具发送断点命中通知,中断代码执行并等待调试工具的调试指令。
添加断点:用户通过调试工具指定调试器将在运行到指定的代码位置时,向调试工具发送断点命中通知,以中断代码执行并等待调试工具的调试指令。
启禁用断点:用户通过调试工具启用或禁用已经向调试器添加的断点。
移除断点:用户通过调试工具移除已经向调试器添加的断点。
性能统计:调试器在执行带有特定标记的javascript代码时,统计代码语句行,断点之间,各函数体等的执行时间,并在根据实际需要确定的合适的时机(可以是实时的、也可以是完成全部调试之后等)通知调试工具。
变量操作:当调试器命中断点时,用户可通过调试工具向调试器发送针对指定变量的取值、更改值、变量类型识别等调试指令。
日志:调试器向调试工具发送当前运行的日志数据,用于告知用户当前调试器的运行状态。其中,日志分为消息、警告及错误。消息仅仅起到提示作用,警告主要起到警示用户有异常发生,而错误则是告知用户调试器发生了严重错误,可能必须终止调试。
获取设备信息:调试器向调试工具发送本设备参数信息,或调试工具向调试器发送本设备参数信息。其中,设备参数信息即为可以根据实际需要设定的预设参数信息,具体可以包括当前正在执行的应用名、本机IP地址、本机端口号等应用参数。
断点命中通知:当调试器在用户下发的调试指令中,按照用户的意愿暂停执行或调试在断点命中测试中命中断点时,调试器将当前执行到的代码语句行的行号、当前代码语句行所属对象、当前代码语句行所属函数以及当前的函数调用堆栈发送给调试工具。
应用关闭通知:当在调试过程中用户手动关闭了被调试的带特定标记的javascript代码的程序或者程序自动关闭时,调试器向调试工具发送应用关闭通知,告知调试工具调试器即将关闭。
具体来说,调试器中上述单元可以为采用javascript编写的调试代码,该调试代码本质上是一个javascript引擎调试接口的通用实现;而调试器包括javascript引擎及采用javascript编写的调试代码,调试代码分别用于实现与调试工具的通信、堆栈管理(包括调用堆栈实现信息管理及断点管理)、断点管理、性能统计、调试控制及日志等功能,调试器基于上述调试控制协议能够实现的其包含的单元对应的功能具体包括:
断点管理(断点管理单元对应实现的功能):断点管理中主要包括添加断点、启禁用断点、移除断点等数据结构定义,并提供进行断点查询的接口,具体为:
添加断点:调试工具通过构造一个添加断点数据结构(该添加断点数据结构包括于调试指令),通过网络通信单元将该数据结构发送到调试器中。当调试器接收到添加断点数据结构后,解析添加断点数据结构并将解析到的数据添加到断点管理单元中,以实现断点在带有特定标记的javascript代码中的添加;之后再依据添加断点的执行结果发送添加断点应答数据到调试工具。其中的网络通信单元为调试工具包括的、用于实现与调试器的通信的单元。
启禁用断点(包括启用断点及禁用断点):调试工具通过构造一个启禁用断点数据结构(该启禁用断点数据结构包含于调试指令),通过网络通信单元将该数据结构发送到调试器中。当调试器接收到启禁用断点数据结构后,解析启禁用断点数据结构并使用解析到的数据对调试器中断点管理单元中的相应断点进行启禁用状态更新;之后再依据启禁用断点的执行结果发送启禁用断点应答数据到调试工具。
移除断点:调试工具通过构造一个移除断点数据结构(该移除断点数据结构包括于调试指令),通过网络通信单元将该数据结构发送到调试器中。当调试器接收到移除断点数据结构后,解析移除断点数据结构并在断点管理单元中移除相应断点;之后再依据移出断点的执行结果发送移除断点应答数据到调试工具。
堆栈管理(堆栈管理单元对应实现的功能):在调试器的对外接口调试控制协议中本质上不存在堆栈管理相关数据结构,即并不涉及构造堆栈与修改堆栈等针对堆栈本身的更改数据结构,而是仅提供了列举堆栈信息数据结构(该列举堆栈数据结构包括于调试指令)。即当调试器向调试工具发送断点命中通知(断点命中数据结构)时,将在该断点命中通知中存放当前堆栈的数据结构,以便于调试工具在接收到断点命中通知时能够更新堆栈视图(该堆栈视图中可以包括根据实际需要设定的堆栈信息)以及后续的切换堆栈等附加功能。简单来说,调试器通过堆栈管理单元跟踪带有特定标记的javascript代码中的函数入口标记、函数出口标记及代码语句行标记,维护带有特定标记的javascript代码执行时的javascript函数调用关系。存储各函数中的函数所属对象、函数所属对象名、函数名称、各函数的变量操作匿名函数指针、函数的起始行号、函数的截止行号,跟踪带有特定标记的javascript代码的执行时的行号变化等参数。此外堆栈管理还为每个调用栈维护一个独立的断点列表,用于执行断点命中测试。
堆栈管理单元依据带特定标记的javascript代码中的特定标记中的函数入口标记和函数出口标记,为正在执行的带特定标记的javascript代码维护运行堆栈数据结构,用以支持断点命中测试、函数级性能统计、进入函数、跳出函数、变量操作等功能支持。其中,断点命中测试指通过在当前栈中逐一比对当前执行的javascript代码标记是否与当前栈中所存在的断点相符,若相符则认为断点命中。
需要说明的是,本申请实施例中的数据结构为采用栈的方式进行描述的存储结构;其中,向栈中添加数据称之为压栈。本实施例中压栈的数据主要是用于跟踪带特定标记的javascript代码的执行路径(函数调用路径,如A调用B,B调用C形成一个完成的调用栈:A,B,C),用户通过调用栈信息可以清楚的看见javascript代码的执行堆栈(即函数调用关系),并可以通过调试工具切换到调用栈中的任意一个堆栈中,进行变量操作以便于分析代码执行逻辑是否正确等。而在数据结构中压入的函数信息主要包括以下参数:当前函数所属类名、当前函数名、当前函数在未带特定标记的javascript代码文件中的定义起止行号、当前函数所属对象(类经过实例化之后的实体对象,用于操纵(读写变量值)当前函数可访问的所属对象的实例变量)、与当前函数关联的匿名函数对象(匿名函数本身的引用,用于操纵(读写变量值)当前函数内部定义的局部变量)。通过在入栈函数中向栈数据结构中压入函数信息,在出栈函数中向栈数据结构中弹出函数信息(移除函数信息),从而使得栈数据结构中永远存储着当前正在执行的函数调用堆栈信息。
当命中断点时调试器通过调试控制协议将堆栈信息发送到调试工具中,调试工具可以进行以下操作:调试工具通过解析栈数据结构中栈顶元素(第一条函数信息)即可定位到当前javascript代码的执行位置,并将展示界面的代码视图(用于展示javascript代码及代码执行情况等的视图)跳转到该代码位置(通过展示界面精确显示当前javascript代码正在执行的代码语句行,使得用户能更明确的感知javascript代码的执行情况);若该代码语句行有断点还需要将断点状态更改为已命中断点状态(断点状态在调试工具的展示界面的代码视图上通过一组图标来显示,包括有效的断点、已禁用的断点、已命中的断点等);在调试工具的展示界面的堆栈视图中完整的显示出栈数据结构(通常为一个列表框,通过列表的方式显示栈数据结构中的数据记录),用户可通过双击堆栈视图中的相应栈记录,进行堆栈的切换操作。具体来说,调试工具依据用户的堆栈切换操作和调试控制协议中的相关协议向调试器发送堆栈切换指令,更新调试器中的当前栈标志,完成堆栈切换操作。注意当前堆栈会跟随用户的操作进行更改,但栈数据结构在下一次中断前是不会更改的,并且继续javascript代码执行时,javascript代码总是从被暂停的代码语句行开始执行。
变量操作(变量操作单元对应实现的功能,可以基于堆栈管理单元实现):用户可通过在调试工具中展示界面的监视视图(该监视视图可以包括javascript代码中的各变量,用于实现变量操作)中输入需要操纵的变量名(可以是当前栈所代表的函数内部的局部变量,也可以是当前栈所代表的函数所属类的实例变量),调试工具依据调试控制协议中的变量操作相关协议向调试器发送变量操作数据结构(该变量操作数据结构包括于调试指令),调试器通过获取当前栈参数,通过匿名函数或函数所属对象的引用进行实际的变量读写操作,并将结果通过调试控制协议发送给调试工具。调试工具依据返回的数据更新监视视图,以完成变量监视的功能。
日志(日志上报单元对应实现的功能):日志数据结构(该日志数据结构包括于调试指令)是由调试器主动发送给经调试配对成功的调试工具的状态数据,主要用于提示或警醒用户调试器当前的运行状态,具体可以包括消息、警告、错误三种日志信息。其中,消息表示一般的信息仅起到提示作用,警告表示需要用户关注的信息提示,错误表示调试器出现重大故障需要用户手动介入处理(如调试无法继续,需要终止等)。特别注意日志数据结构是单方向的数据传送,其是不能由调试工具发送到调试器,只能由调试器发送到调试工具的用于报告调试器运行状态的数据结构。简单来说,调试器采用日志上报单元来记录日志数据和向调试工具发送日志数据的方式向用户报告当前调试器的运行状态,用户可通过查阅日志数据或在调试工具的日志视图中了解调试器当前的运行状态。其中从调试器启动即可开始记录调试器发送的日志数据至日志记录文件,但向调试工具发送的日志数据确要在调试配对流程成功完成之后才会进行。
调试控制(调试控制单元对应实现的功能):调试控制主要包括调试配对、启动调试、停止调试、暂停调试、单步、继续调试、进入函数及跳出函数等,特别注意调试配对和启动调试的流程中堆栈管理单元还处于不可用状态,而停止调试的调试指令为独立实现,其也不依赖于堆栈管理单元;具体为:
调试配对(对应的调试控制单元还可以用于实现调试配对):调试工具在构造调试配对数据结构(该调试配对数据结构包括于调试指令)之前,需要先构造获取调试器设备信息的数据结构并经网络通信单元发送到调试器中以获取到调试器的设备信息(本实施例中的设备信息可以为包括设备标识、预设参数信息等根据实际需要设定的信息),用以确认当前所连接的调试器是否是本次调试所预期的调试器。若是则调试工具将构造调试配对数据结构经网络通信单元发送到调试器中,调试器接收到由调试工具发送来的调试配对数据结构后,将构造获取调试工具设备信息的数据结构并经网络通信单元发送到调试工具中,以确认当前所连接的调试工具是否是本次调试所预期的调试工具。若是则构造应答同意调试配对数据结构并发送给调试工具,否则构造拒绝调试配对数据结构并发送给调试工具。当调试工具接收到同意调试配对数据结构时调试配对流程完成。当调试配对执行成功完成后,调试器将拒绝后续的所有非本次成功配对的调试工具的调试配对请求(即一律返回拒绝的调试配对数据结构),且进入调试待命状态(等待调试指令的状态)。此时的调试器将可以接受断点管理、性能统计参数配置等数据结构。但此时的调试器还不会通过javascript引擎执行带有特定标记的javascript代码,因为此时的调试器还没有接收到启动调试数据结构。对应的,调试器还可以包括网络通信单元,其为调试器用于向外提供接口的底层支持,调试器通过网络通信单元与调试工具建立可靠的网络通信传输通道,并以调试控制协议为通信规范与调试工具进行实时的数据交换和功能调用。
启动调试:当调试器已经成功的与调试工具完成调试配对流程后,调试器即可接收启动调试数据结构(该启动调试数据结构包括于调试指令),当调试器接收到启动调试数据结构后将通过javascript引擎执行带有特定标记的javascript代码。具体来说,当调试器通过javascript引擎执行带有特定标记的javascript代码后,认为调试器已经进入调试状态,即实现了启动调试的控制。
停止调试:当调试器接收到发送自与自身成功完成调试配对的调试工具发送的停止调试数据结构(该停止调试数据结构包括于调试指令)后,将终止带有特定标记的javascript代码在javascript引擎中的运行。
暂停调试:当调试器处于调试状态且调试器接收到发送自与自身成功完成调试配对的调试工具发送的暂停调试数据结构(该暂停调试数据结构包括于调试指令)后,调试器将在下一次执行到特定标记(这里不区分具体的标记类型,即函数入口标记、函数出口标记、代码语句行标记等所有标记均会执行该操作)对应的标记函数时,暂停执行带有特定标记的javascript代码并向调试工具发送命中断点消息。
单步:当调试器处于调试状态且调试器接收到发送自与自身成功完成调试配对的调试工具发送的单步数据结构(该单步数据结构包括于调试指令)时,其将在执行一条带有特定标记的javascript代码后,向与自身成功完成调试配对的调试工具发送断点命中数据结构后暂停带有特定标记的javascript代码执行,并等待与自身成功完成调试配对的调试工具的下一条调试指令。
继续调试:当调试器由于断点命中或接收到调试指令中要求的暂停数据结构(如单步、进入函数、跳出函数及暂停调试数据结构),而处于暂停执行带有特定标记的javascript代码状态时,接收到与自身成功完成调试配对的调试工具发送的继续调试数据结构(该继续调试数据结构包括于调试指令)后,调试器继续通过javascript引擎执行带有特定标记的javascript代码。但此时调试器将仅判断在当前栈列表中是否有匹配的断点信息,若有则向与自身成功完成调试配对的调试工具发送断点命中数据结构;并暂停通过javascript引擎执行带有特定标记的javascript代码运行,若无则继续运行。
进入函数:当调试器由于断点命中或接收到调试指令中要求的暂停数据结构(如单步、进入函数、跳出函数及暂停调试数据结构),而处于暂停执行带有特定标记的javascript代码状态时,接收到与自身成功完成调试配对的调试工具发送的进入函数数据结构后,若当前暂停处的下一句带有特定标记的javascript代码的下一句为一条带有特定标记的javascript函数调用代码,则在被调用的带有特定标记的javascript代码的函数的第一行处暂停,并向与自身成功完成调试配对的调试工具发送断点命中数据结构,并暂停通过javascript引擎执行带有特定标记的javascript代码运行,若当前暂停处的下一句带有特定标记的javascript代码的下一句不是一条带有特定标记的javascript函数调用代码,则执行单步的逻辑流程。
跳出函数:当调试器由于断点命中或接收到调试控制数据结构中要求的暂停数据结构(如单步、进入函数、跳出函数及暂停调试数据结构),而处于暂停执行带有特定标记的javascript代码状态时,接收到与自身成功完成调试配对的调试工具发送的跳出函数数据结构后,若当前暂停处的位于带有特定标记的javascript代码的任意函数体内,且该函数体自暂停处到函数体结尾再无可用断点的情况下,调试器将直接运行到函数结束,并在上一层堆栈函数(调用当前函数的函数)中的调用代码处,向与自身成功完成调试配对的调试工具发送断点命中数据结构,并暂停通过javascript引擎执行带有特定标记的javascript代码运行。反之若暂停处至函数体结尾有可用断点,且有匹配断点时,则在匹配的断点处向与自身成功完成调试配对的调试工具发送断点命中数据结构,并暂停通过javascript引擎执行带有特定标记的javascript代码运行。若以上条件均不满足将执行继续调试的逻辑流程。
性能统计(性能统计单元对应实现的功能):调试器在堆栈管理单元的协助下完成性能统计任务,在使用javascript引擎执行带有特定标记的javascript代码时将在断点命中时,统计本次断点命中与上一次断点命中之间的javascript代码执行时间,并记录到断点命中数据结构,发送到与自身成功完成调试配对的调试工具中。另外调试器还对每个带有特定标记的javascript函数体的执行时间,以及性能统计参数要求的带有特定标记的javascript函数体中的所有javascript代码语句行的执行时间进行统计,并在合适的时机发送到与自身成功完成调试配对的调试工具中,以便于调试工具在合适的时机生成性能报告。
特别的由调试器主动发送给调试工具的通知型数据结构,不需要调试工具做出应答处理,如日志数据结构,断点命中数据结构等。但非通知型数据结构无论是调试工具还是调试器在接收到之后无论执行是否成功都必须采用与之匹配的相应应答数据结构发送给对方以做应答处理,如获取设备信息等。
调试工具能够实现的功能包括对原代码的加载及展示(展示包括代码结构展示及代码文本展示)、用于对调试器的性能统计单元返回的信息进行展示的性能分析视图、实现调试控制功能的调试控制工具栏、用于对调试器的日志单元返回的信息进行展示的日志视图、用于对调试器的堆栈管理单元返回的信息进行展示的堆栈视图、用于实现断点管理的断点管理视图、与调试器实现通信及获取调试器的预设参数信息,具体来说,基于上述调试控制协议能够实现的其包含的单元对应的功能具体包括:
展示(展示界面对应实现的功能):未带有特定标记的javascript代码加载及展示;未带有特定标记的javascript代码联动处理,即当接收到调试器发送的断点命中通知后能够根据调试器返回的信息,自动定位到未带有特定标记的javascript代码语句行位置并展示;进行未带有特定标记的javascript代码当前运行位置的界面提示,如在当前运行到的代码语句行做标记等;用户可通过界面快速定位浏览未带有特定标记的javascript代码,以便于用户进行断点管理操作(添加断点,启禁用断点,移除断点);
设备信息(设备信息发送单元对应实现的功能):向调试器发送本设备的预设参数信息;
界面接口:调试控制协议所规定的操作的界面接口实现,以供用户通过调用该界面接口通过调试工具实现调试指令的下发。
具体来说,用户对调试工具的使用可以包括:用户通过调试工具打开待调试的javascript代码,待调试的javascript代码为未带有特定标记的javascript代码,因为对于用户来说其编写的javascript代码是没有特定标记的,且在正常情况下发布的javascript代码也是不带有特定标记的,而加入的特定标记也仅作为调试器的必要输入参数。当用户通过调试工具加载未带有特定标记的javascript代码后,调试工具将通过未带特定标记的javascript代码的管理更新代码视图,通过配置文件(配置文件在调试工具第一次运行时不存在,仅在执行停止调试或关闭调试工具之后才会被创建)加载历史断点记录数据。其中,历史断点记录数据主要包含以下信息:断点状态:断点是否处于启用状态,是否处于禁用状态,是否是条件断点(条件断点即设置了命中条件的断点,只有带有特定标记的JavaScript代码执行到该断点指示的代码位置时,还必须满足断点所携带的命中条件才能命中断点);断点位置:断点在不带有特定标记的JavaScript代码中的位置,主要包括:所属代码语句行的行号,所属代码语句行所属的函数,所属函数所在的类等。而加载历史断点记录数据的作用主要是为了方便用户的使用,因为在调试过程中用户会设置数量不等的断点,若在被调试的程序(带有特定标记的JavaScript代码)行为(发生运行错误或逻辑错误等)出现不符合预期设计要求时,用户在终止程序并修复后该问题后,重新进行调试时,如果没有历史断点功能,用户将重新进行断点的设置工作。若当前程序代码量比较大时,且断点较多时,无疑用户每次调试时的重复加断点工作就已经是一项很具有挑战性的工作。
而调试器及调试工具实现上述功能的工作过程可以包括:
用户通过调试工具执行启动调试动作,此时调试工具将启动调试器(调试器作为一个独立进程运行),并将当前的网络参数(网络IP地址,网络端口号)以命令行参数的形式传递给调试器,并在启动调试器之后等待调试器的网络连接请求。
当调试工具接收到调试器的网络连接请求之后,调试工具将依据调试控制协议中定义的数据结构,向调试器发送调试配对指令。当调试工具和调试器配对完成之后,调试工具还将当前已经存在的断点参数,性能统计参数发送到调试器。当以上准备就绪之后调试工具将向调试器发送启动调试指令。
当调试器接收到调试工具发送的启动调试指令后,即开始执行所加载的带有特定标记的javascript代码,自此调试工具进入调试状态。
当调试工具进入调试状态后,用户可通过调试工具所提供的代码视图以及断点视图(包括各断点的状态等信息,如启用、禁用等),进行实时的断点增加、启禁用、移除等断点管理操作。当断点命中时亦可在代码展示视图中观察到未带有特定标记的javascript代码语句的执行耗时性能参数,也可在堆栈视图中观察到当前未带有特定标记的javascript代码执行的函数调用情况。
特别的当调试器与调试工具建立网络连接并成功完成调试配对之后,即可在调试工具的日志视图(用于展示调试器发送的日志数据)中实时观察到调试器所发送的日志数据,用户可从日志视图中获悉当前调试器的运行状态。
而调试器在实现调试过程中,当调试器的入栈函数被调用时,调试器将包含如下处理过程:在调用堆栈数据结构中压入一条带特定标记的javascript代码中即将进入的函数信息(函数信息通过入栈函数参数传递获取)。进行是否有进入函数中断请求判断,若有则向调试工具发送断点命中通知。从断点列表中加载属于当前堆栈的所有处于启用状态的断点信息到当前栈的断点列表中。当前栈指在程序运行中的函数调用关系链表,并将其以栈的形式展示的数据结构,其中栈数据结构是一种先进后出形的链表结构。当前栈通常为函数调用栈的栈顶记录所代表的当前程序运行环境,特别的在调试器的开发过程中当前栈也可以通过用户在堆栈视图中进行手动更改,用户通过更改当前栈可以在调试过程中对当前调用堆栈中不属于栈顶数据结构所代表的函数体中的变量进行取值、更改值以及变量类型识别等操作。当调试器的出栈函数被调用时,调试器将包含如下处理过程:在调用堆栈数据结构上弹出一条带特定标记的javascript代码中即将出栈的函数信息(函数信息通过出栈函数参数传递获取);进行是否有跳出函数中断请求判断,若有则向调试工具发送断点命中通知。当调试器的代码语句行改变函数被调用时,调试器将包含如下处理过程:调试器将检查当前栈的断点列表中是否有与当前代码语句行一致的断点信息,若有则向调试工具发送断点命中通知。简单来说,用户通过操作调试工具提供的界面接口触发调试工具的启动调试逻辑,通过调试工具启动调试器并通过命令行参数传递必要的网络参数等信息。调试器通过分析命令行参数获得调试工具网络参数,并加载带有特定标记的javascript代码,通过获取到的调试工具网络参数建立与调试工具之间的网络连接。当网络连接成功建立后进行调试配对。当成功完成调试配对后,调试器进入调试待命状态,等待调试工具的调试控制及参数配置指令(调试指令)。调试待命状态指调试器已经做好了调试前的所有准备工作,此时只要接收到调试工具的启动调试的调试指令即可进入调试状态。在整个调试过程中调试器均由调试工具进行驱动,具体为用户通过操作调试工具所提供的界面接口进行具体的调试工作。而调试工具所提供的界面接口在需要得到调试器的功能支持时,调试工具将遵循调试控制协议中数据结构进行功能调用的封装并通过网络通信单元发送到调试器中,待调试器处理完成后再将遵循调试控制协议中相应数据结构所定义的应答数据结构发送到调试工具中,以完整支持用户的整个调试工作。
本发明实施例还提供了一种javascript代码的调试控制方法,可以包括:
加载原代码,为原代码加入特定标记得到标记代码,其中,原代码为javascript代码,特定标记为调用调试器中对应函数实现进入函数、跳出函数或执行代码语句行的操作的函数;
执行标记代码,在执行标记代码的过程中,在用户基于原代码实现的控制下生成对应的调试指令,并基于调试指令通过控制与特定标记对应的函数控制标记代码的执行。
需要说明的是,本发明实施例提供的一种javascript代码的调试控制方法中相关部分的说明请参见本发明实施例提供的一种javascript代码的调试控制装置中对应部分的详细说明;另外,本发明实施例公开的技术方案中与现有技术中对应技术方案实现原理一致的部分并未详细说明,以免过多赘述。
最后,还需要说明的是,在本文中,诸如模块,结构等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且包括没有明确列出的其他要素,或者是包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“具体包括……”限定的要素,并不排除在包括要素的过程、方法、物品或者设备中还存在另外的相同要素。
对所公开的实施例的上述说明,使本领域技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
Claims (10)
1.一种javascript代码的调试控制系统,其特征在于,包括代码模块、调试器及调试工具,其中:
所述代码模块,用于:加载原代码,为所述原代码加入特定标记得到标记代码,其中,所述原代码为javascript代码,所述特定标记为调用所述调试器中对应函数实现进入函数、跳出函数或执行代码语句行的操作的函数;
所述调试工具,用于:加载所述原代码,以及在用户基于所述原代码实现的控制下发送相应调试指令至所述调试器;
所述调试器,用于:加载及执行所述标记代码,在执行所述标记代码的过程中接收所述调试工具发送的调试指令,并基于所述调试指令通过控制与所述特定标记对应的函数控制所述标记代码的执行,以实现对应的代码调试。
2.根据权利要求1所述的系统,其特征在于,所述调试器包括:
堆栈管理单元,用于:跟踪所述标记代码中的特定标记,并基于跟踪所得信息为所述标记代码维护包括表示函数调用关系的函数调用堆栈的堆栈数据结构,以支持所述调试器其他对应功能的实现。
3.根据权利要求2所述的系统,其特征在于,所述调试器包括:
断点管理单元,用于:在所述调试指令的触发下,为所述标记代码添加、启用、禁用、编辑或移除断点;
调试控制单元,用于:在所述调试指令的触发下,实现对应的调试控制功能,所述调试控制功能包括启动调试、停止调试、暂停调试、进入函数、跳出函数、单步及由暂停调试或命中断点状态返回的继续调试。
4.根据权利要求3所述的系统,其特征在于,所述调试器包括:
变量操作单元,用于:当在执行所述标记代码的过程中命中断点时,在所述调试指令的触发下实现针对指定变量的取值、更改值、变量类型识别的操作。
5.根据权利要求4所述的系统,其特征在于,所述调试器包括:
断点命中通知单元,用于:按照所述调试指令暂停调试或命中断点时,将当前执行到的代码语句行的行号、当前代码语句行所属对象、当前代码语句行所属函数以及当前的函数调用堆栈发送给所述调试工具。
6.根据权利要求5所述的系统,其特征在于,所述调试器包括:
应用关闭通知单元,用于:当所述用户手动关闭所述标记代码的程序或所述标记代码的程序自行关闭时,向所述调试工具发送应用关闭通知,以告知所述调试工具所述调试器即将关闭。
7.根据权利要求6所述的系统,其特征在于,所述调试器包括:
性能统计单元,用于:在执行所述标记代码的过程中,统计所述标记代码的代码语句行、任意相邻两个断点之间的代码语句行及各函数分别执行的时间,并上报给所述调试工具。
8.根据权利要求7所述的系统,其特征在于,所述调试器包括:
日志上报单元,用于:向所述调试工具发送所述调试器当前的日志数据,以告知所述用户所述调试器的运行状态;
所述调试器及所述调试工具均包括:
设备信息发送单元,用于:向所述调试工具或所述调试器发送本设备的预设参数信息。
9.根据权利要求8所述的系统,其特征在于,所述调试工具包括:
展示界面,用于:展示加载得到的原代码、所述原代码中与执行的标记代码当前运行位置对应的位置及所述调试器返回的各项信息。
10.一种javascript代码的调试控制方法,其特征在于,包括:
加载原代码,为所述原代码加入特定标记得到标记代码,其中,所述原代码为javascript代码,所述特定标记为调用所述调试器中对应函数实现进入函数、跳出函数或执行代码语句行的操作的函数;
执行所述标记代码,在执行所述标记代码的过程中,在用户基于所述原代码实现的控制下生成对应的调试指令,并基于所述调试指令通过控制与所述特定标记对应的函数控制所述标记代码的执行。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811644744.1A CN109669876B (zh) | 2018-12-30 | 2018-12-30 | 一种javascript代码的调试控制方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811644744.1A CN109669876B (zh) | 2018-12-30 | 2018-12-30 | 一种javascript代码的调试控制方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109669876A true CN109669876A (zh) | 2019-04-23 |
CN109669876B CN109669876B (zh) | 2022-03-08 |
Family
ID=66146703
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811644744.1A Active CN109669876B (zh) | 2018-12-30 | 2018-12-30 | 一种javascript代码的调试控制方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109669876B (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112199261A (zh) * | 2019-07-08 | 2021-01-08 | 腾讯科技(深圳)有限公司 | 应用程序性能分析方法及装置、电子设备 |
CN112199274A (zh) * | 2020-09-18 | 2021-01-08 | 北京大学 | 基于V8引擎的JavaScript动态污点跟踪方法及电子装置 |
CN112214392A (zh) * | 2019-07-10 | 2021-01-12 | 腾讯科技(深圳)有限公司 | Js代码调试方法、装置、终端及存储介质 |
CN113971124A (zh) * | 2020-07-24 | 2022-01-25 | 腾讯科技(深圳)有限公司 | 子应用的调试方法、装置、计算机设备和存储介质 |
CN114422857A (zh) * | 2021-12-28 | 2022-04-29 | 炫彩互动网络科技有限公司 | 一种iptv机顶盒上的网页调试方法及机顶盒 |
CN115481021A (zh) * | 2022-09-01 | 2022-12-16 | 上海弘玑信息技术有限公司 | 自动化流程的调试方法、电子设备及存储介质 |
CN116610483A (zh) * | 2023-07-19 | 2023-08-18 | 北京合思信息技术有限公司 | 用户操作轨迹的还原方法、装置、电子设备及介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101014049A (zh) * | 2007-02-14 | 2007-08-08 | 中兴通讯股份有限公司 | 一种终端无线通信协议栈软件定时器管理方法 |
CN101719093A (zh) * | 2009-12-09 | 2010-06-02 | 上海普元信息技术有限责任公司 | 企业Web应用系统中实现跨浏览器Javascript调试的系统及其方法 |
US8977845B2 (en) * | 2007-04-12 | 2015-03-10 | International Business Machines Corporation | Methods and apparatus for access control in service-oriented computing environments |
CN105630669A (zh) * | 2014-11-20 | 2016-06-01 | 埃森哲环球服务有限公司 | 基于web的应用的自动化测试 |
-
2018
- 2018-12-30 CN CN201811644744.1A patent/CN109669876B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101014049A (zh) * | 2007-02-14 | 2007-08-08 | 中兴通讯股份有限公司 | 一种终端无线通信协议栈软件定时器管理方法 |
US8977845B2 (en) * | 2007-04-12 | 2015-03-10 | International Business Machines Corporation | Methods and apparatus for access control in service-oriented computing environments |
CN101719093A (zh) * | 2009-12-09 | 2010-06-02 | 上海普元信息技术有限责任公司 | 企业Web应用系统中实现跨浏览器Javascript调试的系统及其方法 |
CN105630669A (zh) * | 2014-11-20 | 2016-06-01 | 埃森哲环球服务有限公司 | 基于web的应用的自动化测试 |
Non-Patent Citations (1)
Title |
---|
张令芬: "JavaScript API自动化测试方案的管理设计与实现", 《电子设计工程》 * |
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112199261A (zh) * | 2019-07-08 | 2021-01-08 | 腾讯科技(深圳)有限公司 | 应用程序性能分析方法及装置、电子设备 |
CN112199261B (zh) * | 2019-07-08 | 2023-12-26 | 腾讯科技(深圳)有限公司 | 应用程序性能分析方法及装置、电子设备 |
CN112214392A (zh) * | 2019-07-10 | 2021-01-12 | 腾讯科技(深圳)有限公司 | Js代码调试方法、装置、终端及存储介质 |
CN112214392B (zh) * | 2019-07-10 | 2024-01-30 | 腾讯科技(深圳)有限公司 | Js代码调试方法、装置、终端及存储介质 |
CN113971124A (zh) * | 2020-07-24 | 2022-01-25 | 腾讯科技(深圳)有限公司 | 子应用的调试方法、装置、计算机设备和存储介质 |
CN112199274A (zh) * | 2020-09-18 | 2021-01-08 | 北京大学 | 基于V8引擎的JavaScript动态污点跟踪方法及电子装置 |
CN112199274B (zh) * | 2020-09-18 | 2022-05-03 | 北京大学 | 基于V8引擎的JavaScript动态污点跟踪方法及电子装置 |
CN114422857A (zh) * | 2021-12-28 | 2022-04-29 | 炫彩互动网络科技有限公司 | 一种iptv机顶盒上的网页调试方法及机顶盒 |
CN115481021A (zh) * | 2022-09-01 | 2022-12-16 | 上海弘玑信息技术有限公司 | 自动化流程的调试方法、电子设备及存储介质 |
CN116610483A (zh) * | 2023-07-19 | 2023-08-18 | 北京合思信息技术有限公司 | 用户操作轨迹的还原方法、装置、电子设备及介质 |
Also Published As
Publication number | Publication date |
---|---|
CN109669876B (zh) | 2022-03-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109669876A (zh) | 一种javascript代码的调试控制方法及系统 | |
US20140109051A1 (en) | Cloud-based software testing | |
Kothari et al. | Deriving state machines from TinyOS programs using symbolic execution | |
CN106970789A (zh) | 一种Android端基于AOP和AspectJ的日志自动埋点方法及系统 | |
US20140109057A1 (en) | Software development kit testing | |
CN101084485A (zh) | 用于改善片上仿真系统中高级语言的仿真速度的装置和方法 | |
Duo et al. | Formal analysis of smart contract based on colored petri nets | |
CN109670664A (zh) | 基于工作流的流程实施方法、用户设备、存储介质及装置 | |
CN104731566A (zh) | 集成开发环境测试装置、方法及系统 | |
US9471454B2 (en) | Performing automated system tests | |
CN106201896A (zh) | 一种嵌入式环境下基于检查点的调试方法、系统及装置 | |
CN109358975A (zh) | 一种软件运行异常的分析方法、装置、电子设备及存储介质 | |
CN109460307A (zh) | 基于日志埋点的微服务调用跟踪方法及其系统 | |
CN107577593A (zh) | 使用执行单一步骤来诊断编码 | |
CN109144873A (zh) | 一种linux内核处理方法及装置 | |
US6598181B1 (en) | Method and system for debugging multiple function calls | |
CN102708015A (zh) | 基于cpu不可屏蔽中断系统问题诊断的调试方法 | |
CN106445787B (zh) | 一种监控服务器核心转储文件的方法、装置及电子设备 | |
CN101727388B (zh) | 一种网络计算机系统行为远程调试方法及其装置 | |
US20050241000A1 (en) | Security hole diagnostic system | |
CN1329839C (zh) | 一种计算机cpu抗干扰的设计方法 | |
CN101256491B (zh) | 基于工作流的可信软件过程的定义方法 | |
CN109286608A (zh) | 调用链处理方法、装置及存储设备、计算机设备 | |
CN105913226A (zh) | 基于智能语音提示的核电厂运行支持系统 | |
CN111796911A (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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |