CN112506923A - 对应业务的方法调用链路确定方法、装置、电子设备 - Google Patents

对应业务的方法调用链路确定方法、装置、电子设备 Download PDF

Info

Publication number
CN112506923A
CN112506923A CN202011312613.0A CN202011312613A CN112506923A CN 112506923 A CN112506923 A CN 112506923A CN 202011312613 A CN202011312613 A CN 202011312613A CN 112506923 A CN112506923 A CN 112506923A
Authority
CN
China
Prior art keywords
call
calling
service
method object
objects
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
Application number
CN202011312613.0A
Other languages
English (en)
Inventor
任向东
徐东升
江乐彬
陈默
刘德卿
孙玉平
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Sankuai Online Technology Co Ltd
Original Assignee
Beijing Sankuai Online Technology Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Beijing Sankuai Online Technology Co Ltd filed Critical Beijing Sankuai Online Technology Co Ltd
Priority to CN202011312613.0A priority Critical patent/CN112506923A/zh
Publication of CN112506923A publication Critical patent/CN112506923A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/22Indexing; Data structures therefor; Storage structures
    • G06F16/2228Indexing structures
    • G06F16/2246Trees, e.g. B+trees
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • G06F8/427Parsing

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Data Mining & Analysis (AREA)
  • Databases & Information Systems (AREA)
  • Stored Programmes (AREA)

Abstract

本申请公开了一种对应业务的方法调用链路确定方法,属于计算机技术领域,有助于提升确定指定业务的方法调用链路的效率。所述方法包括:通过结构化数据描述应用程序代码中声明的类对象、各所述类对象中声明的方法对象和各所述方法对象的属性信息和方法调用关系;遍历结构化数据,根据方法对象的属性信息和业务标识,分别确定关联不同业务标识的开始调用方法对象和结束调用方法对象;对于每个开始调用方法对象,基于结构化数据中描述的方法调用关系,分别构建与指定业务标识关联的调用关系树;遍历与指定业务标识关联的方法调用关系树,确定指定业务标识所标识的业务的每条方法调用链路,使得可以自动确定应用程序中每个业务模块的方法调用电路。

Description

