CN113971124A - 子应用的调试方法、装置、计算机设备和存储介质 - Google Patents
子应用的调试方法、装置、计算机设备和存储介质 Download PDFInfo
- Publication number
- CN113971124A CN113971124A CN202010728342.0A CN202010728342A CN113971124A CN 113971124 A CN113971124 A CN 113971124A CN 202010728342 A CN202010728342 A CN 202010728342A CN 113971124 A CN113971124 A CN 113971124A
- Authority
- CN
- China
- Prior art keywords
- debugging
- code
- application
- function
- sub
- 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
- 238000000034 method Methods 0.000 title claims abstract description 65
- 238000013519 translation Methods 0.000 claims abstract description 161
- 230000004044 response Effects 0.000 claims abstract description 10
- 230000006870 function Effects 0.000 claims description 374
- 238000011161 development Methods 0.000 claims description 91
- 238000010276 construction Methods 0.000 claims description 23
- 238000004590 computer program Methods 0.000 claims description 15
- 230000008569 process Effects 0.000 claims description 15
- 238000010586 diagram Methods 0.000 description 14
- 238000012545 processing Methods 0.000 description 10
- 238000004891 communication Methods 0.000 description 6
- 238000004088 simulation Methods 0.000 description 6
- 239000000284 extract Substances 0.000 description 4
- 230000007958 sleep Effects 0.000 description 4
- 230000001360 synchronised effect Effects 0.000 description 4
- 238000005516 engineering process Methods 0.000 description 3
- 230000003993 interaction Effects 0.000 description 3
- 238000012544 monitoring process Methods 0.000 description 3
- 238000001514 detection method Methods 0.000 description 1
- 230000002452 interceptive effect Effects 0.000 description 1
- 239000004973 liquid crystal related substance Substances 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 230000003068 static effect Effects 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/3668—Software testing
- G06F11/3672—Test management
- G06F11/3688—Test management for test execution, e.g. scheduling of test suites
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
- G06F2009/45566—Nested virtual machines
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Debugging And Monitoring (AREA)
Abstract
本申请涉及一种子应用的调试方法、装置、计算机设备和存储介质。所述方法包括:获取与待调试的子应用对应的转译代码;转译代码通过对子应用的应用代码转译得到,且转译代码中包括断点函数和调试函数;获取代码运行指令;代码运行指令中携带有断点信息;响应于代码运行指令,在由母应用提供的运行环境中运行转译代码,当运行至断点信息指向的中断位置时调用断点函数中断运行;当接收到代码调试指令时,通过转译代码中与中断位置相对应的调试函数对子应用进行调试。采用本方法能够提升子应用的调试准确性。
Description
技术领域
本申请涉及计算机技术领域,特别是涉及一种子应用的调试方法、装置、计算机设备和存储介质。
背景技术
随着计算机技术的发展,出现了越来越多的应用程序。应用程序包括子应用和母应用。其中,母应用是运行于操作系统上的原生应用,而子应用是能够在母应用提供的运行环境中运行的应用。
在基于终端使用子应用的过程中,子应用的运行状况,往往是影响用户体验的关键因素,因此,在发布子应用之前,开发人员会对子应用的应用代码进行相应调试。目前主要是通过在电脑端模拟出子应用的运行环境,基于模拟出的运行环境来调试子应用。然而,移动终端中的真实运行环境与模拟出的运行环境往往并不完全相同,因而存在子应用调试不准确的问题。
发明内容
基于此,有必要针对上述技术问题,提供一种能够提升调试准确性的子应用的调试方法、装置、计算机设备和存储介质。
一种子应用的调试方法,所述方法包括:
获取与待调试的子应用对应的转译代码;所述转译代码通过对所述子应用的应用代码转译得到,且所述转译代码中包括断点函数和调试函数;
获取代码运行指令;所述代码运行指令中携带有断点信息;
响应于所述代码运行指令,在由所述母应用提供的运行环境中运行所述转译代码,当运行至所述断点信息指向的中断位置时调用所述断点函数中断运行;
当接收到代码调试指令时,通过所述转译代码中与所述中断位置相对应的调试函数对所述子应用进行调试。
一种子应用的调试装置,所述装置包括:
转译代码获取模块,用于获取与待调试的子应用对应的转译代码;所述转译代码通过对所述子应用的应用代码转译得到,且所述转译代码中包括断点函数和调试函数;
运行指令获取模块,用于获取代码运行指令;所述代码运行指令中携带有断点信息;响应于所述代码运行指令,在由母应用提供的运行环境中运行所述转译代码,当运行至所述断点信息指向的中断位置时调用所述断点函数中断运行;
调试指令获取模块,用于当接收到代码调试指令时,通过所述转译代码中与所述中断位置相对应的调试函数对所述子应用进行调试。
在一个实施例中,运行指令获取模块还包括线程创建模块,用于创建输入输出线程,并通过所述输入输出线程获取代码运行指令;当主任务队列监听到所述输入输出线程获取到当次调试的代码运行指令时,通过所述主任务队列启动应用调试线程,并通过所述应用调试线程执行所述在由所述母应用提供的运行环境中运行所述转译代码,当运行至所述断点信息指向的中断位置时调用所述断点函数中断运行的步骤。
在一个实施例中,线程创建模块还用于当所述主任务队列中的子任务队列监听到所述输入输出线程获取到当次调试的代码调试指令时,通过所述应用调试线程执行所述转译代码中与所述中断位置相对应的调试函数,以对所述子应用进行调试。
在一个实施例中,线程创建模块还用于获取在对所述子应用进行调试时与各中断位置分别对应的代码调试信息,并通过所述应用调试线程将所述代码调试信息传递至所述输入输出线程;通过所述输入输出线程将所述代码调试信息发送至子应用开发平台;发送的代码调试信息用于指示所述子应用开发平台对所述代码调试信息进行分析得到调试结果。
在一个实施例中,调试指令获取模块还包括指令解析模块,用于当接收到代码调试指令时,对所述代码调试指令进行解析,得到指令类型;确定位于所述转译代码中的,与所述指令类型以及所述中断位置相对应的调试函数;基于确定的所述调试函数对所述子应用进行调试,得到代码调试信息。
在一个实施例中,调试函数包括上下文获取函数;解析模块还用于通过所述上下文获取函数确定所述转译代码中与所述中断位置相关的执行上下文;将所述执行上下文作为所述子应用的代码调试信息;执行上下文用于分析代码运行环境。
在一个实施例中,调试函数包括调用栈构建函数;解析模块还用于通过所述调用栈构建函数确定位于所述转译代码中的,与所述中断位置相对应的目标函数;通过所述调用栈构建函数获取所述目标函数的函数调用栈,并将所述目标函数的函数调用栈作为所述子应用的代码调试信息。
在一个实施例中,上述子应用的调试装置还包括代码转译模块,用于通过子应用开发平台获取子应用的应用代码;通过所述子应用开发平台遍历所述应用代码中的语句,并确定遍历的各语句的语句类型;当遍历的所述语句的语句类型为目标类型时,通过所述子应用开发平台对遍历的所述语句进行转译。
在一个实施例中,代码转译模块还用于当遍历的所述语句的语句类型为函数构造类型时,通过所述子应用开发平台确定与遍历的所述语句相对应的函数体;通过所述子应用开发平台在所述函数体中添加调试函数;当遍历的所述语句的语句类型为基础语句类型时,通过所述子应用开发平台在遍历的所述语句中添加断点函数;根据添加有调试函数和断点函数的应用代码,确定对应的转译代码。
在一个实施例中,上述子应用的调试装置还包括中断退出模块,用于当产生中断退出指令时退出当次调试过程,并确定下一次调试的断点信息;从当次的中断位置处继续运行所述转译代码,当运行至下一次调试的断点信息指向的下一次的中断位置时调用所述断点函数中断运行;当接收到下一次调试的代码调试指令时,通过所述转译代码中与所述下一次的中断位置相对应的调试函数对所述子应用进行调试。
一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现以下步骤:
获取与待调试的子应用对应的转译代码;所述转译代码通过对所述子应用的应用代码转译得到,且所述转译代码中包括断点函数和调试函数;
获取代码运行指令;所述代码运行指令中携带有断点信息;
响应于所述代码运行指令,在由所述母应用提供的运行环境中运行所述转译代码,当运行至所述断点信息指向的中断位置时调用所述断点函数中断运行;
当接收到代码调试指令时,通过所述转译代码中与所述中断位置相对应的调试函数对所述子应用进行调试。
一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现以下步骤:
获取与待调试的子应用对应的转译代码;所述转译代码通过对所述子应用的应用代码转译得到,且所述转译代码中包括断点函数和调试函数;
获取代码运行指令;所述代码运行指令中携带有断点信息;
响应于所述代码运行指令,在由所述母应用提供的运行环境中运行所述转译代码,当运行至所述断点信息指向的中断位置时调用所述断点函数中断运行;
当接收到代码调试指令时,通过所述转译代码中与所述中断位置相对应的调试函数对所述子应用进行调试。
上述子应用的调试方法、装置、计算机设备和存储介质,通过获取待调试的子应用对应的转译代码,可以在获取得到代码运行指令时,基于代码运行指令运行转译代码至中断位置,并中断转译代码的运行,进入调试状态;通过获取代码调试指令,可以根据代码调试指令确定转译代码中的与中断位置相对应的调试函数,从而根据调试函数对子应用进行调试。由于本申请所获取的代码为转译代码,而转译代码已预先注入有断点函数和调试函数,因此,本申请可以直接在移动终端方便快捷的实现代码的中断和调试,相比于传统的在模拟运行环境中调试子应用,本申请可以大大减少由于真实运行环境与模拟运行环境之间的差异而导致调试不准确的概率,从而提升子应用的调试准确性。
附图说明
图1为一个实施例中子应用的调试方法的应用环境图;
图2为一个实施例中子应用的调试方法的流程示意图;
图3为一个实施例中调试界面的示意图;
图4为一个实施例中嵌套队列的示意图;
图5为一个实施例中子应用调试系统的系统架构图;
图6为一个实施例中第一终端与第二终端之间的交互时序图;
图7为一个具体实施例中子应用的调试方法的流程示意图;
图8为另一个具体实施例中子应用的调试方法的流程示意图;
图9为一个实施例中子应用的调试装置的结构框图;
图10为另一个实施例中子应用的调试装置的结构框图;
图11为一个实施例中计算机设备的内部结构图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
本申请提供的子应用的调试方法,可以应用于如图1所示的应用环境中。其中,第一终端102通过网络与服务器104进行通信,服务器104通过网络与第二终端106进行通信。第一终端102为与开发人员对应的终端,其中运行有子应用开发平台。第二终端106为移动终端,也就是能提供子应用的运行场景的终端。第二终端可预先获取子应用的转译代码,该转译代码通过对子应用的应用代码进行转译得到。其中,该转译代码中包括有断点函数和调试函数。第一终端102可以基于子应用开发平台生成代码调试指令,并将代码调试指令通过服务器104发送至第二终端106,以使第二终端106根据代码调试指令对应调试子应用,得到调试信息,并将调试信息通过服务器104返回至第一终端102。其中,第一终端102可以但不限于是各种个人计算机、笔记本电脑、智能手机、平板电脑和便携式可穿戴设备。第二终端106具体可以是移动终端,比如智能手机、平板电脑或便携式可穿戴设备等。服务器104可以用独立的服务器或者是多个服务器组成的服务器集群来实现。
应当理解,尽管术语第一、第二等可以在此用来描述各种元素,但这些元素不应该受限于这些术语。这些术语仅用来将这些元素彼此区分开。例如,在不脱离本发明范围的前提下,第一终端可以被称为第二终端,并且类似地,第二终端可以被称为第一终端。第一终端和第二终端均为终端,但它们并非同一终端。
在一个实施例中,如图2所示,提供了一种子应用的调试方法,以该方法应用于图1中的第二终端为例进行说明,包括以下步骤:
步骤S202,获取与待调试的子应用对应的转译代码;转译代码通过对所述子应用的应用代码转译得到,且所述转译代码中包括断点函数和调试函数。
其中,子应用是能够在母应用提供的运行环境中运行的应用,母应用则是运行于操作系统上并为子应用提供运行环境的原生应用。母应用为子应用的运行提供环境,创建用于实现子应用的逻辑层处理单元和视图层处理单元。视图层处理单元用于处理子应用的视图;逻辑层处理单元用于处理子应用的交互逻辑。处理单元具体可以是进程或者线程,如逻辑层线程和相应的视图层线程。逻辑层处理单元可运行于虚拟机中,如JavaScript虚拟机等。
子应用的应用代码是指能够与母应用提供的公共资源结合以实现子应用不同功能的代码合集。公共资源比如构建子应用的公共组件、实现公用功能的逻辑代码以及实现公用样式的样式代码等中的至少一种。通过对子应用的应用代码进行转译,可以得到对应的转译代码。转译代码包括调试函数和断点函数,其中,调试函数是指用于对待调试子应用进行调试的一段代码。比如,当转译代码如下时:
_setEval函数以及_tryCatchWrap函数即为调试函数,基于_setEval函数可以获取转译代码的执行上下文信息;基于_tryCatchWrap函数可以获取转译代码中的各函数之间的调用关系。“function”为函数定义关键字;“fn”为函数名。
断点函数是指中断转译代码运行的函数,当调用断点函数时,可以中断代码的运行。
具体地,当需要对待调试的子应用进行真机调试时,开发人员可以通过第一终端中运行的子应用开发平台上传子应用的应用代码,从而子应用开发平台对应用代码进行转译,得到转译代码,并将转译代码发送至第二终端。其中,子应用开发平台是指子应用的开发管理系统,基于子应用的开发管理系统不仅可以对子应用进行开发,而且可以对子应用进行相应调试,比如,当子应用开发平台为小程序开发工具时,开发人员可以通过小程序开发工具向在第二终端中运行的小程序发送小程序调试指令,从而实现小程序的真机调试。
在一个实施例中,当需要对子应用的应用代码进行转译时,子应用开发平台对所属集群内其他服务器的负载进行监测,将负载最低的服务器确定为目标服务器,将子应用的应用代码发送至目标服务器,使目标服务器对子应用的应用代码进行转译。服务器的负载包括CPU资源使用率和内存占用率等。将多个子应用的应用代码分配至集群内负载最低的服务器进行处理,可以提高子应用的应用代码转译效率。
步骤204,获取代码运行指令;代码运行指令中携带有断点信息。
其中,断点信息是中断位置信息,具体可以是转译代码中的某行代码所对应的行号或列号,或其他可以表示代码位置的信息。具体地,开发人员在需要对子应用进行调试时,可确定当前调试需要中断的具体位置,并根据该中断位置所对应的断点信息触发第一终端生成并发送代码运行指令。进而第一终端可将携带有断点信息的代码运行指令传输至第二终端。
具体地,参考图3,当子应用开发平台获取得到子应用的应用代码时,子应用开发平台通过如图3所示的调试界面对应展示子应用的应用代码。图3示出了一个实施例中调试界面的示意图。容易理解地,子应用开发平台可以在对子应用的应用代码进行转译的同时,展示调试界面,也可以在对应用代码转译完成之后,展示调试界面,本申请实施例对此不做限定。
参见图3,该调试界面可以包括第一区域(左边区域)和第二区域(右边区域),第一区域用于显示应用代码列表以及当前调试的语句;第二区域用于显示应用代码中的当前调试语句的相关变量。在一个实施例中,第一区域高亮显示当前调试的语句,以及当前调试的语句在应用代码列表中的行号和列号。
进一步地,第一终端在显示应用代码时,开发人员可以在调试界面中设置中断位置,从而第一终端根据中断位置确定对应的断点信息,根据断点信息生成代码运行指令,并将代码运行指令发送至第二终端。其中,断点信息指向中断位置,中断位置是指运行至当前待调试的语句时,中断运行的位置信息。断点信息具体可以为中断位置所指向的语句所在的行号和列号。
在一个实施例中,当子应用开发平台对待调试的子应用的应用程序进行转译,得到转译代码时,子应用开发平台获取待调试的子应用的应用信息,并根据获取得到的应用信息生成对应的标识码,从而开发人员只需扫描标识码,即可使子应用开发平台对应展示待调试子应用的调试界面,并在调试界面中以列表的形式显示应用代码。其中,标识码包括二维码、条形码等。
在一个实施例中,当第一终端显示待调试的子应用的应用代码时,开发人员可以选中应用代码中的待调试语句,并将选中的待调试语句所在的位置作为断点位置。当确定开发人员触发了代码运行控件时,第一终端获取断点位置的行号和列号,将行号和列号作为断点信息,基于断点信息生成代码运行指令。比如,如图3所示,当开发人员选中应用代码中的“var set=new set(1,2,3,4)”语句时,第一终端将“var set=new set(1,2,3,4)”作为待调试的语句,与此同时,第一终端获取“var set=new set(1,2,3,4)”在应用代码列表中的行号115和列号5,将行号115以及列号5作为生成代码运行指令所需的断点信息。
在一个实施例中,当接收到选中指令时,第一终端直接将被选中的语句作为断点信息,以使第二终端可以根据被选中的语句确定中断位置。
在一个实施例中,开发人员可以在应用代码中选择多条待调试的语句,基于被选中的多条待调试的语句,确定多个中断位置。第一终端组合多个中断位置的位置信息,得到断点信息,并根据断点信息生成代码运行指令。其中,多个是指两个或两个以上。
步骤S206,响应于代码运行指令,在由母应用提供的运行环境中运行转译代码,当运行至断点信息指向的中断位置时调用断点函数中断运行。
具体地,第二终端创建应用调试线程,并基于创建的应用调试线程在由母应用提供的运行环境中运行转译代码,以响应代码运行指令。其中,应用调试线程为运行转译代码的线程,当转译代码是以JS(Javascript)脚本语言编写而成的脚本代码时,应用调试线程具体可以为JS线程。
第二终端提取代码运行指令中的断点信息,当应用调试线程运行转译代码至断点位置信息指向的中断位置时,通过调用断点函数中断转译代码的运行。在一个实施例中,断点函数具体可以为同步函数,第二终端通过调用同步函数休眠应用调试线程,从而中断转译代码的运行。
在一个实施例中,当运行转译代码之前,第二终端对母应用提供的运行环境进行环境检测,当母应用所提供的运行环境不符合调试要求时,第二终端生成相应的提示信息,并将提示信息返回至第一终端进行显示。通过预先对运行环境进行检测,可以减少由于运行环境不符合预设要求而导致调试失败的概率。
步骤S208,当接收到代码调试指令时,通过转译代码中与中断位置相对应的调试函数对子应用进行调试。
具体地,开发人员可以通过调试界面设置代码调试指令,从而第一终端将代码调试指令发送至第二终端,以使第二终端调用应用调试线程响应代码调试指令,从而应用调试线程通过调用转译代码中与中断位置相对应的调试函数,对子应用进行调试。容易理解地,当接收到代码调试指令时,应用调试线程可以通过调用与中断位置所指向的语句处于同一函数体内的全部调试函数,来对子应用进行调试,也可以通过调用与中断位置所指向的语句处于同一函数体内的部分调试函数,来对子应用进行调试,本申请实施例对此不做限定。比如,当调试指令为获取中断位置处的执行上下文信息时,应用调试线程获取与中断位置所指向的语句处于同一函数体内的_setEval函数,通过调用_setEval函数确定中断位置处的执行上下文信息。其中,函数包括函数首部和函数体;函数体是指编程语言中实现一个函数功能的所有代码组成的整体,其一般由符号“{”开始,到符号“}”结束。
在一个实施例中,开发人员可以通过调试界面输入调试数据,并通过代码调试指令将调试数据发送至第二终端。其中,调试数据为第一终端根据用户的调试操作获得的操作数据。当第二终端接收得到调试数据时,可以将调试数据作为输入,发送至应用调试线程,由应用调试线程执行调试数据中的逻辑,得到调试信息。
在一个实施例中,第一终端在接收到第二终端返回的调试信息时,可以刷新调试界面,显示该调试信息。
上述子应用的调试方法中,通过获取待调试的子应用对应的转译代码,可以在获取得到代码运行指令时,基于代码运行指令运行转译代码至中断位置,并中断转译代码的运行,进入调试状态;通过获取代码调试指令,可以根据代码调试指令确定转译代码中的与中断位置相对应的调试函数,从而根据调试函数对子应用进行调试。由于本申请所获取的代码为转译代码,而转译代码已预先注入有断点函数和调试函数,因此,本申请可以直接在移动终端方便快捷的实现代码的中断和调试,相比于传统的在模拟运行环境中调试子应用,本申请可以大大减少由于真实运行环境与模拟运行环境之间的差异而导致调试不准确的概率,从而提升子应用的调试准确性。
在一个实施例中,子应用的应用代码的转译步骤包括:通过子应用开发平台获取子应用的应用代码;通过子应用开发平台遍历应用代码中的语句,并确定遍历的各语句的语句类型;当遍历的语句的语句类型为目标类型时,通过子应用开发平台对遍历的语句进行转译。
其中,目标类型包括函数构造类型和基础语句类型。其中,函数构造类型是指函数构造语句所对应的类型,函数构造语句具体可以为函数首部,比如,当应用代码是由JS脚本语言编写而成的脚本代码时,函数构造类型所对应的函数首部可以为“function fn()”。其中,“function”为函数定义关键字;“fn”为函数名。
基础语句类型是指基础语句所对应的类型。基础语句是指函数体内用以实现函数所对应的方法的语句,基础语句具体可以为包含有“VariableDeclaration”关键字的变量定义语句、包含有“ExpressionStatement”关键字的表达式语句、包含有“IfStatement”的if语句、包含有“SwitchStatement”的switch语句、包含有“ReturnStatement”的return语句以及包含有“DebuggerStatement”的debugger语句等。
具体地,当通过子应用开发平台获取得到待调试子应用的应用代码时,子应用开发平台对应用代码中的每条语句进行遍历,并提取遍历的各语句中的关键字,根据关键字确定对应各语句的语句类型。子应用平台获取预设的目标语句的目标类型,在当前遍历语句的语句类型属于目标类型时,对当前遍历的语句进行转译。
在其中一个实施例中,第一终端向子应用的应用代码中注入代码调试指令解析函数,以实现应用代码的转译,从而第二终端在接收到代码调试指令时,可以基于代码调试指令解析函数对代码调试指令进行解析,并根据解析结果调用对应的调试函数,以完成子应用的调试。
在其中一个实施例中,第一终端获取预设的正则表达式,根据预设的正则表达式提取当前遍历语句中的关键字,根据提取出的关键字确定语句类型。比如,当提取出的关键字为“if”时,判定当前遍历语句的语句类型为基础语句类型;当提取出的关键字为“function”时,判定当前遍历语句的语句类型为函数构造类型。
上述实施例中,当获取得到子应用的应用代码时,通过对应用代码中的至少一条语句进行遍历,以根据语句类型来确定遍历的各个语句中需要进行转译的目标语句,这样,即可实现对应用代码的自定义转译。此外,通过对应用代码中的各语句进行遍历,并确定当前遍历语句的语句类型,在当前遍历语句的语句类型为目标类型时,才对当前遍历语句进行转译,可以减少不必要的转译过程,从而提升代码转译效率。
在一个实施例中,当遍历的语句的语句类型为目标类型时,通过子应用开发平台对遍历的语句进行转译,包括:当遍历的语句的语句类型为函数构造类型时,通过子应用开发平台确定与遍历的语句相对应的函数体;通过子应用开发平台在函数体中添加调试函数;当遍历的语句的语句类型为基础语句类型时,通过子应用开发平台在遍历的语句中添加断点函数;根据添加有调试函数和断点函数的应用代码,确定对应的转译代码。
其中,断点函数包括位置标识函数和同步函数。位置标识函数用以标识语句在代码列表中的位置信息;同步函数用以中断转译代码的运行。
具体地,在当前遍历语句的语句类型为函数构造类型时,第一终端中的子应用开发平台确定与当前遍历语句相对应的函数体,并在函数体中添加预设的调试函数。比如,当应用代码如下时:
子应用开发平台确定当前遍历语句为“function fn()”,根据“function fn()”相对应的函数体,从而在函数体中添加预设的_setEval函数以及_tryCatchWrap函数,得到转译后的代码:
在当前遍历语句的语句类型为基础语句类型时,子应用开发平台确定当前遍历语句在未转译的应用代码列表中的位置信息,根据当前遍历语句在未转译的应用代码列表中的位置信息,在当前遍历语句中添加位置标识函数。其中,位置信息具体可以为当前遍历语句在未转译的应用代码列表中的行号和列号。比如,在当前遍历语句为“var c=a+b”,“varc=a+b”在未转译的应用列表中的行号为11、列号为3时,子应用开发平台根据行号11、列号3生成位置标识函数“_int(11,3)”,并将位置标识函数“_int(11,3)”添加至“var c=a+b”,得到与当前遍历语句相对应的转译后的语句“_int(11,3);var c=a+b”。
与此同时,子应用开发平台对应生成一个同步函数,并建立同步函数与位置标识函数之间的调用关系,以使当应用调试线程调用位置标识函数时能够基于位置标识函数调用同步函数,从而使得应用调试线程中断转译代码的运行。值得注意的是,子应用开发平台可以为每个位置标识函数均设置一个相对应的同步函数,从而不同的位置标识函数可以调用不同的同步函数;也可以为每个位置标识函数设置同一同步函数,从而不同的位置标识函数均调用同一个同步函数,本申请的实施例对此不做限定。
进一步地,当应用代码遍历完毕时,子应用开发平台根据添加有调试函数和断点函数的应用代码,确定对应的转译代码。比如,在上述举例中,转译代码可以为:
在其中一个实施例中,在当前遍历语句的语句类型为函数构造类型时,子应用开发平台确定与当前遍历语句的相邻,且位于当前遍历语句的语句之后的,用以表征函数起始位置的符号“{”,以及与符号“{”相匹配的用以表征函数结束位置的符号“}”,根据“{”以及“}”,确定与当前遍历的语句所对应的函数体。
在其中一个实施例中,转译代码包括至少一条语句;当运行至断点信息指向的中断位置时调用断点函数中断运行包括:确定当前运行语句中的当前位置标识函数;在当前位置标识函数中的位置信息与代码运行指令中的断点信息相匹配时,通过当前位置标识函数调用对应的同步函数中断转译函数的运行。
当接收到代码运行指令时,第二终端基于代码运行指令控制转译代码的运行。第二终端确定当前运行的语句,并在当前运行语句中包含有当前位置标识函数时,提取当前位置标识函数中的位置信息。
第二终端将提取出的当前位置标识函数中的位置信息与代码运行指令中的断点信息进行匹配,当匹配成功时,第二终端通过当前位置标识函数调用同步函数,中断转译代码的运行。当匹配失败时,第二终端获取下一顺序运行语句,并基于上述方法确定下一顺序运行语句是否为断点信息所指向的中断位置。如此迭代,直至第二终端通过位置标识函数确定断点信息所指向的中断位置。比如,第二终端将当前位置标识函数中的行号、列号与断点信息中的行号、列号进行匹配,在当前位置标识函数中的行号、列号与断点信息中的行号、列号一致时,第二终端中断转译代码的运行;在当前位置标识函数中的行号、列号与断点信息中的行号、列号不一致时,第二终端获取下一顺序运行语句。
由于可以将位置标识函数所携带的位置信息与断点信息进行位置匹配,因此可以基于位置标识函数准确判定断点信息所指向的中断位置,从而可以根据断点信息所指向的中断位置对子应用进行调试。
上述实施例中,由于可以在函数体内添加调试函数,因此可以通过调用调试函数以响应代码调试指令;由于可以在具有目标类型的语句中添加断点函数,因此可以通过断点函数的调用中断转译代码的运行,如此,便实现了子应用的真机调试。此外,由于是直接在应用代码中注入调试函数和断点函数,因此相比于传统的重新开发一套真机调试方法,本实施例可以大大提升子应用真机调试的开发效率。
在一个实施例中,获取代码运行指令包括:创建输入输出线程,并通过输入输出线程获取代码运行指令;在由母应用提供的运行环境中运行转译代码,当运行至断点信息指向的中断位置时调用断点函数中断运行,包括:当主任务队列监听到输入输出线程获取到当次调试的代码运行指令时,通过主任务队列启动应用调试线程,并通过应用调试线程执行在由母应用提供的运行环境中运行转译代码,当运行至断点信息指向的中断位置时调用断点函数中断运行的步骤。
其中,线程是指操作系统能够进行运算调度的最小单元;输入输出线程是指接收输入的消息以及向外发送消息的线程,其具体可以为IO(Input/Output,输入/输出)线程,基于输入输出线程,不同计算机设备之间可以进行消息通信。
任务队列是指存放任务的队列,其在接收到如运行代码等运行任务时控制线程的运行,在未接收到任务时控制线程休眠。当子应用为ios(iPhone Operation System)系统中运行的应用程序时,任务队列具体可以为runloop。任务队列包括主任务队列和子任务队列,其中,子任务队列为主任务队列中的嵌套队列。通过嵌套队列的创建,可以通过主任务队列控制应用调试线程运行转译代码,以及处理转译代码运行时所接收到的任务;通过子任务队列控制应用调试线程退出转译代码的运行中断,及处理转译代码运行中断时所接收到的任务。
具体地,第二终端创建输入输出线程以及任务队列,通过输入输出线程接收第一终端发送的指令,通过主任务队列监听输入输出线程是否接收到第一终端发送的指令。当主任务队列监听到输入输出线程接收到当次调试的代码运行指令时,第二终端通过主任务队列启动应用调试线程,以使应用调试线程在由母应用提供的运行环境中运行转译代码,并在运行至断点信息指向的中断位置时,调用与中断位置相对应的断点函数休眠应用调试线程,以中断转译代码的运行。
在其中一个实施例中,当主任务队列监听到输入输出线程获取到当次调试的代码运行指令时,主任务队列启动应用调试线程引擎,并运行转译代码。当转译代码是以JS脚本语言编写而成时,应用调试线程引擎具体可以为JavaScript引擎,从而JavaScript引擎解释并运行JavaScript代码。
上述实施例中,通过输入输出线程接收代码运行指令,使得主任务队列可以基于代码运行指令控制应用调试线程运行转译代码,如此,便解决了由于待调试子应用与子应用开发平台处于不同的终端,而导致子应用开发平台无法向待调试子应用下发代码运行指令,并基于代码运行指令控制待调试子应用运行的问题。
在一个实施例中,当接收到代码调试指令时,通过转译代码中与中断位置相对应的调试函数对子应用进行调试,包括:当主任务队列中的子任务队列监听到输入输出线程获取到当次调试的代码调试指令时,通过应用调试线程执行转译代码中与中断位置相对应的调试函数,以对子应用进行调试。
具体地,参考图4,如图4所示,主任务队列中的子任务队列对输入输出线程进行监控,当子任务队列监听到输入输出线程接收到当次调试的代码运行指令时,子任务队列控制子任务调试线程确定与中断位置相对应的调试函数,并通过子任务调试线程调用确定的调试函数,以对子应用进行调试,得到代码调试信息。图4示出了一个实施例中嵌套队列的示意图。
在其中一个实施例中,第二终端可以创建多个输入输出线程,从而不同的线程可以接收不同的指令。比如,第二终端可以创建第一输入输出线程和第二输入输出线程,由第一输入输出线程接收代码运行指令,第二输入输出程接收代码调试指令,此时,主任务队列对第一输入输出线程进行监听,子任务队列对第二输入输出进行监听。通过创建多个用以接收不同类型指令的输入输出线程,使得主任务队列和子任务队列仅需监听对应的输入输出线程,即可分辨出接收到的指令的指令类型,从而可以根据指令类型控制应用调试线程运行转译代码或调用调试函数。
在其中一个实施例中,应用调试线程运行转译代码至断点信息所指向的中断位置时,或运行转译代码至断点信息所指向的中断位置之前,接收到代码调试指令时,应用调试线程中断转译代码的运行,不进入休眠状态,转为执行与中断位置相对应的调试函数,以对子应用进行调试。
上述实施例中,针对不同的指令类型使用不同的任务队列进行监听,使得不同的任务队列可以控制同一应用调试线程执行不同的任务,从而达到子应用真机调试的目的。
在一个实施例中,上述子应用的调试方法还包括:当产生中断退出指令时退出当次调试过程,并确定下一次调试的断点信息;从当次的中断位置处继续运行转译代码,当运行至下一次调试的断点信息指向的下一次的中断位置时调用断点函数中断运行;当接收到下一次调试的代码调试指令时,通过转译代码中与下一次的中断位置相对应的调试函数对子应用进行调试。
具体地,代码运行指令中可以包含有多个中断位置的断点信息,当针对当前中断位置的当次调试过程执行完毕时,第二终端将针对当前中断位置进行调试后得到的代码调试信息发送至子应用开发平台,以及产生中断退出指令。应用调试线程根据中断退出指令退出当次的调试过程,并从当次的中断位置处继续运行转译代码。应用调试线程从代码运行指令中确定下一次调试的断点信息,当运行至下一次调试的断点信息所指向的中断位置时,调用断点函数中断转译代码的运行。
进一步地,当接收到下一次调试的代码运行指令时,应用调试线程确定与下一次中断位置相对应的调试函数,并调用所确定的调试函数,得到调试信息,从而实现对子应用进行调试。
在其中一个实施例中,中断退出指令可以是通过输入输出线程接收得到,也可以是在满足预条件的情况下,由第二终端自动生成的。本实施例对此不做限定。其中,预设条件可以根据需求自由设定,比如,预设条件可以为10秒内未接收到新的代码调试指令时,第二终端自动生成中断退出指令,以使应用调试线程退出中断,转为继续运行转译代码。
在其中一个实施例中,子任务队列的队列状态包括监听状态和退出状态,当产生中断退出指令时,第二终端通过将处于监听状态的子任务队列修改为退出状态,以使应用调试线程退出中断,并从中断位置处继续运行转译代码。
上述实施例中,由于可以采用中断轮询的方式对多个中断位置处的待调试代码进行调试,使得开发人员可以全面地对应用代码进行调试,从而提升子应用调试的准确性。
在一个实施例中,上述子应用的调试方法还包括:获取在对子应用进行调试时与各中断位置分别对应的代码调试信息,并通过应用调试线程将代码调试信息传递至输入输出线程;通过输入输出线程将代码调试信息发送至子应用开发平台;发送的代码调试信息用于指示子应用开发平台对代码调试信息进行分析得到调试结果。
具体地,第二终端获取对子应用进行调试时,与各中断位置分别对应的代码调试信息,并通过应用调试线程将代码调试信息传递至输入输出线程,由输入输出线程将代码调试信息发送至子应用开发平台,从而开发人员可以通过子应用开发平台对代码调试信息进行分析,得到调试结果。比如,如图3所示,当接收得到第二终端发送的代码调试信息时,第一终端可以在调试界面中的第二区域中对应显示代码调试信息。
在其中一个实施例中,第二终端中的输入输出线程通过第一终端的服务器,将代码调试信息转发至第一终端的子应用开发平台。
本实施例中,通过借助输入输出线程,可以将代码调试信息及时返回至子应用开发平台,从而开发人员可以对子应用开发平台显示的代码调试信息进行分析,得到调试结果。
在一个实施例中,当接收到代码调试指令时,通过转译代码中与中断位置相对应的调试函数对子应用进行调试,包括:当接收到代码调试指令时,对代码调试指令进行解析,得到指令类型;确定位于转译代码中的,与指令类型以及中断位置相对应的调试函数;基于确定的调试函数对子应用进行调试,得到代码调试信息。
具体地,当接收到代码调试指令时,第二终端通过预先注入的代码调试指令解析函数对代码调试指令进行解析,得到代码调试指令的指令类型。第二终端确定位于转译代码中的,与指令类型以及中断位置信息相对应的调试函数,通过调用调试函数,以对子应用进行调试,得到代码调试信息。比如,在代码调试指令为获取转译代码的执行上下文信息时,其对应的指令类型即为获取执行上下文信息类型,此时,第二终端根据指令类型调用与中断位置信息相对应的_setEval函数,获取转译代码的执行上下文信息。
本实施例中,在接收到代码调试指令时,通过对代码调试指令进行解析,得到指令类型,有助于根据指令类型调用对应的调试函数,来响应代码调试指令,从而实现子应用的真机调试。
在一个实施例中,调试函数包括上下文获取函数;基于调试函数对子应用进行调试,得到代码调试信息,包括:通过上下文获取函数确定转译代码中与中断位置相关的执行上下文;将所述执行上下文作为子应用的代码调试信息;执行上下文用于分析代码运行环境。
其中,执行上下文是指正在运行的可执行代码所处环境的环境信息,其用于追踪一段代码中的变量的取值。比如,当需要调用函数A时,此时的执行上下文可以为函数A所依赖的其它函数输出的运行结果。
具体地,当调试函数为上下文获取函数时,第二终端确定中断位置所指向的语句所属的目标函数,并获取目标函数内的上下文获取函数,通过上下文获取函数确定中断位置处的执行上下文。比如,当中断位置所指向的代码为“var c=a+b”,“var c=a+b”所属的目标函数的函数名为“fn”时,第二终端通过调用目标函数内的上下文获取函数“_setEval”确定与“fn”相关的执行上下文,即得到子应用的代码调试信息。
本实施例中,由于调试函数包括上下文获取函数,因此,可以基于上下文获取函数对代码中的变量的取值进行追踪,从而使得开发人员可以根据追踪结果确定对应的子应用调试结果。
在一个实施例中,调试函数包括调用栈构建函数;基于调试函数对子应用进行调试,得到代码调试信息,包括:通过调用栈构建函数确定位于转译代码中的,与中断位置相对应的目标函数;通过调用栈构建函数获取目标函数的函数调用栈,并将目标函数的函数调用栈作为子应用的代码调试信息。
其中,函数调用栈是指在应用代码中,其中一个函数可以被另外一个函数调用,以此类推,这种两两调用形成的函数调用关系。比如,对于函数A调用函数B,函数B再调用函数C的调用关系,与目标函数C相对应的函数调用栈即为C-B-A,其中,函数A和函数B为与目标函数C具有调用关系的调用函数。
具体地,第二终端确定中断位置所指向的语句所属的目标函数,并通过调用栈构建函数确定与目标函数具有调用关系的调用函数。调用栈构建函数确定目标函数的函数信息、各调用函数的函数信息,将目标函数的函数信息、各调用函数的函数信息存储于堆栈中,从而得到代码调试信息。其中,函数信息包括函数名、编写函数所才采用的编程语言等。
本实施例中,通过调用栈构建函数获取中断位置所对应的目标函数的函数调用栈,使得开发人员可以对函数调用栈进行分析,得到子应用的调试结果。
为了便于本领域技术人员的理解,如图5所示,提供了一种子应用调试系统的系统架构图。其中,子应用调试系统包括第一终端、与第一终端相对应的服务器以及第二终端。其中,第一终端运行有用以展示代码调试信息以及生成代码调试指令的子应用开发平台,和用以对应用代码进行转译的转译平台;第二终端包括用以向子应用提供运行环境的母应用客户端、用以处理子应用交互逻辑的子应用后台和用以控制应用调试线程运行的任务队列。母应用客户端中运行有输入输出线程,子应用后台中运行有应用调试线程。
当需要对子应用的应用代码进行调试时,子应用开发平台获取待调试子应用的应用代码,并将应用代码发送至转译平台,由转译平台对应用代码进行转译,得到转译代码,并通过子应用开发平台以及服务器将转译代码传递至第二终端。与此同时,开发人员可以通过子应用开发平台向第二终端发送代码运行指令。当主任务队列监听得到输入输出线程接收到代码运行指令时,主任务队列控制应用调试线程运行转译代码至断点信息指向的中断位置处。开发人员可以通过子应用开发平台向第二终端发送代码调试指令,当主任务队列中的子任务队列监听得到输入输出线程接收到代码调试指令时,子任务队列通过应用调试线程响应代码调试指令,得到代码调试信息,并将代码调试信息通过输入输出线程返回至子应用开发平台。
为了便于本领域技术人员的理解,参考图6,图6示出了一个实施例中第一终端与第二终端之间的交互时序图。该时序过程涉及第一终端中的子应用开发平台、第二终端中的指令解析模块、调试函数调用模块以及应用调试线程。其中,指令解析模块包括代码调试指令解析函数,调试函数调用模块包括调试代码。当应用调试线程处于中断状态时,开发人员可以通过子应用开发平台触发生成代码调试指令,并基于子应用开发平台将代码调试指令发送至指令解析模块,由指令解析模块对应解析代码调试指令,得到指令类型。当获取得到代码调试指令的指令类型时,调试函数调用模块通过调用与指令类型相对应的调试函数,以触发子应用的调试逻辑,实现对子应用的调试。
当产生中断退出指令时,应用调试线程根据中断退出指令退出当次中断,并继续运行转译代码至下一次调试的断点信息所指向的中断位置时,通过调用断点函数中断转译代码的运行。值得注意的是,当应用调试线程中断转译代码的运行,以及恢复转译代码的运行时,应用调试线程对应生成中断提示和恢复提示,并将中断提示以及恢复提示返回至子应用开发平台,由子应用开发平台向开发人员展示接收到的提示信息。
在一个具体实施例中,如图7所示,本申请提供的子应用的调试方法包括以下步骤:
S702,获取与待调试的子应用对应的转译代码;转译代码通过对子应用的应用代码转译得到,且转译代码中包括断点函数和调试函数。
S704,创建输入输出线程,并通过输入输出线程获取代码运行指令。
S706,响应于代码运行指令,当主任务队列监听到输入输出线程获取到当次调试的代码运行指令时,通过主任务队列启动应用调试线程。
S708,通过应用调试线程执行在由母应用提供的运行环境中运行转译代码,当运行至断点信息指向的中断位置时调用断点函数中断运行。
S710,当主任务队列中的子任务队列监听到输入输出线程获取到当次调试的代码调试指令时,通过应用调试线程执行转译代码中与中断位置相对应的调试函数,以对子应用进行调试。
S712,获取在对子应用进行调试时与各中断位置分别对应的代码调试信息,并通过应用调试线程将代码调试信息传递至输入输出线程。
S714,通过输入输出线程将代码调试信息发送至子应用开发平台;发送的代码调试信息用于指示子应用开发平台对代码调试信息进行分析得到调试结果。
上述子应用的调试方法中,通过获取待调试的子应用对应的转译代码,可以在获取得到代码运行指令时,基于代码运行指令运行转译代码至中断位置,并中断转译代码的运行,进入调试状态;通过获取代码调试指令,可以根据代码调试指令确定转译代码中的与中断位置相对应的调试函数,从而根据调试函数对子应用进行调试。由于本申请所获取的代码为转译代码,而转译代码已预先注入有断点函数和调试函数,因此,本申请可以直接在移动终端方便快捷的实现代码的中断和调试,相比于传统的在模拟运行环境中调试子应用,本申请可以大大减少由于真实运行环境与模拟运行环境之间的差异而导致调试不准确的概率,从而提升子应用的调试准确性。
在另一个具体实施例中,如图8所示,本申请提供的子应用调试包括以下步骤:
S802,通过子应用开发平台获取子应用的应用代码;
S804,通过子应用开发平台遍历应用代码中的语句;
S806,判断遍历的各语句的语句类型;
S808,当遍历的语句的语句类型为函数构造类型时,通过子应用开发平台确定与遍历的语句相对应的函数体;通过子应用开发平台在函数体中添加调试函数;
S810,当遍历的语句的语句类型为基础语句类型时,通过子应用开发平台在遍历的语句中添加断点函数;
S812,根据添加有调试函数和断点函数的应用代码,确定对应的转译代码。
S814,获取代码运行指令;代码运行指令中携带有断点信息;
S816,响应于代码运行指令,在由母应用提供的运行环境中运行转译代码,当运行至断点信息指向的中断位置时调用断点函数中断运行;
S818,当接收到代码调试指令时,对代码调试指令进行解析,得到指令类型;
S820,确定位于转译代码中的,与指令类型以及中断位置相对应的调试函数;
S822,判断调试函数的函数类型;
S824,当目标函数为上下文获取函数时,通过上下文获取函数确定转译代码中与中断位置相关的执行上下文;将执行上下文作为子应用的代码调试信息;执行上下文用于分析代码运行环境。
S826,当目标函数为调用栈构建函数时,通过调用栈构建函数确定位于转译代码中的,与中断位置相对应的目标函数;通过调用栈构建函数获取目标函数的函数调用栈,并将目标函数的函数调用栈作为子应用的代码调试信息。
S828,当产生中断退出指令时退出当次调试过程,并确定下一次调试的断点信息
S830,从当次的中断位置处继续运行转译代码,当运行至下一次调试的断点信息指向的下一次的中断位置时调用断点函数中断运行;
S832,当接收到下一次调试的代码调试指令时,通过转译代码中与下一次的中断位置相对应的调试函数对子应用进行调试。
本申请还提供一种应用场景,该应用场景应用上述的子应用的调试方法。具体地,该子应用的调试方法在该应用场景的应用如下:
当子应用为A购物小程序时,第一终端获取A购物小程序的应用代码,对A购物小程序的应用代码进行转译,得到转译代码,并将转译代码发送至第二终端。当开发人员需要对订单结算功能进行调试时,开发人员确定应用代码中与订单结算相关的语句,并将与订单相关的语句所处的位置作为中断位置,从而第一终端可以基于中断位置的断点信息生成代码运行指令。当第二终端接收到代码运行指令时,第二终端响应于代码运行指令,在由母应用提供的运行环境中运行转译代码,当运行至断点信息指向的中断位置时调用断点函数中断运行。当开发人员具体需要对当前订单的订单总价进行调试时,第一终端根据开发人员具体的调试需求生成对应的代码调试指令,并将代码调试指令发送至第二终端,由第二终端通过调用相对应的调试函数,以响应代码调试指令,得到当前订单的订单总价,并将订单总价返回至第一终端,从而开发人员可以基于返回的订单总价,确定A购物小程序的订单结算功能是否正常。
应该理解的是,虽然图2、7和8的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,图2、7和8中的至少一部分步骤可以包括多个步骤或者多个阶段,这些步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤中的步骤或者阶段的至少一部分轮流或者交替地执行。
在一个实施例中,如图9所示,提供了一种子应用的调试装置900,该装置可以采用软件模块或硬件模块,或者是二者的结合成为计算机设备的一部分,该装置具体包括:转译代码获取模块902、运行指令获取模块904和调试指令获取模块906,其中:
转译代码获取模块902,用于获取与待调试的子应用对应的转译代码;转译代码通过对子应用的应用代码转译得到,且转译代码中包括断点函数和调试函数。
运行指令获取模块904,用于获取代码运行指令;代码运行指令中携带有断点信息;响应于代码运行指令,在由母应用提供的运行环境中运行转译代码,当运行至断点信息指向的中断位置时调用断点函数中断运行。
调试指令获取模块906,用于当接收到代码调试指令时,通过转译代码中与中断位置相对应的调试函数对子应用进行调试。
在一个实施例中,如图10所示,运行指令获取模块904还包括线程创建模块9041,用于创建输入输出线程,并通过输入输出线程获取代码运行指令;当主任务队列监听到输入输出线程获取到当次调试的代码运行指令时,通过主任务队列启动应用调试线程,并通过应用调试线程执行在由母应用提供的运行环境中运行转译代码,当运行至断点信息指向的中断位置时调用断点函数中断运行的步骤。
在一个实施例中,线程创建模块9041还用于当主任务队列中的子任务队列监听到输入输出线程获取到当次调试的代码调试指令时,通过应用调试线程执行转译代码中与中断位置相对应的调试函数,以对子应用进行调试。
在一个实施例中,线程创建模块9041还用于获取在对子应用进行调试时与各中断位置分别对应的代码调试信息,并通过应用调试线程将代码调试信息传递至输入输出线程;通过输入输出线程将代码调试信息发送至子应用开发平台;发送的代码调试信息用于指示子应用开发平台对代码调试信息进行分析得到调试结果。
在一个实施例中,调试指令获取模块906还包括指令解析模块9061,用于当接收到代码调试指令时,对代码调试指令进行解析,得到指令类型;确定位于转译代码中的,与指令类型以及中断位置相对应的调试函数;基于确定的调试函数对子应用进行调试,得到代码调试信息。
在一个实施例中,调试函数包括上下文获取函数;解析模块9061还用于通过上下文获取函数确定转译代码中与中断位置相关的执行上下文;将执行上下文作为子应用的代码调试信息;执行上下文用于分析代码运行环境。
在一个实施例中,调试函数包括调用栈构建函数;解析模块9061还用于通过调用栈构建函数确定位于转译代码中的,与中断位置相对应的目标函数;通过调用栈构建函数获取目标函数的函数调用栈,并将目标函数的函数调用栈作为子应用的代码调试信息。
在一个实施例中,上述子应用的调试装置900还包括代码转译模块908,用于通过子应用开发平台获取子应用的应用代码;通过子应用开发平台遍历应用代码中的语句,并确定遍历的各语句的语句类型;当遍历的语句的语句类型为目标类型时,通过子应用开发平台对遍历的语句进行转译。
在一个实施例中,代码转译模块908还用于当遍历的语句的语句类型为函数构造类型时,通过子应用开发平台确定与遍历的语句相对应的函数体;通过子应用开发平台在函数体中添加调试函数;当遍历的语句的语句类型为基础语句类型时,通过子应用开发平台在遍历的语句中添加断点函数;根据添加有调试函数和断点函数的应用代码,确定对应的转译代码。
在一个实施例中,上述子应用的调试装置900还包括中断退出模块910,用于当产生中断退出指令时退出当次调试过程,并确定下一次调试的断点信息;从当次的中断位置处继续运行转译代码,当运行至下一次调试的断点信息指向的下一次的中断位置时调用断点函数中断运行;当接收到下一次调试的代码调试指令时,通过转译代码中与下一次的中断位置相对应的调试函数对子应用进行调试。
关于子应用的调试装置的具体限定可以参见上文中对于子应用的调试方法的限定,在此不再赘述。上述子应用的调试装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
在一个实施例中,提供了一种计算机设备,该计算机设备可以是终端,其内部结构图可以如图11所示。该计算机设备包括通过系统总线连接的处理器、存储器、通信接口、显示屏和输入装置。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统和计算机程序。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的通信接口用于与外部的终端进行有线或无线方式的通信,无线方式可通过WIFI、运营商网络、NFC(近场通信)或其他技术实现。该计算机程序被处理器执行时以实现一种子应用的调试方法。该计算机设备的显示屏可以是液晶显示屏或者电子墨水显示屏,该计算机设备的输入装置可以是显示屏上覆盖的触摸层,也可以是计算机设备外壳上设置的按键、轨迹球或触控板,还可以是外接的键盘、触控板或鼠标等。
本领域技术人员可以理解,图11中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
在一个实施例中,还提供了一种计算机设备,包括存储器和处理器,存储器中存储有计算机程序,该处理器执行计算机程序时实现上述各方法实施例中的步骤。
在一个实施例中,提供了一种计算机可读存储介质,存储有计算机程序,该计算机程序被处理器执行时实现上述各方法实施例中的步骤。
在一个实施例中,提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述各方法实施例中的步骤。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和易失性存储器中的至少一种。非易失性存储器可包括只读存储器(Read-Only Memory,ROM)、磁带、软盘、闪存或光存储器等。易失性存储器可包括随机存取存储器(Random Access Memory,RAM)或外部高速缓冲存储器。作为说明而非局限,RAM可以是多种形式,比如静态随机存取存储器(Static Random Access Memory,SRAM)或动态随机存取存储器(Dynamic Random Access Memory,DRAM)等。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。
Claims (15)
1.一种子应用的调试方法,其特征在于,由移动终端执行,所述移动终端中运行有母应用,所述方法包括:
获取与待调试的子应用对应的转译代码;所述转译代码通过对所述子应用的应用代码转译得到,且所述转译代码中包括断点函数和调试函数;
获取代码运行指令;所述代码运行指令中携带有断点信息;
响应于所述代码运行指令,在由所述母应用提供的运行环境中运行所述转译代码,当运行至所述断点信息指向的中断位置时调用所述断点函数中断运行;
当接收到代码调试指令时,通过所述转译代码中与所述中断位置相对应的调试函数对所述子应用进行调试。
2.根据权利要求1所述的方法,其特征在于,所述获取代码运行指令包括:
创建输入输出线程,并通过所述输入输出线程获取代码运行指令;
所述在由所述母应用提供的运行环境中运行所述转译代码,当运行至所述断点信息指向的中断位置时调用所述断点函数中断运行,包括:
当主任务队列监听到所述输入输出线程获取到当次调试的代码运行指令时,通过所述主任务队列启动应用调试线程,并通过所述应用调试线程执行所述在由所述母应用提供的运行环境中运行所述转译代码,当运行至所述断点信息指向的中断位置时调用所述断点函数中断运行的步骤。
3.根据权利要求2所述的方法,其特征在于,所述当接收到代码调试指令时,通过所述转译代码中与所述中断位置相对应的调试函数对所述子应用进行调试,包括:
当所述主任务队列中的子任务队列监听到所述输入输出线程获取到当次调试的代码调试指令时,通过所述应用调试线程执行所述转译代码中与所述中断位置相对应的调试函数,以对所述子应用进行调试。
4.根据权利要求3所述的方法,其特征在于,所述方法还包括:
获取在对所述子应用进行调试时与各中断位置分别对应的代码调试信息,并通过所述应用调试线程将所述代码调试信息传递至所述输入输出线程;
通过所述输入输出线程将所述代码调试信息发送至子应用开发平台;发送的代码调试信息用于指示所述子应用开发平台对所述代码调试信息进行分析得到调试结果。
5.根据权利要求1所述的方法,其特征在于,所述当接收到代码调试指令时,通过所述转译代码中与所述中断位置相对应的调试函数对所述子应用进行调试,包括:
当接收到代码调试指令时,对所述代码调试指令进行解析,得到指令类型;
确定位于所述转译代码中的,与所述指令类型以及所述中断位置相对应的调试函数;
基于确定的所述调试函数对所述子应用进行调试,得到代码调试信息。
6.根据权利要求5所述的方法,其特征在于,所述调试函数包括上下文获取函数;所述基于所述调试函数对所述子应用进行调试,得到代码调试信息,包括:
通过所述上下文获取函数确定所述转译代码中与所述中断位置相关的执行上下文;
将所述执行上下文作为所述子应用的代码调试信息;所述执行上下文用于分析代码运行环境。
7.根据权利要求5所述的方法,其特征在于,其特征在于,所述调试函数包括调用栈构建函数;所述基于所述调试函数对所述子应用进行调试,得到代码调试信息,包括:
通过所述调用栈构建函数确定位于所述转译代码中的,与所述中断位置相对应的目标函数;
通过所述调用栈构建函数获取所述目标函数的函数调用栈,并将所述目标函数的函数调用栈作为所述子应用的代码调试信息。
8.根据权利要求1所述的方法,其特征在于,所述子应用的应用代码的转译步骤包括:
通过子应用开发平台获取子应用的应用代码;
通过所述子应用开发平台遍历所述应用代码中的语句,并确定遍历的各语句的语句类型;
当遍历的所述语句的语句类型为目标类型时,通过所述子应用开发平台对遍历的所述语句进行转译。
9.根据权利要求8所述的方法,其特征在于,所述当遍历的所述语句的语句类型为目标类型时,通过所述子应用开发平台对遍历的所述语句进行转译,包括:
当遍历的所述语句的语句类型为函数构造类型时,通过所述子应用开发平台确定与遍历的所述语句相对应的函数体;
通过所述子应用开发平台在所述函数体中添加调试函数;
当遍历的所述语句的语句类型为基础语句类型时,通过所述子应用开发平台在遍历的所述语句中添加断点函数;
根据添加有调试函数和断点函数的应用代码,确定对应的转译代码。
10.根据权利要求1-9任意一项所述的方法,其特征在于,所述方法还包括:
当产生中断退出指令时退出当次调试过程,并确定下一次调试的断点信息;
从当次的中断位置处继续运行所述转译代码,当运行至下一次调试的断点信息指向的下一次的中断位置时调用所述断点函数中断运行;
当接收到下一次调试的代码调试指令时,通过所述转译代码中与所述下一次的中断位置相对应的调试函数对所述子应用进行调试。
11.一种子应用的调试装置,其特征在于,所述装置包括:
转译代码获取模块,用于获取与待调试的子应用对应的转译代码;所述转译代码通过对所述子应用的应用代码转译得到,且所述转译代码中包括断点函数和调试函数;
运行指令获取模块,用于获取代码运行指令;所述代码运行指令中携带有断点信息;响应于所述代码运行指令,在由母应用提供的运行环境中运行所述转译代码,当运行至所述断点信息指向的中断位置时调用所述断点函数中断运行;
调试指令获取模块,用于当接收到代码调试指令时,通过所述转译代码中与所述中断位置相对应的调试函数对所述子应用进行调试。
12.根据权利要求11所述的装置,其特征在于,所述调试指令获取模块还包括指令解析模块,用于当接收到代码调试指令时,对所述代码调试指令进行解析,得到指令类型;确定位于所述转译代码中的,与所述指令类型以及所述中断位置相对应的调试函数;基于所述调试函数对所述子应用进行调试,得到代码调试信息。
13.根据权利要求11所述的装置,其特征在于,所述子应用的调试装置还包括代码转译模块,用于通过子应用开发平台获取子应用的应用代码;通过所述子应用开发平台遍历所述应用代码中的语句,并确定遍历的各语句的语句类型;当遍历的所述语句的语句类型为目标类型时,通过所述子应用开发平台对遍历的所述语句进行转译。
14.一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至10中任一项所述的方法的步骤。
15.一种计算机可读存储介质,存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至10中任一项所述的方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010728342.0A CN113971124B (zh) | 2020-07-24 | 2020-07-24 | 子应用的调试方法、装置、计算机设备和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010728342.0A CN113971124B (zh) | 2020-07-24 | 2020-07-24 | 子应用的调试方法、装置、计算机设备和存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113971124A true CN113971124A (zh) | 2022-01-25 |
CN113971124B CN113971124B (zh) | 2024-06-25 |
Family
ID=79585944
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010728342.0A Active CN113971124B (zh) | 2020-07-24 | 2020-07-24 | 子应用的调试方法、装置、计算机设备和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113971124B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115033306A (zh) * | 2022-06-29 | 2022-09-09 | 维沃移动通信有限公司 | 应用退出方法和装置 |
Citations (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20020100018A1 (en) * | 1999-04-23 | 2002-07-25 | Clifford N. Click | Method and apparatus for debugging optimized code |
US20060064677A1 (en) * | 2004-09-22 | 2006-03-23 | Maya Bickson | Debugger and method for debugging computer programs across multiple programming languages |
CN101183330A (zh) * | 2007-12-13 | 2008-05-21 | 东信和平智能卡股份有限公司 | 嵌入式系统的在线调试系统及其调试方法 |
CN104281518A (zh) * | 2013-07-02 | 2015-01-14 | 腾讯科技(深圳)有限公司 | 终端应用测试方法、装置、系统、平台及移动终端 |
US20150046753A1 (en) * | 2013-08-09 | 2015-02-12 | Freescale Semiconductor, Inc. | Embedded software debug system with partial hardware acceleration |
US9262300B1 (en) * | 2014-06-24 | 2016-02-16 | Google Inc. | Debugging computer programming code in a cloud debugger environment |
CN108647028A (zh) * | 2018-05-09 | 2018-10-12 | 广州腾讯科技有限公司 | 应用程序信息处理方法和装置 |
CN108920366A (zh) * | 2018-06-28 | 2018-11-30 | 腾讯科技(深圳)有限公司 | 一种子应用调试方法、装置及系统 |
CN109117361A (zh) * | 2018-06-21 | 2019-01-01 | 腾讯科技(深圳)有限公司 | 一种小程序的远程调试方法、相关设备及系统 |
CN109669876A (zh) * | 2018-12-30 | 2019-04-23 | 艾普阳科技(深圳)有限公司 | 一种javascript代码的调试控制方法及系统 |
CN110032519A (zh) * | 2019-04-22 | 2019-07-19 | 广州腾讯科技有限公司 | 云函数调试方法、装置、计算机设备及存储介质 |
CN110347448A (zh) * | 2019-06-10 | 2019-10-18 | 北京大学 | 一种构造终端应用行为的运行时模型的方法 |
CN110750463A (zh) * | 2019-10-29 | 2020-02-04 | 百度在线网络技术(北京)有限公司 | 一种小程序测试方法、装置、系统、设备及介质 |
CN110837473A (zh) * | 2019-11-07 | 2020-02-25 | 腾讯科技(深圳)有限公司 | 应用程序调试方法、装置、终端及存储介质 |
-
2020
- 2020-07-24 CN CN202010728342.0A patent/CN113971124B/zh active Active
Patent Citations (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20020100018A1 (en) * | 1999-04-23 | 2002-07-25 | Clifford N. Click | Method and apparatus for debugging optimized code |
US20060064677A1 (en) * | 2004-09-22 | 2006-03-23 | Maya Bickson | Debugger and method for debugging computer programs across multiple programming languages |
CN101183330A (zh) * | 2007-12-13 | 2008-05-21 | 东信和平智能卡股份有限公司 | 嵌入式系统的在线调试系统及其调试方法 |
CN104281518A (zh) * | 2013-07-02 | 2015-01-14 | 腾讯科技(深圳)有限公司 | 终端应用测试方法、装置、系统、平台及移动终端 |
US20150339215A1 (en) * | 2013-07-02 | 2015-11-26 | Tencent Technology (Shenzhen) Company Limited | Systems and Methods for Testing Terminal Applications |
US20150046753A1 (en) * | 2013-08-09 | 2015-02-12 | Freescale Semiconductor, Inc. | Embedded software debug system with partial hardware acceleration |
US9262300B1 (en) * | 2014-06-24 | 2016-02-16 | Google Inc. | Debugging computer programming code in a cloud debugger environment |
CN108647028A (zh) * | 2018-05-09 | 2018-10-12 | 广州腾讯科技有限公司 | 应用程序信息处理方法和装置 |
CN109117361A (zh) * | 2018-06-21 | 2019-01-01 | 腾讯科技(深圳)有限公司 | 一种小程序的远程调试方法、相关设备及系统 |
CN108920366A (zh) * | 2018-06-28 | 2018-11-30 | 腾讯科技(深圳)有限公司 | 一种子应用调试方法、装置及系统 |
CN109669876A (zh) * | 2018-12-30 | 2019-04-23 | 艾普阳科技(深圳)有限公司 | 一种javascript代码的调试控制方法及系统 |
CN110032519A (zh) * | 2019-04-22 | 2019-07-19 | 广州腾讯科技有限公司 | 云函数调试方法、装置、计算机设备及存储介质 |
CN110347448A (zh) * | 2019-06-10 | 2019-10-18 | 北京大学 | 一种构造终端应用行为的运行时模型的方法 |
CN110750463A (zh) * | 2019-10-29 | 2020-02-04 | 百度在线网络技术(北京)有限公司 | 一种小程序测试方法、装置、系统、设备及介质 |
CN110837473A (zh) * | 2019-11-07 | 2020-02-25 | 腾讯科技(深圳)有限公司 | 应用程序调试方法、装置、终端及存储介质 |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115033306A (zh) * | 2022-06-29 | 2022-09-09 | 维沃移动通信有限公司 | 应用退出方法和装置 |
CN115033306B (zh) * | 2022-06-29 | 2024-05-24 | 维沃移动通信有限公司 | 应用退出方法和装置 |
Also Published As
Publication number | Publication date |
---|---|
CN113971124B (zh) | 2024-06-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11588922B2 (en) | Capturing and replaying application sessions using resource files | |
Garbers et al. | Finding clusters in VLSI circuits | |
CN112257135B (zh) | 一种基于多线程的模型加载方法、装置、存储介质及终端 | |
CN112090079B (zh) | 游戏任务运行方法、装置、计算机设备和存储介质 | |
WO2021017594A1 (zh) | 数据处理方法及装置、设备、服务器、系统及存储介质 | |
US9213622B1 (en) | System for exception notification and analysis | |
Kwon et al. | Precise execution offloading for applications with dynamic behavior in mobile cloud computing | |
CN112612988A (zh) | 页面处理方法、装置、计算机设备及存储介质 | |
CN111831542B (zh) | Api应用调测方法及装置、存储介质 | |
CN110990132A (zh) | 异步任务处理方法、装置、计算机设备和存储介质 | |
CN112328219A (zh) | 业务访问处理方法、装置、系统和计算机设备 | |
CN114218052B (zh) | 一种业务交互图生成方法、装置、设备及存储介质 | |
CN113971124B (zh) | 子应用的调试方法、装置、计算机设备和存储介质 | |
CN114461533A (zh) | Web页面自动化测试的方法、系统、电子装置和存储介质 | |
KR101689984B1 (ko) | 프로그래머블 컨트롤러, 프로그래머블 컨트롤러 시스템 및 실행 에러 정보 작성 방법 | |
CN111176986B (zh) | 线程脚本调试方法、装置、计算机设备和存储介质 | |
CN113254217A (zh) | 业务的消息处理方法、装置及电子设备 | |
US10783004B1 (en) | Method, apparatus, and electronic device for improving parallel performance of CPU | |
CN112214416A (zh) | 调试小程序的方法、装置、电子设备和存储介质 | |
Park et al. | PIOS: A platform-independent offloading system for a mobile web environment | |
CN110764745A (zh) | 变量的传输和收集方法、装置及计算机可读存储介质 | |
CN116051031A (zh) | 项目调度系统、介质及电子设备 | |
CN113094052A (zh) | 应用构建方法、装置、计算机设备和存储介质 | |
CN113868127A (zh) | 在线调试方法、装置、计算机设备和存储介质 | |
CN114996117B (zh) | 面向SaaS模式的客户端GPU应用评测系统及方法 |
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 |