CN109542942A - 函数调用的查询方法及装置、电子设备 - Google Patents
函数调用的查询方法及装置、电子设备 Download PDFInfo
- Publication number
- CN109542942A CN109542942A CN201811434603.7A CN201811434603A CN109542942A CN 109542942 A CN109542942 A CN 109542942A CN 201811434603 A CN201811434603 A CN 201811434603A CN 109542942 A CN109542942 A CN 109542942A
- Authority
- CN
- China
- Prior art keywords
- function
- file
- script
- block
- compilation
- 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
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/43—Checking; Contextual analysis
-
- 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
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种函数调用的查询方法及装置、电子设备。其中,该方法包括:获取待查询字段,其中,待查询字段对应有目标函数;获取预先解析的脚本函数文件,其中,脚本函数文件中包括预先对汇编文件进行代码块分解之后,解析得到的每个文件里调用到其它文件的函数列表;根据待查询字段,从脚本函数文件中查询出调用目标函数的所有函数。本发明解决了相关技术在游戏测试中,无法确定函数调用的影响范围的技术问题。
Description
技术领域
本发明涉及函数查询的技术领域,具体而言,涉及一种函数调用的查询方法及装置、电子设备。
背景技术
目前,在游戏测试工作中,如果程序修改了一个底层函数,测试人员在测试时就比较难去确定真正影响和要回归的范围,进而特别容易遗漏掉影响到的测试点而导致外服出现问题,造成损失,因此及时的确认程序修改代码影响的范围在测试人员的测试工作中显得极为重要。
当前在游戏测试时,服务器游戏代码在开服前,游戏引擎会进行一个代码编译的操作,这个操作会将每个代码文件从.c文件中生成一个.d文件,这个.d文件里会罗列出代码文件里的函数列表,字符串列表,参数列表,函数调用的继承关系,以及每句代码的汇编语言转换等。对于这种确定代码编译的方式,如果要确定代码在修改时影响范围,需要一个个查询,并且后续需要人工一个个对照,确定每个代码修改是否正确,耗时耗力。
在目前的测试工作中,如果程序改动到了底层函数,如果想要确定影响的范围,唯一的办法就是找一个有代码权限的测试人员帮忙在代码仓库里进行全文搜索,来确定影响的范围。但是这种查询方式,如果查询的关键字很普遍,全文搜索时就会出现大量的匹配,从这大量的匹配中再去寻找真正需要注意的地方,就也是一项很大的工作量(例如去搜索give_reward,会发现整个代码仓库里有几千个give_reward,不仅包括调用,还包括不同文件的内部函数定义,从这几千个里面找到真正自己要的,那工作量简直无法想象)。
针对上述的问题,目前尚未提出有效的解决方案。
发明内容
本发明实施例提供了一种函数调用的查询方法及装置、电子设备,以至少解决相关技术在游戏测试中,无法确定函数调用的影响范围的技术问题。
根据本发明实施例的一个方面,提供了一种函数调用的查询方法,包括:获取待查询字段,其中,所述待查询字段对应有目标函数;获取预先解析的脚本函数文件,其中,所述脚本函数文件中包括预先对汇编文件进行代码块分解之后,解析得到的每个文件里调用到其它文件的函数列表;根据所述待查询字段,从所述脚本函数文件中查询出调用所述目标函数的所有函数。
进一步地,获取预先解析的脚本函数文件包括:按照预设结构将所述汇编文件的内容分块,得到字符块和汇编解析块;对所述汇编解析块,按照文件函数进行分块,得到多个汇编函数块;对每个所述汇编函数块进行遍历,以得到所述脚本函数文件。
进一步地,对每个所述汇编函数块进行遍历,以得到所述脚本函数文件包括:对每一个所述汇编函数块,按照所述文件函数中的预设函数进行分块,得到多个汇编代码块;对每一个所述汇编代码块进行遍历,得到遍历结果;依据所述预设函数指示的参数,从遍历结果中提取与所述参数对应的参数个数对应的参数,得到提取结果;以所述预设函数和提取结果,建立与每个所述预设函数对应的参数列表,以得到所述脚本函数文件。
进一步地,对每一个所述汇编代码块进行遍历,得到遍历结果包括:由所述预设函数对每一个所述汇编代码块倒序遍历,其中,在遍历时对多个预设字符串遍历,所述多个预设字符串包括下述至少之一:push、string、运算符;根据遍历顺序,依次排列遍历每个参数,以得到所述遍历结果。
进一步地,在得到所述脚本函数文件之后,还包括:根据代码提交频率和函数使用量,确定代码更新时间段;依据所述代码更新时间段,对所述脚本函数文件进行更新。
进一步地,依据所述代码更新时间段,对所述脚本函数文件进行更新包括:依据所述代码更新时间段,获取修改的文件列表;提取所述修改的文件列表中被调用的函数;依据提取出的函数,更新所述脚本函数文件。
进一步地,对每个所述汇编函数块进行遍历,以得到所述脚本函数文件,还包括:获取每个所述字符块中数字与字符串参数之间的字符映射关系;在遍历所述汇编解析块的字符串函数后,得到与所述字符串函数对应的至少一个数字;依据所述字符映射关系和所述至少一个数字,确定与所述字符串函数所对应的各个字符串参数;将所述字符串参数和所述字符串函数编入所述参数列表。
进一步地,所述待查询字段还包括:与所述目标函数对应的文件名和与所述目标函数对应的函数名。
进一步地,在从所述脚本函数文件中查询出调用所述目标函数的所有函数时,还包括:查询调用所述目标函数的每个函数所对应的调用文件名和调用函数名。
根据本发明实施例的另一方面,还提供了一种函数调用的查询装置,包括:第一获取单元,用于获取待查询字段,其中,所述待查询字段对应有目标函数;第二获取单元,用于获取预先解析的脚本函数文件,其中,所述脚本函数文件中包括预先对汇编文件进行代码块分解之后,解析得到的每个文件里调用到其它文件的函数列表;查询单元,用于根据所述待查询字段,从所述脚本函数文件中查询出调用所述目标函数的所有函数。
进一步地,所述第二获取单元包括:第一分块模块,用于按照预设结构将所述汇编文件的内容分块,得到字符块和汇编解析块;第二分块模块,用于对所述汇编解析块,按照文件函数进行分块,得到多个汇编函数块;遍历模块,用于对每个所述汇编函数块进行遍历,以得到所述脚本函数文件。
进一步地,所述遍历模块包括:第一分块子模块,用于对每一个所述汇编函数块,按照所述文件函数中的预设函数进行分块,得到多个汇编代码块;第一遍历子模块,用于对每一个所述汇编代码块进行遍历,得到遍历结果;第一提取子模块,用于依据所述预设函数指示的参数,从遍历结果中提取与所述参数对应的参数个数对应的参数,得到提取结果;建立子模块,用于以所述预设函数和提取结果,建立与每个所述预设函数对应的参数列表,以得到所述脚本函数文件。
进一步地,所述第一遍历子模块包括:倒序遍历子模块,用于由所述预设函数对每一个所述汇编代码块倒序遍历,其中,在遍历时对多个预设字符串遍历,所述多个预设字符串包括下述至少之一:push、string、运算符;根据遍历顺序,依次排列遍历每个参数,以得到所述遍历结果。
进一步地,所述函数调用的查询装置还包括:第一确定模块,用于在得到所述脚本函数文件之后,根据代码提交频率和函数使用量,确定代码更新时间段;更新模块,用于依据所述代码更新时间段,对所述脚本函数文件进行更新。
进一步地,所述更新模块包括:第一获取子模块,用于依据所述代码更新时间段,获取修改的文件列表;第二提取子模块,用于提取所述修改的文件列表中被调用的函数;更新子模块,用于依据提取出的函数,更新所述脚本函数文件。
进一步地,所述遍历模块还包括:第二获取子模块,用于获取每个所述字符块中数字与字符串参数之间的字符映射关系;确定子模块,用于在遍历所述汇编解析块的字符串函数后,得到与所述字符串函数对应的至少一个数字;第二确定子模块,用于依据所述字符映射关系和所述至少一个数字,确定与所述字符串函数所对应的各个字符串参数;编入子模块,用于将所述字符串参数和所述字符串函数编入所述参数列表。
进一步地,所述待查询字段还包括:与所述目标函数对应的文件名和与所述目标函数对应的函数名。
进一步地,所述函数调用的查询装置还包括:查询模块,用于在从所述脚本函数文件中查询出调用所述目标函数的所有函数时,查询调用所述目标函数的每个函数所对应的调用文件名和调用函数名。
根据本发明实施例的另一方面,还提供了一种电子设备,包括:处理器;以及存储器,用于存储所述处理器的可执行指令;其中,所述处理器配置为经由执行所述可执行指令来执行上述任意一项所述的函数调用的查询方法。
根据本发明实施例的另一方面,还提供了一种存储介质,所述存储介质包括存储的程序,其中,在所述程序运行时控制所述存储介质所在设备执行上述任意一项所述的函数调用的查询方法。
在本发明实施例中,获取待查询字段,其中,待查询字段对应有目标函数,获取预先解析的脚本函数文件,其中,脚本函数文件中包括预先对汇编文件进行代码块分解之后,解析得到的每个文件里调用到其它文件的函数列表,根据待查询字段,从脚本函数文件中查询出调用目标函数的所有函数。在该实施例中,可以利用预先存储的脚本函数文件来得到调用目标函数的所有函数,即可以预先对各个函数的调用进行分析,得到一份脚本函数文件,并维护该文件,若需要查询函数被调用的影响范围,通过该脚本函数文件就可以得到,查询更加的快捷,且查询的精确度更高,从而解决相关技术在游戏测试中,无法确定函数调用的影响范围的技术问题。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1是根据本发明实施例的函数调用的查询方法的示意图;
图2是根据本发明实施例的一种生成汇编文件的示意图;
图3是根据本发明实施例的一种编译代码的示意图;
图4是根据本发明实施例的一种对汇编文件进行分块的结果示意图;
图5是根据本发明实施例的一种拆分多个汇编代码块的示意图;
图6是根据本发明实施例的一种遍历汇编代码块的结果示意图;
图7是根据本发明实施例的一种函数调用的查询装置示意图;
图8是根据本发明实施例的一种可选的电子设备的示意图。
具体实施方式
为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
本发明可以应用于各种游戏测试环境中,对于具体地游戏不做限定,在游戏测试或者游戏开发过程中,可以对函数调用的影响范围进行确定。
实施例一
根据本发明实施例,提供了一种函数调用的查询方法实施例,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
图1是根据本发明实施例的函数调用的查询方法的示意图,如图1所示,该方法包括如下步骤:
步骤S102,获取待查询字段,其中,待查询字段对应有目标函数;
步骤S104,获取预先解析的脚本函数文件,其中,脚本函数文件中包括预先对汇编文件进行代码块分解之后,解析得到的每个文件里调用到其它文件的函数列表;
步骤S106,根据待查询字段,从脚本函数文件中查询出调用目标函数的所有函数。
通过上述步骤,可以获取待查询字段,其中,待查询字段对应有目标函数,获取预先解析的脚本函数文件,其中,脚本函数文件中包括预先对汇编文件进行代码块分解之后,解析得到的每个文件里调用到其它文件的函数列表,根据待查询字段,从脚本函数文件中查询出调用目标函数的所有函数。在该实施例中,可以利用预先存储的脚本函数文件(在存储脚本函数的数据库中)来得到调用目标函数的所有函数,即可以预先对各个函数的调用进行分析,得到一份脚本函数文件,并维护该文件,若需要查询函数被调用的影响范围,通过该脚本函数文件就可以得到,查询更加的快捷,且查询的精确度更高,从而解决相关技术在游戏测试中,无法确定函数调用的影响范围的技术问题。
下面对上述各个步骤进行详细说明。
步骤S102,获取待查询字段,其中,待查询字段对应有目标函数。
该待查询字段可以是用户输入至查询框的字段,可选的,该待查询中字段中可以包括需要查询影响范围的目标函数,当然,待查询字段还包括:与目标函数对应的文件名和与目标函数对应的函数名。待查询字段包括两个部分,分别是文件名(可不填)和函数名,若文件名不填,查询的结果就会包括所有调用目标函数名的调用列表,如果填了文件名,查询条件就会多一个文件名,查询的结果就会包括所有调用目标文件的目标函数的调用列表。
该本地函数名可以与目标函数相同,而本地文件名可以是指包含该目标函数的文件的名称,在本发明实施例中并不限定具体地目标函数、本地文件名。
步骤S104,获取预先解析的脚本函数文件,其中,脚本函数文件中包括预先对汇编文件进行代码块分解之后,解析得到的每个文件里调用到其它文件的函数列表。
本发明实施例中,会事先解析并维护好一个脚本函数文件,其数据来源于汇编文件(如.d文件),该汇编文件可以是通过源文件(如.c文件)编译生成,汇编文件可以为.d文件,通过对汇编文件中的文件和函数进行解析,确定出每个文件中调用到其它文件的函数内容,通过函数列表的形式展示给用户,让用户能更快速、清晰的了解到待查询的函数,同时也可以查询出调用目标函数的各个函数,在函数被修改时,可以查询出其影响的范围。
可选的,脚本函数文件的函数内容是通过汇编文件得到的,该汇编文件可以理解为对源文件进行初步整理,整理后会得到多个代码块,代码块可以为下述之一:INHERITS、PROGRAM、FUNCTIONS、VARIABLES、STRINGS,其中,INHERITS是继承函数的信息,PROGRAM是整段代码的二进制表达,FUNCTIONS是函数列表,VARIABLES是参数列表(包括继承来的参数和本文件内定义的参数),STRINGS是字符串列表。
图2是根据本发明实施例的一种生成汇编文件的示意图,如图2所示,在左边为源文件(即.c文件),在右边为汇编文件(如.d文件),引擎编译后,生成的部分.d文件中INHERITS是继承函数的信息,PROGRAM是整段代码的二进制表达,FUNCTIONS是函数列表,VARIABLES是参数列表(包括继承来的参数和本文件内定义的参数),STRINGS是字符串列表。
对于图2中的FUNCTIONS,其中,FUNCTIONS包括了0:inner_function,1:test_func,2:base_func,3:test_func2,4:create,5:#global_init#。其中,inner_func属于自己文件内的函数调用,因此,会被解析成call inner_func,操作码是2b,后面的两个字节是该函数在函数表中的偏移,最后一个字节是本函数压栈的参数个数,而base_func是属于基类函数,但是也会被解析成本地函数(因为继承本身就是相当于获得基类的所有函数);而test_func是显示的基类函数调用,就解析成call_inherited。
对汇编文件进行代码编译,可以整理出相应的调用函数,图3是根据本发明实施例的一种编译代码的示意图,对应于图2中的左侧的代码内容,该图3中,“outer_file”->outer_func是一个外部函数调用,因此就解析成call_other,下一个参数就表示参数的个数,例如这里call_other 5就表示前面压栈一共push了5个参数入栈,从这5个参数里,就可以得到外部函数的文件名就是string 5,函数名是string 6,再根据STRINGS里的字符串列表,我们就可以得到对应外部函数的文件名和函数名。
在本发明一实施方式中,获取预先解析的脚本函数文件包括:按照预设结构将汇编文件的内容分块,得到字符块和汇编解析块;对汇编解析块,按照文件函数进行分块,得到多个汇编函数块;对每个汇编函数块进行遍历,以得到脚本函数文件。即对于上述的多个代码块,重点关注的是字符块和汇编解析块,该字符块可以为STRINGS所示出模块,而汇编解析块可以为FUNCTIONS所示出的模块,图4是根据本发明实施例的一种对汇编文件进行分块的结果示意图,如图4中所示,在对图2中的汇编文件进行分块后,得到如图4中左侧所示出的字符块和右侧的汇编解析块,其中,字符块对应的是STRINGS(即字符串列表),而汇编解析块对应的是FUNCTION(即函数列表);而文件函数可以为FUNCTION,对每一个文件函数FUNCTION,都可以进行分块,可以得到多个与FUNCTION对应的汇编函数块,例如,在图4中,包括多个汇编函数块(Function inner_func和Function test_func两个),每一个汇编文件中,每一个函数只能有一个。
在本发明另一实施方式中,对每个汇编函数块进行遍历,以得到脚本函数文件包括:对每一个汇编函数块,按照文件函数中的预设函数进行分块,得到多个汇编代码块;对每一个汇编代码块进行遍历,得到遍历结果;依据预设函数指示的参数,从遍历结果中提取与参数对应的参数个数对应的参数,得到提取结果;以预设函数和提取结果,建立与每个预设函数对应的参数列表,以得到脚本函数文件。
可选的,预设函数可以为预先设置的,对于每一个汇编解析块而言,预设函数是不同的,例如,对于FUNCTIONS,可以选择预设函数为call_other;而对于引擎函数,可以选择simul_efun;对于服务端客户端协议,可以选择remote_process_call;对于内部函数调用,可以选择call。在本发明实施例中,以图4中示出的FUNCTIONS进行说明,则确定出选择的预设函数为call_other,通过对文件进行解析,可以确定出每个call_other就是一个函数调用,而在call_other前一定会有push的操作,根据push的对象,我们就可以得到外部调用的文件名和函数名,再或者在push前会有一些操作符,而push的参数是操作符运算的结果,这种也可以采用递归的办法根据操作符得到最终push的参数。因此根据这个分析结果,可以使用一个解析脚本根据不同的情况将每个call_other解析出预设数量(依据call_other后指示的参数确定,如4个)有用的信息,包括本文件名,本函数名,调用的文件名,和调用的函数名(例如A->B()中调用到了C->D()),进而得到本文件内的所有call_other调用关系,进而最终得到整个代码仓库内的所有call_other调用。而这个解析脚本的原理也就是将生成的dump文件根据call_other拆成很多个小块,再根据每一个小块逐一分析每个call_other的文件名和调用函数名。
所有的call_other都存在于汇编解析块里,汇编代码块又会根据每一个Function来分区,每一个Function里再有每一个call_other函数调用。于是首先就可以根据Function将汇编解析块分块,再来根据Function里的call_other来拆分。于是最终,整个汇编解析块会被分成以Function为单元的小块,每个Function里又会有一个一个的call_other小块,每一个call_other小块就是一个函数调用,再来根据每一个函数调用的特殊情况来具体分析每一个小块的内容。图5是根据本发明实施例的一种拆分多个汇编代码块的示意图,如图5所示,最左侧对应于汇编函数块FUNCTION,包括两个汇编函数块,分别为Function inner_func和Function test_func两个,然后将汇编函数块依据文件函数Function进行分块,得到如图5中的中间的两个汇编函数块,然后对其中一个汇编函数块Function test_func按照预设函数call_ohther进行分块,得到如图5中最右侧所示的两个汇编代码块。
在本发明实施例中,预设函数后边后定义一个参数,例如,call_other 4,该参数为4;参数可以是一个数字,通过该数字可以确定出需要提取的参数数量。通过上述分析可知,可以使用一个解析脚本根据不同的情况将每个call_other解析出预设数量(依据call_other后指示的参数确定,如4个)有用的信息,包括本文件名,本函数名,调用的文件名,和调用的函数名,进而得到本文件内的所有call_other调用关系,进而最终得到整个代码仓库内的所有call_other调用。即可以通过预设函数后续携带的参数,确定出需要提取的数量,后续在遍历每一个汇编代码块时,可以取出相应数量的函数。通过该预设函数指示的参数,提取相应数量的函数,进而获取参数列表。
在得到如图5所示的各个汇编代码块后,就可以对每个汇编代码块进行遍历了,依据上述对汇编代码块的分析可知,Function示出的汇编函数块中可能会有call_other,也可能没有,在遍历时,对存在call_other的function块根据call_other向上遍历。在本发明实施例中,对每一个汇编代码块进行遍历,得到遍历结果包括:由预设函数对每一个汇编代码块倒序遍历,其中,在遍历时对多个预设字符串遍历,多个预设字符串包括下述至少之一:push、string、运算符;根据遍历顺序,依次排列遍历每个参数,以得到遍历结果。
在遍历时,可以以预设函数为起点,向上进行遍历,如图5所示,可以以call_other为起点,向上遍历。在遍历时,分别针对push、string、运算符等进行遍历,其中,push操作可以指示存储push的n个参数列表,而string操作可以指示存储string的参数,运算符可以包括“+、-,to_int”,在遍历运算符时,可以查询每一个运算符出现的位置。
图6是根据本发明实施例的一种遍历汇编代码块的结果示意图,如图6所示,在对图5最右侧下方的汇编代码块进行遍历后,可以得到两个push操作的函数,local 1和local0,同时还可以遍历得到string操作的函数,string“outer_func1”和string“outer_file1”。这样就可以将这四个函数补入到该汇编代码块call_other所示的参数列表中了。由于遍历是倒序遍历的,所以我们要找的C和D参数也是应该在结果的参数列表里进行倒序查找。于是:C:string“outer_file1”;D:string“outer_func1”,进而再对目标的C和D进行解析,就得到了与目标函数对应的C和D参数。
上述内容中指示了对汇编解析块进行分块,并进行相应遍历的操作,而对于字符块的处理,在本发明一实施方式中,对每个汇编函数块进行遍历,以得到脚本函数文件,还包括:获取每个字符块中数字与字符串参数之间的字符映射关系;在遍历汇编解析块的字符串函数后,得到与字符串函数对应的至少一个数字;依据字符映射关系和至少一个数字,确定与字符串函数所对应的各个字符串参数;将字符串参数和字符串函数编入参数列表。
其中,字符映射关系,可以是如图4左侧示出的内容,例如,数字0对应字符串参数lpc_test.c;数字1对应字符串参数inc/globals.h;数字2对应字符串参数inc/command.h;数字3对应字符串参数2;数字4对应字符串参数hello;数字5对应字符串参数outer_file;数字6对应字符串参数outer_func;数字7对应字符串参数test_str。通过这个字符映射关系,在得到字符串函数string对应的数字时,就可以查询出对应的字符串参数。然后就可以将string对应的字符串参数也编入参数列表中。
在本发明一可选的实施例,在得到脚本函数文件之后,还包括:根据代码提交频率和函数使用量,确定代码更新时间段;依据代码更新时间段,对脚本函数文件进行更新。对于更新时间段,可以根据每天的情况而定,例如周一周二程序提交代码频率特别高,就每天定时更新2-3次或者更多,而其他时间就固定凌晨1点钟来全代码仓库更新,这个频率可以自行确定。
在本发明另一可选地实施例中,依据代码更新时间段,对脚本函数文件进行更新包括:依据代码更新时间段,获取修改的文件列表;提取修改的文件列表中被调用的函数;依据提取出的函数,更新脚本函数文件。即在更新脚本函数文件,每次不更新整个代码仓库里的函数调用情况,而只更新修改的参数列表里的函数调用情况,这样就大大降低了每次更新的成本和时间。
本发明在使用时,可以先整理一遍所有服务端的脚本代码,主动屏蔽了一些用户根本就不需要查询的文件,例如(奖励表导表文件、战斗数值表导表文件、技能导表文件、模板任务导表文件等)这些目录文件不管是更新还是新增时,都不会去处理,这样做也大量减少了目标处理文件的个数,进而减轻了数据库查询和存储的负担。
步骤S106,根据待查询字段,从脚本函数文件中查询出调用目标函数的所有函数。
在本发明一可选的示例中,在从脚本函数文件中查询出调用目标函数的所有函数时,还包括:查询调用目标函数的每个函数所对应的调用文件名和调用函数名。
即可以通过上述实施例,查询得到调用的文件名和函数,从而确定出每一个调用本地函数的函数,让用户能快速、清晰的了解到目标函数被调用的位置和对应的函数,为后续确定目标函数被修改的影响范围做铺垫。
上述实施例中,可以查询具体文件的函数调用情况,帮助游戏测试人员根据修改的接口来定位影响范围。例如程序员(开发者)修改到了一个底层函数,或者修改到了一个引擎函数,均可以使用该工具来查询影响范围。例如:策划需求:游戏中去除易信绑定的相关设定;程序修改:直接去掉了易信大使NPC的解绑功能,并且修改了易信状态;最终:测试人员回归了易信相关的功能,并放出;放出后:发现藏宝阁上架处仍旧有使用易信判断的接口,影响到了玩家的上架。故紧急更新,如果使用了该工具,便可以发现:玩家自杀和藏宝阁处均使用了该接口,从而提示测试人员注意这两个地方是否有收到影响并进行相应修改。
通过上述实施例,可以在程序使用了一个测试人员不熟悉的接口时,而测试人员又不确保这个接口是否是安全的,于是使用这个工具,便可以查询到其他还有哪一个功能使用到了这个接口,根据对应的功能来权衡对应接口的安全性。
另外,通过本发明上述实施例,可以监控一些接口列表的修改,例如:有一个接口列表,这些函数里的所有修改都会影响到跨服,于是当这个函数里有任何修改时,都可以及时通知出来,告诉用户需要同时注意跨服的情况。
在上述实施例中,还可以监控一些客户端服务端协议,当客户端对某条协议有修改时,服务端可以查询使用这条协议的所有地方,以便覆盖到所有影响到的范围。再或者服务端的某一个函数有修改,而该函数内有对客户端协议的调用,就需要人工判断函数的修改是否会影响到客户端协议,进而回归PC端和互通版。
在本发明实施中,可以尽可能准确的找出每一个文件里的所有函数调用,服务器的脚本代码是时刻在更新的,如果每天都会有很多的代码提交,使用本发明内容,函数调用查询的结果就可以准确查询到,根据实际的更新情况,自行查询到修改的内容的影响范围,从而维护好整个代码仓库里的所有函数调用,并且在搜索时能够快速的响应。
下面结合另一种可选的实施例对本发明进行说明。
实施例二
下述实施例中涉及到函数调用的查询装置,该装置中会包括多个单元,每一个单元可以对应于上述实施例一中的各个步骤。
图7是根据本发明实施例的一种函数调用的查询装置示意图,如图7所示,该查询装置可以包括:第一获取单元71,第二获取单元73,查询单元75,其中,
第一获取单元71,用于获取待查询字段,其中,待查询字段对应有目标函数;
第二获取单元73,用于获取预先解析的脚本函数文件,其中,脚本函数文件中包括预先对汇编文件进行代码块分解之后,解析得到的每个文件里调用到其它文件的函数列表;
查询单元75,用于根据待查询字段,从脚本函数文件中查询出调用目标函数的所有函数。
上述函数调用的查询装置,可以通过第一获取单元71获取待查询字段,其中,待查询字段对应有目标函数,通过第二获取单元73获取预先解析的脚本函数文件,其中,脚本函数文件中包括预先对汇编文件进行代码块分解之后,解析得到的每个文件里调用到其它文件的函数列表,通过查询单元75根据待查询字段,从脚本函数文件中查询出调用目标函数的所有函数。在该实施例中,可以利用预先存储的脚本函数文件来得到调用目标函数的所有函数,即可以预先对各个函数的调用进行分析,得到一份脚本函数文件,并维护该文件,若需要查询函数被调用的影响范围,通过该脚本函数文件就可以得到,查询更加的快捷,且查询的精确度更高,从而解决相关技术在游戏测试中,无法确定函数调用的影响范围的技术问题。
可选的,第二获取单元包括:第一分块模块,用于按照预设结构将汇编文件的内容分块,得到字符块和汇编解析块;第二分块模块,用于对汇编解析块,按照文件函数进行分块,得到多个汇编函数块;遍历模块,用于对每个汇编函数块进行遍历,以得到脚本函数文件。
对于上述的遍历模块,该遍历模块包括:第一分块子模块,用于对每一个汇编函数块,按照文件函数中的预设函数进行分块,得到多个汇编代码块;第一遍历子模块,用于对每一个汇编代码块进行遍历,得到遍历结果;第一提取子模块,用于依据预设函数指示的参数,从遍历结果中提取与参数对应的参数个数对应的参数,得到提取结果;建立子模块,用于以预设函数和提取结果,建立与每个预设函数对应的参数列表,以得到脚本函数文件。
在本发明实施例中,第一遍历子模块包括:倒序遍历子模块,用于由预设函数对每一个汇编代码块倒序遍历,其中,在遍历时对多个预设字符串遍历,多个预设字符串包括下述至少之一:push、string、运算符;根据遍历顺序,依次排列遍历每个参数,以得到遍历结果。
另一种可选的,函数调用的查询装置还包括:第一确定模块,用于在得到脚本函数文件之后,根据代码提交频率和函数使用量,确定代码更新时间段;更新模块,用于依据代码更新时间段,对脚本函数文件进行更新。
在本发明一实施例中,更新模块包括:第一获取子模块,用于依据代码更新时间段,获取修改的文件列表;第二提取子模块,用于提取修改的文件列表中被调用的函数;更新子模块,用于依据提取出的函数,更新脚本函数文件。
另一种可选的,遍历模块还包括:第二获取子模块,用于获取每个字符块中数字与字符串参数之间的字符映射关系;确定子模块,用于在遍历汇编解析块的字符串函数后,得到与字符串函数对应的至少一个数字;第二确定子模块,用于依据字符映射关系和至少一个数字,确定与字符串函数所对应的各个字符串参数;编入子模块,用于将字符串参数和字符串函数编入参数列表。
可选的,待查询字段还包括:与目标函数对应的文件名和与目标函数对应的函数名。
在本发明中,函数调用的查询装置还包括:查询模块,用于在从脚本函数文件中查询出调用目标函数的所有函数时,查询调用目标函数的每个函数所对应的调用文件名和调用函数名。
上述的函数调用的查询装置还可以包括处理器和存储器,上述第一获取单元71,第二获取单元73,查询单元75等均作为程序单元存储在存储器中,由处理器执行存储在存储器中的上述程序单元来实现相应的功能。
上述处理器中包含内核,由内核去存储器中调取相应的程序单元。内核可以设置一个或以上,通过调整内核参数来从脚本函数文件中查询出调用目标函数的所有函数。
上述存储器可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM),存储器包括至少一个存储芯片。
根据本发明实施例的另一方面,还提供了一种电子设备,图8是根据本发明实施例的一种可选的电子设备的示意图,如图8所示,该电子设备810包括存储器820以及处理器830,其中,存储器,用于存储处理器的可执行指令,而处理器配置为经由执行可执行指令来执行如下步骤的程序:获取待查询字段,其中,待查询字段对应有目标函数;获取预先解析的脚本函数文件,其中,脚本函数文件中包括预先对汇编文件进行代码块分解之后,解析得到的每个文件里调用到其它文件的函数列表;根据待查询字段,从脚本函数文件中查询出调用目标函数的所有函数。
根据本发明实施例的另一方面,还提供了一种存储介质,存储介质包括存储的程序,其中,在程序运行时控制存储介质所在设备执行上述任意一项的函数调用的查询方法。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
在本申请所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,可以为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (12)
1.一种函数调用的查询方法,其特征在于,包括:
获取待查询字段,其中,所述待查询字段对应有目标函数;
获取预先解析的脚本函数文件,其中,所述脚本函数文件中包括预先对汇编文件进行代码块分解之后,解析得到的每个文件里调用到其它文件的函数列表;
根据所述待查询字段,从所述脚本函数文件中查询出调用所述目标函数的所有函数。
2.根据权利要求1所述的查询方法,其特征在于,获取预先解析的脚本函数文件包括:
按照预设结构将所述汇编文件的内容分块,得到字符块和汇编解析块;
对所述汇编解析块,按照文件函数进行分块,得到多个汇编函数块;
对每个所述汇编函数块进行遍历,以得到所述脚本函数文件。
3.根据权利要求2所述的查询方法,其特征在于,对每个所述汇编函数块进行遍历,以得到所述脚本函数文件包括:
对每一个所述汇编函数块,按照所述文件函数中的预设函数进行分块,得到多个汇编代码块;
对每一个所述汇编代码块进行遍历,得到遍历结果;
依据所述预设函数指示的参数,从遍历结果中提取与所述参数对应的参数个数对应的参数,得到提取结果;
以所述预设函数和提取结果,建立与每个所述预设函数对应的参数列表,以得到所述脚本函数文件。
4.根据权利要求3所述的查询方法,其特征在于,对每一个所述汇编代码块进行遍历,得到遍历结果包括:
由所述预设函数对每一个所述汇编代码块倒序遍历,其中,在遍历时对多个预设字符串遍历,所述多个预设字符串包括下述至少之一:push、string、运算符;
根据遍历顺序,依次排列遍历每个参数,以得到所述遍历结果。
5.根据权利要求3所述的查询方法,其特征在于,在得到所述脚本函数文件之后,还包括:
根据代码提交频率和函数使用量,确定代码更新时间段;
依据所述代码更新时间段,对所述脚本函数文件进行更新。
6.根据权利要求5所述的查询方法,其特征在于,依据所述代码更新时间段,对所述脚本函数文件进行更新包括:
依据所述代码更新时间段,获取修改的文件列表;
提取所述修改的文件列表中被调用的函数;
依据提取出的函数,更新所述脚本函数文件。
7.根据权利要求3所述的查询方法,其特征在于,对每个所述汇编函数块进行遍历,以得到所述脚本函数文件,还包括:
获取每个所述字符块中数字与字符串参数之间的字符映射关系;
在遍历所述汇编解析块的字符串函数后,得到与所述字符串函数对应的至少一个数字;
依据所述字符映射关系和所述至少一个数字,确定与所述字符串函数所对应的各个字符串参数;
将所述字符串参数和所述字符串函数编入所述参数列表。
8.根据权利要求1所述的查询方法,其特征在于,所述待查询字段还包括:与所述目标函数对应的文件名和与所述目标函数对应的函数名。
9.根据权利要求1所述的查询方法,其特征在于,在从所述脚本函数文件中查询出调用所述目标函数的所有函数时,还包括:查询调用所述目标函数的每个函数所对应的调用文件名和调用函数名。
10.一种函数调用的查询装置,其特征在于,包括:
第一获取单元,用于获取待查询字段,其中,所述待查询字段对应有目标函数;
第二获取单元,用于获取预先解析的脚本函数文件,其中,所述脚本函数文件中包括预先对汇编文件进行代码块分解之后,解析得到的每个文件里调用到其它文件的函数列表;
查询单元,用于根据所述待查询字段,从所述脚本函数文件中查询出调用所述目标函数的所有函数。
11.一种电子设备,其特征在于,包括:
处理器;以及
存储器,用于存储所述处理器的可执行指令;
其中,所述处理器配置为经由执行所述可执行指令来执行权利要求1至9中任意一项所述的函数调用的查询方法。
12.一种存储介质,其特征在于,所述存储介质包括存储的程序,其中,在所述程序运行时控制所述存储介质所在设备执行权利要求1至9中任意一项所述的函数调用的查询方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811434603.7A CN109542942B (zh) | 2018-11-28 | 2018-11-28 | 函数调用的查询方法及装置、电子设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811434603.7A CN109542942B (zh) | 2018-11-28 | 2018-11-28 | 函数调用的查询方法及装置、电子设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109542942A true CN109542942A (zh) | 2019-03-29 |
CN109542942B CN109542942B (zh) | 2021-09-24 |
Family
ID=65850870
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811434603.7A Active CN109542942B (zh) | 2018-11-28 | 2018-11-28 | 函数调用的查询方法及装置、电子设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109542942B (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110134373A (zh) * | 2019-04-04 | 2019-08-16 | 口碑(上海)信息技术有限公司 | 一种函数信息获取的方法以及装置 |
CN112148392A (zh) * | 2019-06-27 | 2020-12-29 | 腾讯科技(深圳)有限公司 | 一种函数调用链获取方法、装置及存储介质 |
CN112182404A (zh) * | 2020-10-23 | 2021-01-05 | 网易(杭州)网络有限公司 | 问题查询方法、装置、设备及存储介质 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7392514B2 (en) * | 2003-06-26 | 2008-06-24 | Microsoft Corporation | Data flow chasing |
CN102012833A (zh) * | 2010-11-09 | 2011-04-13 | 北京神舟航天软件技术有限公司 | 基于编译过程中间结果的静态堆栈检测方法 |
CN103744678A (zh) * | 2014-01-14 | 2014-04-23 | 清华大学 | 基于寄存器传输语言确定静态函数调用关系的方法 |
CN106227573A (zh) * | 2016-07-11 | 2016-12-14 | 北京信息科技大学 | 基于控制流图的函数调用路径提取方法 |
CN106909510A (zh) * | 2017-03-02 | 2017-06-30 | 腾讯科技(深圳)有限公司 | 一种获取测试用例的方法以及服务器 |
-
2018
- 2018-11-28 CN CN201811434603.7A patent/CN109542942B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7392514B2 (en) * | 2003-06-26 | 2008-06-24 | Microsoft Corporation | Data flow chasing |
CN102012833A (zh) * | 2010-11-09 | 2011-04-13 | 北京神舟航天软件技术有限公司 | 基于编译过程中间结果的静态堆栈检测方法 |
CN103744678A (zh) * | 2014-01-14 | 2014-04-23 | 清华大学 | 基于寄存器传输语言确定静态函数调用关系的方法 |
CN106227573A (zh) * | 2016-07-11 | 2016-12-14 | 北京信息科技大学 | 基于控制流图的函数调用路径提取方法 |
CN106909510A (zh) * | 2017-03-02 | 2017-06-30 | 腾讯科技(深圳)有限公司 | 一种获取测试用例的方法以及服务器 |
Non-Patent Citations (1)
Title |
---|
XXXXXXXX1X2XXXXXXX: "分析函数调用关系图(call graph)的几种方法", 《博客园》 * |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110134373A (zh) * | 2019-04-04 | 2019-08-16 | 口碑(上海)信息技术有限公司 | 一种函数信息获取的方法以及装置 |
CN112148392A (zh) * | 2019-06-27 | 2020-12-29 | 腾讯科技(深圳)有限公司 | 一种函数调用链获取方法、装置及存储介质 |
CN112182404A (zh) * | 2020-10-23 | 2021-01-05 | 网易(杭州)网络有限公司 | 问题查询方法、装置、设备及存储介质 |
CN112182404B (zh) * | 2020-10-23 | 2023-08-11 | 网易(杭州)网络有限公司 | 问题查询方法、装置、设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN109542942B (zh) | 2021-09-24 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104838377B (zh) | 利用映射缩减集成事件处理 | |
CN108388445B (zh) | 一种基于“平台+应用”模式的持续集成方法 | |
CN105830049A (zh) | 自动化实验平台 | |
US11667033B2 (en) | Systems and methods for robotic process automation | |
CN109542942A (zh) | 函数调用的查询方法及装置、电子设备 | |
CN103582867A (zh) | 用于指定基于云的部署的配置的高级语言 | |
US20080288266A1 (en) | System and method for service offering for feedback controller design and implementation for performance management in information technology systems | |
Altmann et al. | Using mobile agents in real world: A survey and evaluation of agent platforms | |
CN112036577B (zh) | 基于数据形式的应用机器学习的方法、装置和电子设备 | |
CN103842961A (zh) | 用于创建个人化和定制的移动设备的系统 | |
CN110187910A (zh) | 一种热更新方法、装置、设备及计算机可读存储介质 | |
CN109298900A (zh) | 一种应用拆分以及按需加载方法、装置 | |
CN109522030B (zh) | 基于一键生成多个游戏渠道包的平台出包方法 | |
US11275567B1 (en) | Making communication interfaces pluggable by using mechanisms comprising of exchange/broker for communication interfaces | |
CN115794214B (zh) | 应用模块元数据管理方法、设备、存储介质及装置 | |
Uez et al. | Environments and organizations in multi-agent systems: From modelling to code | |
JP2003036278A (ja) | Fmeaシステム | |
CN109753767B (zh) | 基于区块链的软件分发及更新方法和装置、服务器、客户端 | |
CN116346660A (zh) | 基于依赖替换服务的数据处理方法、装置、设备及介质 | |
Burdusel et al. | Towards automatic generation of evolution rules for model-driven optimisation | |
Michalik et al. | Towards a solution for change impact analysis of software product line products | |
CN113703808B (zh) | 组件化的灰度发布方法、装置、设备及存储介质 | |
Qin et al. | A novel domain oriented approach for scientific grid workflow composition | |
Kimovski et al. | Distributed environment for efficient virtual machine image management in federated cloud architectures | |
CN109542496A (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 |