对应业务的方法调用链路确定方法、装置、电子设备
技术领域
本申请实施例涉及计算机技术领域,特别是涉及一种对应业务的方法调用链路确定方法、装置、电子设备及计算机可读存储介质。
背景技术
随着基于终端应用的业务的发展,APP(Application,应用程序)版本更行节奏加快,线上应用程序缺陷给业务稳定带来的隐患越来越大,监控线上应用程序中各个业务模块的可用性,变得非常重要。由于一个应用程序中通常集成了很多业务模块,每个业务模块通过执行若干程序代码模块实现,并且,还存在多个业务模块共用一个程序代码模块的情形,应用程序的代码实现非常复杂。现有技术中,仅有针对应用程序整体运行稳定性的监控,尚未有对于独立的业务的程序执行结果的监控方法。然而,作为实现一个独立业务的应用程序分支或功能模块,其稳定性非常重要。提供一种能够确定业务的构成,使得在应用程序出现异常时,能够快速定位到具体业务,甚至业务的具体代码成为可能。
现有技术中,通过人工梳理业务逻辑与代码逻辑,找到业务上的所有方法,从而确定业务及其执行信息。现有技术中的确定业务的方案不仅效率低下,且容易出错。
发明内容
本申请实施例提供一种对应业务的方法调用链路确定方法,有助于提升确定应用程序中指定业务模块代码的方法调用链路的效率。
为了解决上述问题,第一方面,本申请实施例提供了一种对应业务的方法调用链路确定方法,包括:
通过结构化数据描述应用程序代码中声明的类对象、各所述类对象中声明的方法对象,以及,各所述方法对象的属性信息和方法调用关系,其中,至少部分所述方法对象的属性信息包括:用于指示所述方法对象为开始调用方法或结束调用方法的标识、所述方法对象关联的业务标识;
遍历所述结构化数据,根据所述方法对象的所述属性信息和所述业务标识,分别确定关联不同所述业务标识的开始调用方法对象和结束调用方法对象;
对于每个所述开始调用方法对象,基于所述结构化数据中描述的所述方法调用关系,分别构建与指定业务标识关联的方法调用关系树,其中,所述指定业务标识为所述开始调用方法对象关联的所述业务标识;
遍历与指定业务标识关联的所述方法调用关系树,确定所述指定业务标识所标识的业务的每条方法调用链路。
第二方面,本申请实施例提供了一种对应业务的方法调用链路确定装置,包括:
程序代码结构化处理模块,用于通过结构化数据描述应用程序代码中声明的类对象、各所述类对象中声明的方法对象,以及,各所述方法对象的属性信息和方法调用关系,其中,至少部分所述方法对象的属性信息包括:用于指示所述方法对象为开始调用方法或结束调用方法的标识、所述方法对象关联的业务标识;
开始和结束调用方法确定模块,用于遍历所述结构化数据,根据所述方法对象的所述属性信息和所述业务标识,分别确定关联不同所述业务标识的开始调用方法对象和结束调用方法对象;
方法调用关系树构建模块,用于对于每个所述开始调用方法对象,基于所述结构化数据中描述的所述方法调用关系,分别构建与指定业务标识关联的方法调用关系树,其中,所述指定业务标识为所述开始调用方法对象关联的所述业务标识;
方法调用链路确定模块,用于遍历与指定业务标识关联的所述方法调用关系树,确定所述指定业务标识所标识的业务的每条方法调用链路。
第三方面,本申请实施例还公开了一种电子设备,包括存储器、处理器及存储在所述存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现本申请实施例所述的对应业务的方法调用链路确定方法。
第四方面,本申请实施例提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时本申请实施例公开的对应业务的方法调用链路确定方法的步骤。
本申请实施例公开的对应业务的方法调用链路确定方法,通过结构化数据描述应用程序代码中声明的类对象、各所述类对象中声明的方法对象,以及,各所述方法对象的属性信息和方法调用关系,其中,至少部分所述方法对象的属性信息包括:用于指示所述方法对象为开始调用方法或结束调用方法的标识、所述方法对象关联的业务标识;遍历所述结构化数据,根据所述方法对象的所述属性信息和所述业务标识,分别确定关联不同所述业务标识的开始调用方法对象和结束调用方法对象;对于每个所述开始调用方法对象,基于所述结构化数据中描述的所述方法调用关系,分别构建与指定业务标识关联的方法调用关系树,其中,所述指定业务标识为所述开始调用方法对象关联的业务标识;遍历与指定业务标识关联的所述方法调用关系树,确定所述指定业务标识所标识的业务的每条方法调用链路,使得可以自动确定应用程序中每个业务模块的方法调用电路,相比于现有技术中手动梳理每个业务模块调用的方法对象而言,提升了确定应用程序中指定业务模块代码的方法调用链路的效率。
上述说明仅是本申请技术方案的概述,为了能够更清楚了解本申请的技术手段,而可依照说明书的内容予以实施,并且为了让本申请的上述和其它目的、特征和优点能够更明显易懂,以下特举本申请的具体实施方式。
附图说明
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
图1是本申请实施例一的对应业务的方法调用链路确定方法流程图;
图2是本申请实施例一中构建的方法调用关系树示意图;
图3是本申请实施例二中对应业务的方法调用链路确定方法流程图;
图4是本申请实施例三的对应业务的方法调用链路确定装置结构示意图之一;
图5是本申请实施例三的对应业务的方法调用链路确定装置结构示意图之二;
图6示意性地示出了用于执行根据本申请的方法的电子设备的框图;以及
图7示意性地示出了用于保持或者携带实现根据本申请的方法的程序代码的存储单元。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
实施例一
本申请实施例公开的一种对应业务的方法调用链路确定方法,如图1所示,所述方法包括:步骤110至步骤140。
步骤110,通过结构化数据描述应用程序代码中声明的类对象、各所述类对象中声明的方法对象,以及,各所述方法对象的属性信息和方法调用关系。
其中,各业务的开始调用方法对象的程序代码中预先设置有标识该方法对象为开始调用方法的标识和相应的业务标识,各业务的结束调用方法的程序代码中预先设置有标识该方法对象为结束调用方法的标识和相应的业务标识。本申请的实施例中,所述业务标识可以为数字、字符串以及数字和字符串的组合,用于唯一标识一个业务。本申请实施例中,对业务标识的生成方式不做限定。
不同方法对象的属性信息可能有所不同,在所述结构化数据中,至少部分所述方法对象(如开始调用方法对象和结束调用方法对象)的属性信息包括:用于指示所述方法对象为开始调用方法或结束调用方法的标识、所述方法对象关联的业务标识。其中,指示所述方法对象为开始调用方法的标识是根据所述应用程序代码中预先插入的用于标记方法对象为开始调用方法的程序代码确定的;指示所述方法对象为结束调用方法的标识是根据所述应用程序代码中预先插入的用于标记方法对象为结束调用方法的程序代码确定的。
本申请实施例中所述的对应业务的方法调用链路确定方法适用于面向对象的开发语言编写的应用程序代码,例如,Java、ObjectiveC等。所述应用程序代码通常由若干类的声明代码组成,在每个类的声明代码中,进一步包括对类的属性信息的定义,以及当前类的方法声明和调用其他类的方法的语句。其中,方法对象还可以进一步调用其他方法或者类。
本申请具体实施过程中,首先在目标应用程序的应用程序代码中各业务的开始调用方法和结束调用方法的程序代码中手动埋入指示所述方法对象为开始调用方法或结束调用方法的标识,以及,指示所述方法对象关联的业务标识。之后,采用本申请实施例公开的方法,自动在各业务对应的应用程序代码中,其他被调用的方法对象中自动插入指示该方法对象为中间调用方法对象的标识,或者,自动插入指示该方法对象关联的业务标识,或者,自动插入指示该方法对象为中间调用方法对象的标识和指示该方法对象关联的业务标识。其中,方法对象关联的业务标识为调用该方法对象的业务的业务标识。
本申请的一些实施例中,可以以插入宏定义的方式在应用程序代码中插入标记业务标识的程序代码和/或标记方法对象为开始调用方法或结束调用方法的程序代码。例如,在应用程序代码中插入名字为“BMPNodeStart”的宏定义用于标记插入有该宏定义的方法对象为某一业务的开始调用方法,在应用程序代码中插入名字为“BMPNodeEnd”的宏定义用于标记插入有该宏定义的方法对象为某一业务的结束调用方法,即以宏名称作为方法类型(如,开始调用方法、结束调用方法)的标识。进一步的,通过该宏定义的参数表示业务标识。
本申请的另一些实施例中,还可以以其他方式在应用程序代码中各业务的开始调用方法和结束调用方法中插入相应标识,本申请实施例中对此不作限定,在此,亦不再一一例举。
基于插入有开始调用方法标识、结束调用方法标识和业务标识的应用程序代码,通过链路收集工具可以获取到的目标应用程序的项目中所有方法调用关系。
本申请的一些实施例中,所述通过结构化数据描述应用程序代码中声明的类对象、各所述类对象中声明的方法对象,以及,各所述方法对象的属性信息和方法调用关系,包括:通过JSON(JavaScript Object Notation,一种轻量级的数据交换格式)键值对描述应用程序代码中声明的类对象的属性信息、各所述类对象中声明和/或调用的方法对象,以及各所述方法对象的属性信息,以及各所述方法对象的方法调用关系。
以iOS开发环境的应有程序开发项目为例,其中,程序代码文件为扩展名.m的源文件,通常,每个应用程序项目中包括多个.m源文件(即程序代码文件)。每个.m源文件(即程序代码文件)中包括一个或多个实现相应功能的类对象、方法对象的声明代码、实现代码、调用代码等。其中,调用代码包括:调用第三方库中的方法的代码、调用本项目中定义的类对象的方法的代码等,并且,对象的声明、调用等代码符合一定的程序设计规范。因此,通过对应用程序项目中各源文件中的代码的语法、句法进行分析,可以得到每个源文件中包括的类对象、类对象的业务属性、类对象的方法对象、各方法对象的业务属性、方法对象的调用关系等信息。进一步的,通过进行源代码解析,还可以确定某一方法对象是否为开始调用方法或结束调用方法。对于开始调用方法或结束调用方法,还可以进一步确定该开始调用方法或结束调用方法关联的业务标识。
本申请的一些实施例中,所述结构化数据是以键值对形式记录的数据,其中,键和值的取值可以为类对象名称、方法对象名称、关键词等。例如,将每个源文件中包括的类对象、类对象的业务属性(如通知类等)、类对象的方法对象、各方法对象的业务属性(如,关联的业务标识)、方法对象的调用关系等信息,通过一个json文件进行存储,以键值对形式的结构化数据表示源文件中包括的类对象、类对象的业务属性、类对象的方法对象、各方法对象的业务属性、方法对象的调用关系。例如,通过对应用程序的源代码进行解析,可以得到类对象viewController中声明的方法包括:func1、func2和func3,其中,方法对象func3为类对象getData的方法,则解析得到的方法调用关系可以表示为形如:
{“viewController”:{methods:
[“className”:“viewController”,“invoke”:
[“methodName”:“func1”,
“methodName”:“func2”,
{“className”:“getData”,“methodName”:“func3”}]]}。
其中,className、invoke、methodName是关键词。所述关键词用于指示方法调用关系,以及数据类型等信息。即通过字符串的对应关系表示方法调用关系。类似的,还可以通过键值对表示方法对象关联的业务标识、方法对象的类别属性(即方法对象与指示方法为开始调用方法或结束调用方法的标识)的对应关系。
再例如,如果某个方法对象为一个业务的开始调用方法(例如该方法对象的代码中包括如“BMPNodeStart(@“业务ID”)”的宏代码),或者,如果某个方法对象为一个业务的结束调用方法(例如该方法对象的代码中包括如“BMPNodeEnd(@“业务ID”)”的宏代码),则可以通过方法名称字符串和方法类型字符串的键值对(如“nodetype”:0)表示方法对象与方法类型属性信息的对应关系,其中,nodetype为指示方法类型的关键词,值为方法类型标识。同理,对于业务的开始调用方法和结束调用方法,根据源代码还可以得到表示方法对象和业务标识对应关系的键值对。
按照这种方法,应用程序代码的每个源文件(如.m格式的文件)可以相应生成一个结构化数据文件(如.json格式的文件),每个结构化数据文件中,以字符串映射关系的形式描述了方法对象的调用关系、部分方法对象关联的业务标识(用于指示该方法对象为实现哪个业务的方法)和方法类型标识(用于指示该方法对象为开始调用方法或结束调用方法)。
步骤120,遍历所述结构化数据,根据所述方法对象的所述属性信息和所述业务标识,分别确定关联不同所述业务标识的开始调用方法对象和结束调用方法对象。
接下来,对经过代码分析得到的所有结构化数据文件进行进一步分析,通过对结构化数据进行分析,确定该目标应用程序中声明的所有方法对象。例如,通过遍历前述步骤得到的所有.json文件中的键值对,确定从所述目标应用程序的源代码中解析得到的所有方法对象。然后,根据每个方法对象的属性信息中是否包括指示方法类型为开始调用方法或结束调用方法的标识确定解析得到的所有方法对象中的开始调用方法对象和结束调用方法对象。
在确定的开始调用方法对象和结束调用方法对象中,根据结构化数据中描述的每个方法对象对应的业务标识,确定分别确定对应相同业务标识的开始调用方法对象和结束调用方法对象。由于在应用程序中,通常会包括多个业务模块,进入某一业务模块的入口可能有多个,从一个业务模块跳转至其他业务模块或退出应用程序的出口也可能有多个,因此,通常情况下,执行本步骤,可以确定多组开始调用方法对象和结束调用方法对象,每组开始调用方法对象和结束调用方法对象对应一个业务标识,即每组开始调用方法对象和结束调用方法对象属于一个业务模块的程序代码。每组开始调用方法对象和结束调用方法对象中,又可以包含一个或多个开始调用方法对象、以及一个或多个结束调用方法对象。
本申请的一些实施例中,结构化数据以应用程序源代码中的方法名称字符串、类名称字符串、方法类型标识字符串表示方法对象的方法调用关系和方法对象与业务标识、方法类型标识的对应关系,执行前述步骤后,则可以得到应用程序源代码中每个业务标识对应的所有开始调用方法和所有结束调用方法的方法对象名称。
步骤130,对于每个所述开始调用方法对象,基于所述结构化数据中描述的所述方法调用关系,分别构建与指定业务标识关联的方法调用关系树。
其中,所述指定业务标识为所述开始调用方法对象关联的所述业务标识。
在确定了关联不同所述业务标识的开始调用方法对象和结束调用方法对象之后,对于每个业务标识,分别根据关联该业务标识的所有开始调用方法对象和结束调用方法对象,构建方法调用关系树。本申请的一些实施例中,对于每个所述开始调用方法对象,基于所述结构化数据中描述的所述方法调用关系,分别构建与指定业务标识关联的方法调用关系树,包括:对于每个所述开始调用方法对象,根据所述开始调用方法对象构建根节点;以所述开始调用方法对象为当前层级方法对象,执行以下节点构建子步骤:调用方法确定子步骤,基于所述结构化数据中描述的所述方法调用关系,确定所述当前层级方法对象调用的各下一层级方法对象;子节点构建子步骤,根据各所述下一层级方法对象构建所述当前层级方法对象对应的节点的子节点;跳转判断子步骤,响应于各所述下一层级方法对象中包括不属于所述结束调用方法对象的方法对象,将不属于所述结束调用方法对象的所述下一层级方法对象分别作为当前层级方法对象,并跳转至执行所述调用方法确定子步骤和所述子节点构建子步骤,直至各所述下一层级方法对象全部为所述结束调用方法对象。
下面具体举例说明构建一个业务标识对应的方法调用关系树的具体方案。如前所述,一个业务标识可以对应多个开始调用方法,也可以对应多个结束调用方法,即一个业务的代码在执行过程中存在多个流程分支。相应的,在构建该业务标识对应的方法调用关系树时,对于每个开始调用方法,分别构建方法调用关系树,则可以得到多个方法调用关系树。
具体举例而言,假设业务标识ID1,对应M个开始调用方法和N个结束调用方法,M个开始调用方法分别表示为startFunc1、startFunc2、…、startFuncM,N个结束调用方法分别表示为endFunc1、endFunc2、…、endFuncN,其中,M和N为大于1的整数,分别根据开始调用方法startFunc1、startFunc2、…、startFuncM构建一个方法调用关系树的根节点,之后,通过遍历前述步骤确定的结构化数据记载的方法调用关系,根据被调用的方法对象构建各个根节点的子节点,直到遍历到被调用的方法对象为结束调用方法endFunc1、endFunc2、…、endFuncN中的一个,根据遍历到的结束调用方法构建该根节点的一个叶子节点,完成方法调用关系树的一个分支的构建。
进一步的,在构建业务标识ID1对应的开始调用方法startFunc1对应的方法调用关系树时,首先根据开始调用方法startFunc1构建根节点,如图2中方法调用关系树的根节点200。然后,以开始调用方法startFunc1作为当前层节点,构建当前层节点(即根节点)的子节点。具体实施时,通过遍历前述步骤确定的结构化数据,根据描述方法对象startFunc1的方法调用关系的键值对,可以确定方法对象startFunc1调用的所有方法。本实施例中,假设确定的方法对象startFunc1调用的方法对象有3个,分别表示为:func11、func12和endFunc1,接下来,将分别根据方法对象func11、func12和endFunc1构建根节点的子节点,得到方法对象func11、func12和endFunc1各自对应的子节点,如图2中方法调用关系树根节点200的子节点210、220和230。
在构建完当前层节点的子节点之后,首先需要判断当前层节点的各个子节点对应的方法对象是否为结束调用方法对象。如果某个子节点对应的方法对象为结束调用方法对象,说明该方法对象没有继续调用其他方法对象,不必继续遍历该子节点对应的方法对象的调用关系,如子节点210对应的方法对象endFunc1。如果某个子节点对应的方法对象不是结束调用方法对象,说明程序代码中,该方法对象调用了其他方法对象,需要继续遍历该子节点对应的方法对象的调用关系,如子节点220和230对应的方法对象func11和func12。
具体至本实施例而言,子节点220和230对应的方法对象func11和func12不是结束调用方法对象,则需要继续遍历方法对象func11和func12的方法调用关系。
接下来,将子节点220和220分别作为当前层节点,通过遍历前述步骤确定的结构化数据,根据描述方法对象func11的方法调用关系的键值对,确定方法对象func11调用的所有方法,并根据方法对象func11调用的所有方法,构建节点220的子节点,如图2中的节点2201和2202;根据描述方法对象func12的方法调用关系的键值对,确定方法对象func12调用的所有方法,并根据方法对象func12调用的所有方法,构建节点230的子节点,如图2中的节点2301和2302。至此,完成了方法调用关系树的又一层节点的构建。
接下来,在构建完当前层节点的子节点之后,还需要判断当前层节点的各个子节点对应的方法对象是否为结束调用方法对象。例如,分别判断节点2201、2202、2301和2302对应的方法对象是否为结束调用方法对象,并根据判断结果确定是否继续构建下一层节点。具体到本实施例而言,假设节点2201、2202、2301和2302对应的方法对象均为结束调用方法对象(例如,节点2201、2202、2301和2302对应的方法对象分别为endFunc2、endFunc3、endFunc4和endFunc5),则说明开始调用方法startFunc1逐层调用的方法对象均已遍历完,并构建到开始调用方法startFunc1对应的方法调用关系树中。
至此,完成了开始调用方法startFunc1对应的方法调用关系树。按照此方法分别构建开始调用方法startFunc2、…、startFuncM对应的方法调用关系树,则可以得到业务标识ID1对应的M个方法调用关系树。如果业务标识ID1对应的N个结束调用方法对象,则这N个结束调用方法对象将对应在上述M个方法调用关系树的叶子节点,其中,每个方法调用关系树可能包含多个叶子节点,即每个方法调用关系树中可能包括多个方法调用链路。
本申请的一些实施例中,以字符串与描述关键词的组合构建键值对,用于描述方法调用关系,其中,字符串可以为方法对象名称、类对象名称,或者根据方法对象名称、类对象名称生成;关键词为对调用关系、隶属关系等的描述词语。例如,前述步骤生成的结构化数据中将以如[“className”:“getData”,“methodName”:“func3”]的键值对描述类对象getData中声明的方法对象func3,即通过类对象名称和方法对象名称的键值对应关系描述类对象包含的方法对象。对于通用的基于类的方法调用源代码,前述步骤生成的结构化数据中将以指定关键词(如“invoke”)描述方法对象对类对象中的方法调用关系。本申请的一些实施例中,基于所述结构化数据中描述的所述方法调用关系,确定所述当前层级方法对象调用的各下一层级方法对象的步骤,包括以下任意一种或多种方法。
第一种方法,基于所述结构化数据中确定所述当前层级方法对象调用的类对象名称和方法对象名称,之后,根据所述结构化数据确定所述类对象名称对应的所述方法对象名称所属方法对象,作为所述当前层级方法对象调用的方法对象。例如,对于当前层级方法对象func1,如果遍历到结构化数据中包括以“func1”为值的方法名称映射关系,例如键值对“methodName”:“func1”{“invoke”:[[“className”:“viewController”,“methodName”:“func2”]],则进一步查找关键词“invoke”对应的键,并从“invoke”对应的值中确定方法对象“func1”调用的方法,如确定当前层级方法对象func1调用了类对象viewController中的方法对象func2,之后,将方法对象func2作为当前层级方法对象func1调用的方法对象。
第二种方法,根据所述结构化数据确定所述开始调用方法中跳转到的页面对应的类对象名称,之后,根据所述结构化数据确定所述类对象名称对应的所有方法对象名称所属方法对象,作为所述当前层级方法对象调用的方法对象。例如,对于当前层级方法对象func1,如果遍历到结构化数据中包括键值对“methodName”=“func1”,并且,键值对“methodName”=“func1”之后的键值对数据中包括指示页面跳转关系的关键词,则根据指示页面跳转关系的关键词所在键值对进一步确定跳转到的页面对应的类对象名称。之后,在所述结构化数据中遍历以该类对象名称为键的类别声明键值对,从而获取该类别名称的类对象声明的说是有方法对象。
第三种方法,根据所述结构化数据确定接收所述当前层级方法对象发送的通知的所有方法对象,作为所述当前层级方法对象调用的方法对象。又例如,当根据当前层级方法对象func1的属性信息确定所述方法对象func1为消息通知类型的方法对象时,通过对所述结构化数据中的键值对与方法对象func1的对象名称和描述接收通知调用关系的关键词进行匹配,确定接收方法对象func1发送的通知消息的所有方法对象,并将确定的所有方法对象作为方法对象func1调用的方法对象。
第四种方法,根据所述结构化数据确定监听所述当前层级方法对象的所有方法对象,作为所述当前层级方法对象调用的方法对象。再例如,通过对所述结构化数据中的键值对与方法对象func1的对象名称和描述监听调用关系的关键词进行匹配,确定监听方法对象func1的所有方法对象,并将确定的所有方法对象作为方法对象func1调用的方法对象。
第五种方法,根据所述结构化数据确定遵循所述当前层级方法对象代理协议的所有类对象,并将确定的所有类对象的所有方法对象,作为所述当前层级方法对象调用的方法对象。又例如,当根据当前层级方法对象func1的属性信息确定所述方法对象func1为方法代理类型的方法对象时,通过对所述结构化数据中的键值对与方法对象func1的对象名称和描述遵循方法代理协议的关键词进行匹配,确定遵循方法对象func1的代理协议的所有类对象,并进一步确定每个类对象中声明的所有方法对象,并将确定的所有方法对象作为方法对象func1调用的方法对象。
以上几种确定方法对象调用的各下一层级方法对象的具体例子,仅仅是一种可能的实施方式,具体实施时,描述调用关系的关键词还可以定义为其他词语,键值对中的字符串还可以根据对象名称或方法名称采用其他方法生成,本申请不一一例举。
本申请的一些实施例中,通常每个源代码文件会生成一个结构化数据文件,为了便于基于结构化数据构建方法调用关系树,提升后续遍历效率,可以首先对结构化数据文件中的部分数据进行合并和简化处理。例如,对于一些第三方提供的类或方法,以及不需要跟踪运行情况的类或方法,可以将其对应的键值对应关系数据从结构化数据中删除。又例如,对于在不同源文件中声明的同一个类的方法,可以将其键值映射关系合并到同一个结构化数据文件中。再例如,对于某个通知类或者代理类的方法对象或类对象的键值映射关系,通常情况下会分布在多个结构化数据文件中,可以将某个通知类或者代理类的方法对象或类对象的键值映射关系合并至一个结构化数据文件。
本申请的一些实施例中,为了便于后续进行源代码匹配,可以将结构化数据文件与类对象对应存储,即在一个结构化数据文件中,仅存储一个类对象的键值映射关系。
步骤140,遍历与指定业务标识关联的所述方法调用关系树,确定所述指定业务标识所标识的业务的每条方法调用链路。
进一步的,从每个叶子节点起,逐层向上遍历所述方法调用关系树的各级节点,可以得到与该叶子节点对应的一个树分支,每个树分支即对应一条方法调用链路。按照此方法遍历一个指定业务标识(如业务标识ID1)对应的所有开始调用方法对象(如前述开始调用方法startMethod1、startMethod2、…、startMethodM)对应的每个方法调用关系树,即可得到该指定业务标识所标识的业务覆盖的所有方法调用链路。
本申请实施例公开的对应业务的方法调用链路确定方法,通过结构化数据描述应用程序代码中声明的类对象、各所述类对象中声明的方法对象,以及,各所述方法对象的属性信息和方法调用关系,其中,至少部分所述方法对象的属性信息包括:用于指示所述方法对象为开始调用方法或结束调用方法的标识、所述方法对象关联的业务标识;遍历所述结构化数据,根据所述方法对象的所述属性信息和所述业务标识,分别确定关联不同所述业务标识的开始调用方法对象和结束调用方法对象;对于每个所述开始调用方法对象,基于所述结构化数据中描述的所述方法调用关系,分别构建与指定业务标识关联的方法调用关系树,其中,所述指定业务标识为所述开始调用方法对象关联的业务标识;遍历与指定业务标识关联的所述方法调用关系树,确定所述指定业务标识所标识的业务的每条方法调用链路,使得可以自动确定应用程序中每个业务模块的方法调用电路,相比于现有技术中手动梳理每个业务模块调用的方法对象而言,提升了确定应用程序中指定业务模块代码的方法调用链路的效率。
本申请实施例公开的对应业务的方法调用链路确定方法,通过预先在应用程序的各业务模块的开始调用方法对象的程序代码中插入标识,用于标记将该方法对象为开始调用方法,以及在结束调用方法对象的程序代码中插入标识,用于标记该方法对象为结束调用方法对象,然后,基于方法调用关系构建每个业务模块对应的方法调用关系树,最后,对于一个指定的业务模块,通过遍历该业务模块对应的所有方法调用关系树,确定该指定业务模块的方法调用链路。构建方法调用关系树以及遍历方法调用关系树的过程全自动执行,对于一个包含有几十个甚至上百个业务模块的应用程序,在手动标记各个业务模块的开始调用方法对象和结束调用方法对象的基础上,通过静态代码分析、构建方法调用关系树,自动找到中间调用方法,充分提升了确定指定业务模块代码的方法调用链路的效率。并且,手动标记上百甚至上千个方法对象,容易标错和遗漏,而自动标记中间调用方法准确度更高,并且不会出现遗漏的情况。并且,当程序代码进行版本迭代时,通过执行本申请实施例公开的方法,可以快速确定各个业务模块的方法调用链路,可维护性高。
实施例二
如图3所示,基于实施例一,本申请另一实施例公开的一种对应业务的方法调用链路确定方法,在步骤140之后,还包括:步骤150至步骤170。
步骤150,遍历各业务标识所标识的业务的所有所述方法调用链路,确定与各业务标识关联的所有中间调用方法对象,并确定各所述中间调用方法对象关联的所有业务标识。
按照实施例中所述的方法,可以确定目标应用程序中实现每个业务模块的程序代码中调用的所有方法对象。接下来,在实现不同业务模块的程序代码的方法对象中插入检测代码,用于在目标应用程序执行过程中获取该业务模块的执行情况,例如,监测业务模块是否执行异常。
为了在方法对象的代码中插入检测代码,首先需要找到应用程序代码中需要插入检测代码的方法对象。由于,各业务的开始调用方法对象和结束调用方法对象中需要预先手动插入了标识该方法对象类型标识的代码,本申请的一些实施例中,可以在手动插入标识该方法对象类型标识的代码时,同时插入检测代码。因此,本申请实施例中重点描述确定应用程序代码中业务的中间调用方法对象的方法,以及在确定的中间调用方法对象中插入检测代码的方法。
通常情况下,应用程序代码中会包含成百上千的方法对象代码,不同业务模块在运行过程中,需要执行其中部分方法对象的程序代码,经常会出现不同业务模块执行同一个方法对象代码的情况。那么,基于这种方法对象调用关系,不同业务标识关联的方法调用关系树中的节点,可能对应同一个方法对象。为了保证在每个中间调用方法处插入的检测代码能够检测到执行该方法对象的全部业务的执行情况,并且避免重复对中间调用方法插入检测代码,提升检测代码的插入效率,本申请的一些实施例中,通过遍历所有业务标识关联的方法调用关系树搜集到每个业务中调用的方法对象,之后,对每个方法对象进行调用关系合并,并基于合并后的调用关系插入检测代码。
本申请的一些实施例中,所述遍历各业务标识所标识的业务的所有所述方法调用链路,确定与各业务标识关联的所有中间调用方法对象,并确定各所述中间调用方法对象关联的所有业务标识,包括:遍历各业务标识所标识的业务的每个所述方法调用链路,分别确定每个所述方法调用链路中包括的中间调用方法对象,并建立确定的所述中间调用方法对象与所属方法调用链路的所述业务标识的关联关系;对于每个所述中间调用方法对象,将该中间调用方法对象与各所述业务标识的所有所述关联关系进行合并,得到该中间调用方法关联的所有业务标识。
如实施例一中所述,通过执行实施例一中所述的方法构建方法调用关系树之后,可以得到每个业务标识关联的一个或多个方法调用关系树。每个方法调用关系树中记载了方法对象的调用关系,方法调用关系树中的每个节点存储了该节点对应的方法对象的相关信息,如方法对象的名称。同时,每个方法调用关系树关联一个业务标识,各方法调用关系树关联的业务标识也是该方法调用关系树中各节点对应的方法对象所属业务的业务标识。
例如,图2所示的方法调用关系树关联业务标识ID1,那么,图2所示的方法调用关系树中的各节点200、210、220、…、2301、2302对应的方法对象startFunc、func1、func 2…也对应业务标识ID1。即方法调用关系树中的节点对应的方法对象与该方法调用关系树关联的业务标识存在对应关系。进一步的,对于任意一个业务标识(如业务标识ID1),通过遍历与该业务标识关联的所有方法调用关系树,可以搜集到与该业务标识关联的所有方法调用关系树中的所有节点对应的方法对象,由此过程可以确定,搜集到的所有方法对象均关联一个业务标识(如业务标识ID1)。至此,可以确定一组方法对象与业务标识的关联关系。
按照上述方法,对目标应用程序中的每个业务模块的业务标识关联的方法调用关系树进行遍历,可以确定多组方法对象与业务标识的关联关系。
接下来,将得到的多组方法对象与业务标识的关联关系进行合并处理,即对于多组方法对象与业务标识的关联关系中的每个方法对象,确定其与不同业务标识的所有关联关系,然后建议方法对象与业务标识的一对多的关联关系。例如,一个方法对象关联多个业务标识。
步骤160,将确定的每个所述中间调用方法对象分别与所述应用程序代码中声明的方法对象进行匹配,确定匹配成功的所述方法对象作为与相应所述中间调用方法对象对应的待插桩方法对象。
接下来,需要在目标应用程序的源代码中查找中间调用方法对象。
本申请的一些实施例中,可以通过正则匹配的方式,确定应用程序源代码中声明的方法对象是否与中间调用方法对象匹配。以结构化数据中通过方法对象名称字符串表示中间调用方法对象为例,源代码中的方法对象func2通过结构化数据进行描述时,被表示为形如“methodName”:“func2”的键值对,因此,将中间调用方法对象的名称与应用程序源代码中的方法对象名称进行匹配,即可确定源代码中的中间调用方法。
本申请的一些实施例中,所述结构化数据中包括类对象名称对应的类对象的源代码存储文件信息,所述将确定的每个所述中间调用方法对象分别与所述应用程序代码中声明的方法对象进行匹配,包括:依次执行以下方法对象匹配操作,直至确定与所述中间调用方法对象匹配的方法对象:将所述中间调用方法对象与所述中间调用方法对象所属类的源代码存储文件中声明的方法对象进行匹配;将所述中间调用方法对象与所述中间调用方法对象所属类的扩展类对象的源代码存储文件中声明的方法对象进行匹配;将所述中间调用方法对象与所述中间调用方法对象的父类对应的源代码存储文件中声明的方法对象进行匹配;将所述中间调用方法对象与所述目标应用程序的所有源代码存储文件中声明的方法对象进行匹配。
例如,为了提升检测代码的插入效率,在结构化数据中会记录各个类对象名称对应的类对象的源代码的存储路径和文件名称。在将确定的所述中间调用方法对象与所述应用程序代码中声明的方法对象进行匹配,确定待插桩方法对象时,可以首先根据所述结构化数据确定所述中间调用方法对象对应的类对象的源代码的存储文件,之后,仅将所述中间调用方法对象于该文件中的方法对象进性匹配,可以有效减少匹配数量,提升匹配效率。
如果在将所述中间调用方法对象与原始类对应的所述源代码存储文件中声明的方法对象进行匹配之后,确定方法对象匹配失败,依次执行以下方法对象匹配操作,直至确定与所述中间调用方法对象匹配的方法对象:将所述中间调用方法对象与所述中间调用方法对象所属类的扩展类对象的源代码存储文件中声明的方法对象进行匹配、将所述中间调用方法对象与所述中间调用方法对象的父类对应的源代码存储文件中声明的方法对象进行匹配、将所述中间调用方法对象与所述目标应用程序的所有源代码存储文件中声明的方法对象进行匹配。方法调用存在多种方式,可能是常规的基于原始类的方法调用,也可能是基于父类的方法调用,还可能是基于扩展类的方法调用,但是,大部分情况是基于原始类的调用,因此,通过在由小到大的匹配范围中进行对象匹配,可以提升对象匹配效率。其中,方法对象的父类,以及父类的源代码存储文件可以在结构化数据中获取到;方法对象所述类的扩展类对象,可以通过在结构化数据中执行类对象名称匹配确定。
步骤170,在每个所述待插桩方法对象的声明代码中,插入检测代码。
其中,所述检测代码是根据与所述待插桩方法对象对应的所述中间调用方法对象关联的所有业务标识生成的。
找到应用程序源代码中的待插桩方法之后,可以根据调用该待插桩方法的业务模块的业务标识,采用预设的编码规则生成检测代码,并将生成的检测代码插入至该待插桩方法的第一行源代码之前。例如,对于步骤140中确定的方法调用链路中的中间调用方法对象func2,如果前述步骤中确定中间调用方法对象func2关联业务标识ID1和ID2,同时,前述步骤中确定了中间调用方法对象func2匹配源代码文件1.m中声明的方法对象func2,则可以根据业务标识ID1和ID2生成检测代码(如构建一个宏),并将生成的检测代码插入到源代码文件1.m中方法对象func2的源代码的第一行之前。
本申请的一些实施例中,为了更好的检测业务模块的执行情况,可以根据业务需求配置根据业务标识生成检测代码的规则,以通过执行检测代码获取更多的业务模块执行信息。
现有技术中,为了确定某个业务模块调用的方法对象的执行信息,在通过人工梳理业务逻辑与代码逻辑,找到业务上的所有方法之后,通常手动插入监控代码,使得在业务模块的程序代码被执行的过程中,可以获取到调用的各个方法对象的执行情况。如果业务代码有改动,需要重新去修改监控代码,可维护性差。而通过本实施例公开的对应业务的方法调用链路确定方法,准确确定指定业务模块调用的方法对象之后,可以在该指定业务模块调用的每个中间方法对象中自动插入检测代码,用于监控该指定业务模块对各方法对象的调用情况,提升了业务执行信息的检测效率,便于维护。
实施例三
本申请实施例公开的一种对应业务的方法调用链路确定装置,如图4所示,所述装置包括:
程序代码结构化处理模块410,用于通过结构化数据描述应用程序代码中声明的类对象、各所述类对象中声明的方法对象,以及,各所述方法对象的属性信息和方法调用关系,其中,至少部分所述方法对象的属性信息包括:用于指示所述方法对象为开始调用方法或结束调用方法的标识、所述方法对象关联的业务标识;
开始和结束调用方法确定模块420,用于遍历所述结构化数据,根据所述方法对象的所述属性信息和所述业务标识,分别确定关联不同所述业务标识的开始调用方法对象和结束调用方法对象;
方法调用关系树构建模块430,用于对于每个所述开始调用方法对象,基于所述结构化数据中描述的所述方法调用关系,分别构建与指定业务标识关联的方法调用关系树,其中,所述指定业务标识为所述开始调用方法对象关联的所述业务标识;
方法调用链路确定模块440,用于遍历与指定业务标识关联的所述方法调用关系树,确定所述指定业务标识所标识的业务的每条方法调用链路。
本申请的一些实施例中,如图5所示,所述装置还包括:
链路插桩模块450,用于遍历各业务标识所标识的业务的所有所述方法调用链路,确定与各业务标识关联的所有中间调用方法对象,并确定各所述中间调用方法对象关联的所有业务标识;
所述链路插桩模块450,还用于将确定的每个所述中间调用方法对象分别与所述应用程序代码中声明的方法对象进行匹配,确定匹配成功的所述方法对象作为与相应所述中间调用方法对象对应的待插桩方法对象;并在每个所述待插桩方法对象的声明代码中,插入检测代码,其中,所述检测代码是根据与所述待插桩方法对象对应的所述中间调用方法对象关联的所有业务标识生成的。
本申请的一些实施例中,所述遍历各业务标识所标识的业务的所有所述方法调用链路,确定与各业务标识关联的所有中间调用方法对象,并确定各所述中间调用方法对象关联的所有业务标识,包括:
遍历各业务标识所标识的业务的每个所述方法调用链路,分别确定每个所述方法调用链路中包括的中间调用方法对象,并建立确定的所述中间调用方法对象与所属方法调用链路的所述业务标识的关联关系;
对于每个所述中间调用方法对象,将该中间调用方法对象与各所述业务标识的所有所述关联关系进行合并,得到该中间调用方法关联的所有业务标识。
本申请的一些实施例中,所述结构化数据中包括类对象名称对应的类对象的源代码存储文件信息,所述将确定的每个所述中间调用方法对象分别与所述应用程序代码中声明的方法对象进行匹配,包括:
依次执行以下方法对象匹配操作,直至确定与所述中间调用方法对象匹配的方法对象:
将所述中间调用方法对象与所述中间调用方法对象所属类的源代码存储文件中声明的方法对象进行匹配;
将所述中间调用方法对象与所述中间调用方法对象所属类的扩展类对象的源代码存储文件中声明的方法对象进行匹配;
将所述中间调用方法对象与所述中间调用方法对象的父类对应的源代码存储文件中声明的方法对象进行匹配;
将所述中间调用方法对象与所述目标应用程序的所有源代码存储文件中声明的方法对象进行匹配。
本申请的一些实施例中,如图5所示,所述方法调用关系树构建模块430进一步包括:调用方法确定子模块4301、子节点构建子模块4302以及跳转判断子模块4303,所述方法调用关系树构建模块430,进一步用于在对于每个所述开始调用方法对象,根据所述开始调用方法对象构建根节点;并以所述开始调用方法对象为当前层级方法对象,执行所述调用方法确定子模块4301、所述子节点构建子模块4302以及所述跳转判断子模块4303,其中,
所述调用方法确定子模块4301,用于基于所述结构化数据中描述的所述方法调用关系,确定所述当前层级方法对象调用的各下一层级方法对象;
所述子节点构建子模块4302,用于根据各所述下一层级方法对象构建所述当前层级方法对象对应的节点的子节点;
所述跳转判断子模块4303,用于响应于各所述下一层级方法对象中包括不属于所述结束调用方法对象的方法对象,将不属于所述结束调用方法对象的所述下一层级方法对象分别作为当前层级方法对象,并跳转至执行所述调用方法确定子模块4301和所述子节点构建子模块4302,直至各所述下一层级方法对象全部为所述结束调用方法对象。
本申请的一些实施例中,所述基于所述结构化数据中描述的所述方法调用关系,确定所述当前层级方法对象调用的各下一层级方法对象,包括以下任意一种或多种方法:
基于所述结构化数据中确定所述当前层级方法对象调用的类对象名称和方法对象名称,之后,根据所述结构化数据确定所述类对象名称对应的所述方法对象名称所属方法对象,作为所述当前层级方法对象调用的方法对象;
根据所述结构化数据确定所述开始调用方法中跳转到的页面对应的类对象名称,之后,根据所述结构化数据确定所述类对象名称对应的所有方法对象名称所属方法对象,作为所述当前层级方法对象调用的方法对象;
根据所述结构化数据确定接收所述当前层级方法对象发送的通知的所有方法对象,作为所述当前层级方法对象调用的方法对象;
根据所述结构化数据确定监听所述当前层级方法对象的所有方法对象,作为所述当前层级方法对象调用的方法对象;
根据所述结构化数据确定遵循所述当前层级方法对象代理协议的所有类对象,并将确定的所有类对象的所有方法对象,作为所述当前层级方法对象调用的方法对象。
本申请的一些实施例中,所述程序代码结构化处理模块410,进一步用于:
通过JSON键值对描述应用程序代码中声明的类对象的属性信息、各所述类对象中声明和/或调用的方法对象,以及各所述方法对象的属性信息,以及各所述方法对象的方法调用关系。
本申请实施例公开的对应业务的方法调用链路确定装置,用于实现本申请实施例一和实施例二中所述的对应业务的方法调用链路确定方法,装置的各模块的具体实施方式不再赘述,可参见方法实施例相应步骤的具体实施方式。
本申请实施例公开的对应业务的方法调用链路确定装置,通过结构化数据描述应用程序代码中声明的类对象、各所述类对象中声明的方法对象,以及,各所述方法对象的属性信息和方法调用关系,其中,至少部分所述方法对象的属性信息包括:用于指示所述方法对象为开始调用方法或结束调用方法的标识、所述方法对象关联的业务标识;遍历所述结构化数据,根据所述方法对象的所述属性信息和所述业务标识,分别确定关联不同所述业务标识的开始调用方法对象和结束调用方法对象;对于每个所述开始调用方法对象,基于所述结构化数据中描述的所述方法调用关系,分别构建与指定业务标识关联的方法调用关系树,其中,所述指定业务标识为所述开始调用方法对象关联的业务标识;遍历与指定业务标识关联的所述方法调用关系树,确定所述指定业务标识所标识的业务的每条方法调用链路,使得可以自动确定应用程序中每个业务模块的方法调用电路,相比于现有技术中手动梳理每个业务模块调用的方法对象而言,提升了确定应用程序中指定业务模块代码的方法调用链路的效率。
本申请实施例公开的对应业务的方法调用链路确定装置,通过预先在应用程序的各业务模块的开始调用方法对象的程序代码中插入标识,用于标记将该方法对象为开始调用方法,以及在结束调用方法对象的程序代码中插入标识,用于标记该方法对象为结束调用方法对象,然后,基于方法调用关系构建每个业务模块对应的方法调用关系树,最后,对于一个指定的业务模块,通过遍历该业务模块对应的所有方法调用关系树,确定该指定业务模块的方法调用链路。构建方法调用关系树以及遍历方法调用关系树的过程全自动执行,对于一个包含有几十个甚至上百个业务模块的应用程序,在手动标记各个业务模块的开始调用方法对象和结束调用方法对象的基础上,通过静态代码分析、构建方法调用关系树,自动找到中间调用方法,充分提升了确定指定业务模块代码的方法调用链路的效率。并且,手动标记上百甚至上千个方法对象,容易标错和遗漏,而自动标记中间调用方法准确度更高,并且不会出现遗漏的情况。并且,当程序代码进行版本迭代时,通过执行本申请实施例公开的方法,可以快速确定各个业务模块的方法调用链路,可维护性高。
进一步的,通过本实施例公开的对应业务的方法调用链路确定装置,在准确确定指定业务模块调用的方法对象之后,可以在该指定业务模块调用的每个中间方法对象中自动插入检测代码,用于监控该指定业务模块对各方法对象的调用情况,提升了业务执行信息的检测效率,便于维护。
本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。对于装置实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
以上对本申请提供的一种对应业务的方法调用链路确定方法及装置进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其一种核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。
以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
本申请的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本申请实施例的电子设备中的一些或者全部部件的一些或者全部功能。本申请还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本申请的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
例如,图6示出了可以实现根据本申请的方法的电子设备。所述电子设备可以为PC机、移动终端、个人数字助理、平板电脑等。该电子设备传统上包括处理器610和存储器620及存储在所述存储器620上并可在处理器610上运行的程序代码630,所述处理器610执行所述程序代码630时实现上述实施例中所述的方法。所述存储器620可以为计算机程序产品或者计算机可读介质。存储器620可以是诸如闪存、EEPROM(电可擦除可编程只读存储器)、EPROM、硬盘或者ROM之类的电子存储器。存储器620具有用于执行上述方法中的任何方法步骤的计算机程序的程序代码630的存储空间6201。例如,用于程序代码630的存储空间6201可以包括分别用于实现上面的方法中的各种步骤的各个计算机程序。所述程序代码630为计算机可读代码。这些计算机程序可以从一个或者多个计算机程序产品中读出或者写入到这一个或者多个计算机程序产品中。这些计算机程序产品包括诸如硬盘,紧致盘(CD)、存储卡或者软盘之类的程序代码载体。所述计算机程序包括计算机可读代码,当所述计算机可读代码在电子设备上运行时,导致所述电子设备执行根据上述实施例的方法。
本申请实施例还公开了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如本申请实施例一和实施例二所述的对应业务的方法调用链路确定方法的步骤。
这样的计算机程序产品可以为计算机可读存储介质,该计算机可读存储介质可以具有与图6所示的电子设备中的存储器620类似布置的存储段、存储空间等。程序代码可以例如以适当形式进行压缩存储在所述计算机可读存储介质中。所述计算机可读存储介质通常为如参考图7所述的便携式或者固定存储单元。通常,存储单元包括计算机可读代码630’,所述计算机可读代码630’为由处理器读取的代码,这些代码被处理器执行时,实现上面所描述的方法中的各个步骤。
本文中所称的“一个实施例”、“实施例”或者“一个或者多个实施例”意味着,结合实施例描述的特定特征、结构或者特性包括在本申请的至少一个实施例中。此外,请注意,这里“在一个实施例中”的词语例子不一定全指同一个实施例。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本申请的实施例可以在没有这些具体细节的情况下被实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本申请可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。
最后应说明的是:以上实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的精神和范围。

Claims (10)

1.一种对应业务的方法调用链路确定方法,其特征在于,包括:
通过结构化数据描述应用程序代码中声明的类对象、各所述类对象中声明的方法对象,以及,各所述方法对象的属性信息和方法调用关系,其中,至少部分所述方法对象的属性信息包括:用于指示所述方法对象为开始调用方法或结束调用方法的标识、所述方法对象关联的业务标识;
遍历所述结构化数据,根据所述方法对象的所述属性信息和所述业务标识,分别确定关联不同所述业务标识的开始调用方法对象和结束调用方法对象;
对于每个所述开始调用方法对象,基于所述结构化数据中描述的所述方法调用关系,分别构建与指定业务标识关联的方法调用关系树,其中,所述指定业务标识为所述开始调用方法对象关联的所述业务标识;
遍历与指定业务标识关联的所述方法调用关系树,确定所述指定业务标识所标识的业务的每条方法调用链路。
2.根据权利要求1所述的方法,其特征在于,所述确定所述指定业务标识所标识的业务的每条方法调用链路的步骤之后,还包括:
遍历各业务标识所标识的业务的所有所述方法调用链路,确定与各业务标识关联的所有中间调用方法对象,并确定各所述中间调用方法对象关联的所有业务标识;
将确定的每个所述中间调用方法对象分别与所述应用程序代码中声明的方法对象进行匹配,确定匹配成功的所述方法对象作为与相应所述中间调用方法对象对应的待插桩方法对象;
在每个所述待插桩方法对象的声明代码中,插入检测代码,其中,所述检测代码是根据与所述待插桩方法对象对应的所述中间调用方法对象关联的所有业务标识生成的。
3.根据权利要求2所述的方法,其特征在于,所述遍历各业务标识所标识的业务的所有所述方法调用链路,确定与各业务标识关联的所有中间调用方法对象,并确定各所述中间调用方法对象关联的所有业务标识的步骤,包括:
遍历各业务标识所标识的业务的每个所述方法调用链路,分别确定每个所述方法调用链路中包括的中间调用方法对象,并建立确定的所述中间调用方法对象与所属方法调用链路的所述业务标识的关联关系;
对于每个所述中间调用方法对象,将该中间调用方法对象与各所述业务标识的所有所述关联关系进行合并,得到该中间调用方法关联的所有业务标识。
4.根据权利要求2所述的方法,其特征在于,所述结构化数据中包括类对象名称对应的类对象的源代码存储文件信息,所述将确定的每个所述中间调用方法对象分别与所述应用程序代码中声明的方法对象进行匹配的步骤,包括:
依次执行以下方法对象匹配操作,直至确定与所述中间调用方法对象匹配的方法对象:
将所述中间调用方法对象与所述中间调用方法对象所属类的源代码存储文件中声明的方法对象进行匹配;
将所述中间调用方法对象与所述中间调用方法对象所属类的扩展类对象的源代码存储文件中声明的方法对象进行匹配;
将所述中间调用方法对象与所述中间调用方法对象的父类对应的源代码存储文件中声明的方法对象进行匹配;
将所述中间调用方法对象与所述目标应用程序的所有源代码存储文件中声明的方法对象进行匹配。
5.根据权利要求1至4任一项所述的方法,其特征在于,所述对于每个所述开始调用方法对象,基于所述结构化数据中描述的所述方法调用关系,分别构建与指定业务标识关联的方法调用关系树的步骤,包括:
对于每个所述开始调用方法对象,根据所述开始调用方法对象构建根节点;
以所述开始调用方法对象为当前层级方法对象,执行以下节点构建子步骤:
调用方法确定子步骤,基于所述结构化数据中描述的所述方法调用关系,确定所述当前层级方法对象调用的各下一层级方法对象;
子节点构建子步骤,根据各所述下一层级方法对象构建所述当前层级方法对象对应的节点的子节点;
跳转判断子步骤,响应于各所述下一层级方法对象中包括不属于所述结束调用方法对象的方法对象,将不属于所述结束调用方法对象的所述下一层级方法对象分别作为当前层级方法对象,并跳转至执行所述调用方法确定子步骤和所述子节点构建子步骤,直至各所述下一层级方法对象全部为所述结束调用方法对象。
6.根据权利要求5所述的方法,其特征在于,所述基于所述结构化数据中描述的所述方法调用关系,确定所述当前层级方法对象调用的各下一层级方法对象的步骤,包括以下任意一种或多种方法:
基于所述结构化数据中确定所述当前层级方法对象调用的类对象名称和方法对象名称,之后,根据所述结构化数据确定所述类对象名称对应的所述方法对象名称所属方法对象,作为所述当前层级方法对象调用的方法对象;
根据所述结构化数据确定所述开始调用方法中跳转到的页面对应的类对象名称,之后,根据所述结构化数据确定所述类对象名称对应的所有方法对象名称所属方法对象,作为所述当前层级方法对象调用的方法对象;
根据所述结构化数据确定接收所述当前层级方法对象发送的通知的所有方法对象,作为所述当前层级方法对象调用的方法对象;
根据所述结构化数据确定监听所述当前层级方法对象的所有方法对象,作为所述当前层级方法对象调用的方法对象;
根据所述结构化数据确定遵循所述当前层级方法对象代理协议的所有类对象,并将确定的所有类对象的所有方法对象,作为所述当前层级方法对象调用的方法对象。
7.根据权利要求1至4任一项所述的方法,其特征在于,所述通过结构化数据描述应用程序代码中声明的类对象、各所述类对象中声明的方法对象,以及,各所述方法对象的属性信息和方法调用关系的步骤,包括:
通过JSON键值对描述应用程序代码中声明的类对象的属性信息、各所述类对象中声明和/或调用的方法对象,以及各所述方法对象的属性信息,以及各所述方法对象的方法调用关系。
8.一种对应业务的方法调用链路确定装置,其特征在于,包括:
程序代码结构化处理模块,用于通过结构化数据描述应用程序代码中声明的类对象、各所述类对象中声明的方法对象,以及,各所述方法对象的属性信息和方法调用关系,其中,至少部分所述方法对象的属性信息包括:用于指示所述方法对象为开始调用方法或结束调用方法的标识、所述方法对象关联的业务标识;
开始和结束调用方法确定模块,用于遍历所述结构化数据,根据所述方法对象的所述属性信息和所述业务标识,分别确定关联不同所述业务标识的开始调用方法对象和结束调用方法对象;
方法调用关系树构建模块,用于对于每个所述开始调用方法对象,基于所述结构化数据中描述的所述方法调用关系,分别构建与指定业务标识关联的方法调用关系树,其中,所述指定业务标识为所述开始调用方法对象关联的所述业务标识;
方法调用链路确定模块,用于遍历与指定业务标识关联的所述方法调用关系树,确定所述指定业务标识所标识的业务的每条方法调用链路。
9.一种电子设备,包括存储器、处理器及存储在所述存储器上并可在处理器上运行的程序代码,其特征在于,所述处理器执行所述程序代码时实现权利要求1至7任意一项所述的对应业务的方法调用链路确定方法。
10.一种计算机可读存储介质,其上存储有程序代码,其特征在于,该程序代码被处理器执行时实现权利要求1至7任意一项所述的对应业务的方法调用链路确定方法的步骤。
CN202011312613.0A 2020-11-20 2020-11-20 对应业务的方法调用链路确定方法、装置、电子设备 Pending CN112506923A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202011312613.0A CN112506923A (zh) 2020-11-20 2020-11-20 对应业务的方法调用链路确定方法、装置、电子设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202011312613.0A CN112506923A (zh) 2020-11-20 2020-11-20 对应业务的方法调用链路确定方法、装置、电子设备

Publications (1)

Publication Number Publication Date
CN112506923A true CN112506923A (zh) 2021-03-16

Family

ID=74959200

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202011312613.0A Pending CN112506923A (zh) 2020-11-20 2020-11-20 对应业务的方法调用链路确定方法、装置、电子设备

Country Status (1)

Country Link
CN (1) CN112506923A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113110947A (zh) * 2021-04-16 2021-07-13 中国工商银行股份有限公司 一种程序调用链生成方法、系统、电子设备及介质

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113110947A (zh) * 2021-04-16 2021-07-13 中国工商银行股份有限公司 一种程序调用链生成方法、系统、电子设备及介质
CN113110947B (zh) * 2021-04-16 2024-04-02 中国工商银行股份有限公司 一种程序调用链生成方法、系统、电子设备及介质

Similar Documents

Publication Publication Date Title
CN111382070B (zh) 兼容性测试方法、装置、存储介质和计算机设备
CN111061643B (zh) Sdk集群的兼容性检测方法、装置、电子设备及存储介质
CN112394942A (zh) 基于云计算的分布式软件开发编译方法及软件开发平台
CN111654495B (zh) 用于确定流量产生来源的方法、装置、设备及存储介质
CN112540808B (zh) 一种程序行为层级调用关系的记录方法及相关设备
CN114138748A (zh) 数据库映射文件生成方法、装置、设备及存储介质
CN112181430A (zh) 代码变更统计方法、装置、电子设备及存储介质
CN113778897B (zh) 接口的自动测试方法、装置、设备及存储介质
CN112506923A (zh) 对应业务的方法调用链路确定方法、装置、电子设备
CN107038117B (zh) 一种基于事件处理函数间定义-引用的web自动化测试方法
CN116578282A (zh) 代码生成方法、装置、电子设备及介质
CN113031995B (zh) 一种更新规则的方法、装置、存储介质以及电子设备
CN113238901B (zh) 多设备的自动化测试方法及装置、存储介质、计算机设备
CN110674024A (zh) 电子设备集成测试系统及其方法
CN113946516A (zh) 代码覆盖率确定方法、装置及存储介质
US10469319B2 (en) Certification tool gap analyzer
CN110928784A (zh) 一种软件测试环境监测方法及装置
CN111736848A (zh) 包冲突定位方法、装置、电子设备及可读存储介质
Sedki et al. AWSOM-LP: An effective log parsing technique using pattern recognition and frequency analysis
CN112162954A (zh) 用户操作日志生成、路径的定位方法、装置、设备及介质
CN112130860A (zh) Json对象解析方法、装置、电子设备及存储介质
CN111209204B (zh) 一种基于JSON的web自动化测试方法及其系统和装置
CN113190453A (zh) 一种用户界面测试方法、装置、服务器和介质
CN112241360A (zh) 一种测试用例生成方法、装置、设备及存储介质
CN116661792A (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