CN106649084A - 函数调用信息的获取方法及装置、测试设备 - Google Patents
函数调用信息的获取方法及装置、测试设备 Download PDFInfo
- Publication number
- CN106649084A CN106649084A CN201610825962.XA CN201610825962A CN106649084A CN 106649084 A CN106649084 A CN 106649084A CN 201610825962 A CN201610825962 A CN 201610825962A CN 106649084 A CN106649084 A CN 106649084A
- Authority
- CN
- China
- Prior art keywords
- function
- managed
- hook
- depositing
- pointer
- 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 91
- 238000012360 testing method Methods 0.000 title claims abstract description 42
- 238000012544 monitoring process Methods 0.000 claims abstract description 26
- 230000006870 function Effects 0.000 claims description 813
- 238000000151 deposition Methods 0.000 claims description 140
- 230000008569 process Effects 0.000 abstract description 18
- 238000005516 engineering process Methods 0.000 abstract description 10
- 230000006399 behavior Effects 0.000 description 9
- 241000208340 Araliaceae Species 0.000 description 4
- 235000005035 Panax pseudoginseng ssp. pseudoginseng Nutrition 0.000 description 4
- 235000003140 Panax quinquefolius Nutrition 0.000 description 4
- 238000010586 diagram Methods 0.000 description 4
- 235000008434 ginseng Nutrition 0.000 description 4
- 230000004048 modification Effects 0.000 description 4
- 238000012986 modification Methods 0.000 description 4
- 230000008859 change Effects 0.000 description 3
- 238000004891 communication Methods 0.000 description 3
- 238000010168 coupling process Methods 0.000 description 3
- 238000005859 coupling reaction Methods 0.000 description 3
- 230000009471 action Effects 0.000 description 2
- 230000008878 coupling Effects 0.000 description 2
- 101100080278 Caenorhabditis elegans ncr-2 gene Proteins 0.000 description 1
- 235000000332 black box Nutrition 0.000 description 1
- 210000004556 brain Anatomy 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 230000005611 electricity Effects 0.000 description 1
- 101150107867 npc-2 gene Proteins 0.000 description 1
- 238000012545 processing Methods 0.000 description 1
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/3604—Software analysis for verifying properties of programs
- G06F11/3612—Software analysis for verifying properties of programs by runtime 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
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)
- Software Systems (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种函数调用信息的获取方法及装置、测试设备。其中,该方法包括:在运行待测试的程序的过程中,对程序中待调用的托管函数进行编译,得到非托管函数,对非托管函数进行钩子hook操作,得到第一函数调用信息,根据第一函数调用信息和托管函数的函数名生成第二函数调用信息,输出得到的第二函数调用信息,其中,非托管函数被允许直接运行在CPU上,hook操作用于监控非托管函数在运行时的参数和返回值,第一函数调用信息至少包括:函数进入时间、函数退出时间,函数返回值,第二函数调用信息中包括具有对应关系的托管函数的函数名、函数进入时间、函数退出时间,函数返回值。本发明解决了相关技术偶现的crash的技术问题。
Description
技术领域
本发明涉及通信领域,具体而言,涉及一种函数调用信息的获取方法及装置、测试设备。
背景技术
相关技术中提供了一种可以记录托管代码函数的调用情况的技术方案,利用Mono提供的Profiler(可以理解为是一种分析工具)功能,该功能可以利用Mono提供的mono_profiler_install_enter_leave接口注册两个函数,这两个注册过的回调函数分别会在托管代码里的函数进入和退出的时候被调用,Mono会给这两个回调函数提供一个自定义的数据结构,用来存储可能需要的数据,还会提供一个参数,通过该参数可以获取本次托管代码调用了哪个函数。接口注册好了以后再用Mono提供的mono_profiler_set_events接口设置MONO_PROFILER_ENTER_LEAVE事件,至此,托管代码中运行的所有函数只要一被执行就会调用注册过的两个回调函数。
在实际项目中,发明人发现使用上述技术方案去记录托管代码函数的调用情况,会发生偶现的crash崩溃现象,直接导致了现有的技术方案不能应用在一些复杂项目中。
针对上述的问题,目前尚未提出有效的解决方案。
发明内容
本发明实施例提供了一种函数调用信息的获取方法及装置、测试设备,以至少解决相关技术中采用mono提供的分析工具获取托管函数的调用情况的技术方案,偶现crash现象的技术问题。
根据本发明实施例的一个方面,提供了一种函数调用信息的获取方法,包括:
在运行待测试的程序的过程中,对所述程序中待调用的托管函数进行编译,得到非托管函数,其中,所述非托管函数被允许直接运行在中央处理器CPU上;对所述非托管函数进行钩子hook操作,得到第一函数调用信息,其中,所述hook操作用于监控所述非托管函数在运行时的参数和返回值,所述第一函数调用信息至少包括:函数进入时间、函数退出时间,函数返回值;根据所述第一函数调用信息和所述托管函数的函数名生成第二函数调用信息,其中,所述第二函数调用信息中包括具有对应关系的所述托管函数的函数名、函数进入时间、函数退出时间,函数返回值;输出所述第二函数调用信息。
根据本发明的另一个方面,还提供了一种函数调用信息的获取装置,包括:
编译单元,用于在运行待测试的程序的过程中,对所述程序中待调用的托管函数进行编译;第一确定单元,用于对所述托管函数编译后得到非托管函数,其中,所述非托管函数被允许直接运行在中央处理器CPU上;第二确定单元,用于对所述非托管函数进行钩子hook操作,得到第一函数调用信息,其中,所述hook操作用于监控所述非托管函数在运行时的参数和返回值,所述第一函数调用信息至少包括:函数进入时间、函数退出时间,函数返回值;生成单元,用于根据所述第一函数调用信息和所述托管函数的函数名生成第二函数调用信息,其中,所述第二函数调用信息中包括具有对应关系的所述托管函数的函数名、函数进入时间、函数退出时间,函数返回值;输出单元,用于输出所述第二函数调用信息。
根据本发明实施例的另一方面,还提供了一种测试设备,包括:处理器;用于存储处理器可执行指令的存储器;其中,所述处理器,用于在运行待测试的程序的过程中,对所述程序中待调用的托管函数进行编译,得到非托管函数,对所述非托管函数进行钩子hook操作,得到第一函数调用信息,根据所述第一函数调用信息和所述托管函数的函数名生成第二函数调用信息,进而输出所述第二函数调用信息,其中,所述非托管函数被允许直接运行在中央处理器CPU上,所述hook操作用于监控所述非托管函数在运行时的参数和返回值,所述第一函数调用信息至少包括:函数进入时间、函数退出时间,函数返回值,所述第二函数调用信息中包括具有对应关系的所述托管函数的函数名、函数进入时间、函数退出时间,函数返回值。
在本发明实施例中,通过在运行待测试的程序的过程中,对程序中待调用的托管函数进行编译,得到非托管函数,对非托管函数进行钩子hook操作,得到第一函数调用信息,根据第一函数调用信息和托管函数的函数名生成第二函数调用信息,进而输出得到的第二函数调用信息,通过hook操作技术来得到第一函数调用信息,再得到根据第一函数调用信息和托管函数的函数名生成的第二函数调用信息,从而不会出现crash崩溃现象,进而解决了相关技术中采用mono提供的分析工具获取托管函数的调用情况的技术方案,偶现crash现象的技术问题。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1是根据本发明实施例的一种可选的函数调用信息的获取方法的应用环境示意图;
图2是根据本发明实施例的一种可选的函数调用信息的获取方法的流程图;
图3为根据本发明示例的编译函数的一种流程示意图;
图4为根据本发明示例的编译函数的另一种流程示意图;
图5为根据本发明示例的编译函数的又一种流程示意图;
图6为根据本发明示例的根据函数指针fp监听参数和返回值的流程图;
图7为根据本发明示例的监控函数调用信息的流程图;
图8为根据本发明实施例的一种可选的函数调用信息的获取装置的结构框图;
图9为根据本发明实施例的一种可选的函数调用信息的获取装置的另一结构框图;
图10为根据本发明实施例的一种可选的第一确定单元的结构框图;
图11为根据本发明实施例的一种可选的测试设备的结构框图;
图12为根据本发明实施例的一种可选的产品设备的主界面的示意图;
图13为根据本发明实施例的一种可选的产品设备的界面示意图;
图14为根据本发明实施例的另一种可选的产品设备的界面示意图。
具体实施方式
为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
为了更好的理解本发明实施例以下提供的技术方案,本发明实施例对实施例中出现的技术术语进行解释说明。
手游:手机游戏的简称,相对于PC游戏而言,在手机上运行的游戏。
Native代码:也叫非托管代码,指可以直接运行在某一架构的CPU上的指令序列,也可以指代那些可有直接编译成这类指令序列的高级语言,比如C/C++语言,但是像依赖虚拟机运行的java和依赖.Net库运行的就不能理解为是非托管代码。
.Net框架:由微软开发的一种采用虚拟机运行的变成平台,以通用语言运行库为基础,支持多种语言(C#,F#,VB.NET,C++,Python等)的开发。
托管代码:相对于Native代码的概念,指的是它在运行时代码是被托管到某一个框架上执行的,在本发明实施例中,托管代码可以理解为在.Net框架上运行的代码,本发明实施例中的托管框架至少包括Mono运行库。
Mono运行库:一个开源的,且可以运行在.Net程序的托管框架。
Hook技术:指可以监控某一个Native代码的函数运行时的参数和返回值的技术。
实施例1
根据本发明实施例,提供了一种函数调用情况的获取方法的实施例。作为一种可选的实施例,该函数调用情况的获取方法可以但不限于应用于如图1所示的应用环境中。测试设备102在终端100运行待测试的程序的过程中,对程序中待调用的托管函数进行编译,得到非托管函数,然后对非托管函数进行钩子hook操作,得到第一函数调用信息,根据第一函数调用信息和托管函数的函数名生成第二函数调用信息,进而输出得到的第二函数调用信息,其中,非托管函数被允许直接运行在中央处理器CPU上,hook操作用于监控非托管函数在运行时的参数和返回值,第一函数调用信息至少包括:函数进入时间、函数退出时间,函数返回值,第二函数调用信息中包括具有对应关系的托管函数的函数名、函数进入时间、函数退出时间,函数返回值。
在上述函数调用信息的获取方法中,通过在运行待测试的程序的过程中,对程序中待调用的托管函数进行编译,得到非托管函数,对非托管函数进行钩子hook操作,得到第一函数调用信息,根据第一函数调用信息和托管函数的函数名生成第二函数调用信息,进而输出得到的第二函数调用信息,通过hook操作技术来得到第一函数调用信息,再得到根据第一函数调用信息和托管函数的函数名生成的第二函数调用信息,从而不会出现crash崩溃现象,进而解决了相关技术中采用mono提供的分析工具获取托管函数的调用情况的技术方案,偶现crash现象的技术问题。
可选地,在本实施例中,上述终端可以包括但不限于以下至少之一:手机、平板电脑、笔记本电脑、台式PC机及其他用于播放视频的终端。
根据本发明实施例,提供了一种函数调用信息的获取方法,如图2所示,该方法包括以下步骤:
步骤S202,在运行待测试的程序的过程中,对程序中待调用的托管函数进行编译,得到非托管函数,其中,非托管函数被允许直接运行在中央处理器CPU上;
步骤S204,对非托管函数进行钩子hook操作,得到第一函数调用信息,其中,hook操作用于监控非托管函数在运行时的参数和返回值,第一函数调用信息至少包括:函数进入时间、函数退出时间,函数返回值;
步骤S206,根据第一函数调用信息和托管函数的函数名生成第二函数调用信息,其中,第二函数调用信息中包括具有对应关系的托管函数的函数名、函数进入时间、函数退出时间,函数返回值;
步骤S208,输出第二函数调用信息。
可选地,在本实施例中,上述函数调用情况的获取方法可以但不限于应用于测试设备中,也可以应用于终端中,本发明实施例对此不作任何限定。需要说明的是,本发明实施例对第一函数调用信息和第二函数调用信息不作具体限定,例如,第一函数调用信息还可以包括函数名和发生的行为,其中,发生的行为可以是进入函数,也可以是退出函数;第二函数调用信息中还可以包括发生的行为。
通过上述各个步骤的实现,在运行待测试的程序的过程中,对程序中待调用的托管函数进行编译,得到非托管函数,对非托管函数进行钩子hook操作,得到第一函数调用信息,根据第一函数调用信息和托管函数的函数名生成第二函数调用信息,进而输出得到的第二函数调用信息,通过hook操作技术来得到第一函数调用信息,再得到根据第一函数调用信息和托管函数的函数名生成的第二函数调用信息,从而不会出现crash崩溃现象,进而解决了相关技术中采用mono提供的分析工具获取托管函数的调用情况的技术方案,偶现crash现象的技术问题。
对于上述步骤S202可以有多种实现方式,在一个可选示例中,可以通过编译函数对上述托管函数进行编译得到非托管函数,本发明实施例中的编译函数可以是函数mono_compile_method,也可以是函数mono_jit_compile_method,还可以是mono_jit_compile_method_with_opt,只要是能够将托管函数编译成非托管函数,均在本发明实施例的保护范围内。
需要说明的是,由于步骤S202是在运行待测试的程序的过程中,对程序中待调用的托管函数进行编译进而得到非托管函数的,也就是说,本发明实施例的技术方案能够获取到运行时托管函数的调用信息,解决了相关技术中无法记录运行时托管函数的调用信息的问题。
可选地,在对非托管函数进行钩子hook操作之后,且在根据第一函数调用信息和托管函数的函数名生成第二函数调用信息之前,本发明实施例还提供了以下技术方案:根据预先建立的对应关系获取与非托管函数的第一函数指针对应的托管函数的第二函数指针;通过第二函数指针查找到托管函数的函数名。
也就是说,对非托管函数进行hook操作之后,本发明实施例能够获取到非托管函数的第一函数指针,进而根据预先建立的对应关系获取与第一函数指针对应的托管函数的第二函数指针,在这之前,可以建立非托管函数的第一函数指针与托管函数的第二函数指针之间的对应关系,其中,进行编译所需的参数包括托管函数的第二函数指针,进行编译之后所得到的返回值包括非托管函数的第一函数指针,具体地,第一函数指针和第二函数指针可以通过以下方式体现对应关系:第二函数指针作为上述编译函数的参数值,第一函数指针作为将第二函数指针作为参数值代入到上述编译函数中得到的返回值。
基于上述方案,在对非托管函数进行钩子hook操作之后,且在根据预先建立的对应关系获取与非托管函数的第一函数指针对应的托管函数的第二函数指针之前,本发明实施例还提供了以下技术方案:
通过执行hook操作得到的返回地址调用非托管函数的汇编代码;根据汇编代码获取非托管函数的第一函数指针,由于hook操作的核心思想在于替代部分代码的执行,本发明实施例的技术方案实际上可以理解为对非托管函数执行完hook操作之后,能够动态定位到被代替执行的代码处,上述返回地址可以用于指示被替代执行的代码,对于根据汇编代码得到上述第一函数指针的技术方案,本发明实施例可以通过预先定义的hook函数实现,也可以通过本领域技术人员有能力知晓的其他任何技术方案,本发明实施例对此不作限定。
可选地,本发明实施例还可以通过以下技术方案实现上述步骤S204的过程,例如,使用预先定义的hook函数对非托管函数进行hook操作,其中,预先定义的hook函数输入参数包括:需要被hook操作的参数,预先定义的hook函数输出参数包括:托管函数运行时的参数和返回值,预先定义的hook函数,用于监控非托管函数在运行时的参数和返回值,需要说明的是,上述第一函数指针可以理解为是需要被hook操作的参数。
在实际应用中,相关技术中的技术方案虽然能够记录托管函数的调用情况,但也只能调用mono主用调用托管函数而不能记录到所有托管代码函数,本发明实施例在执行对程序中待调用的托管函数进行编译时,通过对所有待调用的托管函数进行编译,进而能够获取到所有托管函数的调用信息。
以下结合一具体示例对上述函数调用信息的获取过程进行解释说明,但不用于限定本发明实施例。
本发明示例的主要思想在于通过编译函数对托管函数进行编译,得到非托管函数,进而对编译过的非托管函数进行hook操作拦截来实现监控运行时的参数和返回值的功能,即通过hook操作实现获取函数调用信息。
步骤S1,通过编译函数对托管函数进行编译,得到非托管函数,进而hook操作得到非托管函数的函数指针fp(相当于上述实施例的第一函数指针);
基于上述分析可知,编译函数可以是函数mono_compile_method,也可以是函数mono_jit_compile_method,还可以是函数mono_jit_compile_method_with_opt,对于不同的编译函数得到非托管函数的函数指针fp的流程如下所示:
图3为根据本发明示例的编译函数的一种流程示意图,如图3所示,当编译函数为函数mono_compile_method时,函数mono_compile_method完成的功能通过以下步骤体现:
步骤S302,获取托管函数的指针mt(相当于上述实施例的第二函数指针);
步骤S304,将指针mt作为参数值代入到函数mono_compile_method中,得到函数指针fp;
步骤S306,通过hook操作得到非托管函数(也可以叫native函数)的函数指针fp。
图4为根据本发明示例的编译函数的另一种流程示意图,如图4所示,当编译函数为函数mono_jit_compile_method时,函数mono_jit_compile_method完成的功能通过以下步骤体现:
步骤S402,获取托管函数的指针mt(相当于上述实施例的第二函数指针);
步骤S404,将指针mt作为参数值代入到函数mono_jit_compile_method中,得到函数指针fp;
步骤S406,通过hook操作得到非托管函数(也可以叫native函数)的函数指针fp。
图5为根据本发明示例的编译函数的又一种流程示意图,如图5所示,当编译函数为函数mono_jit_compile_method_with_opt时,函数mono_jit_compile_method_with_opt完成的功能通过以下步骤体现:
步骤S502,获取托管函数的指针mt(相当于上述实施例的第二函数指针);
步骤S504,将指针mt作为参数值代入到函数mono_jit_compile_method_with_opt中,得到函数指针fp;
步骤S506,通过hook操作得到非托管函数(也可以叫native函数)的函数指针fp。
进一步地,在本发明示例中,由于所有的托管函数都需要翻译成非托管函数,也就是说,在正在运行的托管程序中,所有的托管函数都会调用上述列举的多个编译函数进行编译,进而能够实现对所有的托管函数都能够获取到函数调用信息,进而通过监听函数指针fp的参数和返回值,就能够起到监控所有托管函数。
图6为根据本发明示例的根据函数指针fp监听参数和返回值的流程图,如图6所示,主要包括以下步骤:
步骤S602,通过编译函数mono_compile_method获取到非托管函数中的函数指针fp;
步骤S604,通过hook操作得到上述函数指针fp;
步骤S606,通过预先定义的hook函数监听函数指针fp的参数和返回值。
在上述技术方案的基础上,可以定义一个字典记录MonoMethod的指针mt和mt编译成native代码后的函数指针fp的对应关系:map<mt,fp>,当执行被hook的函数fp中后会被hook到预先定义的hook函数中执行,在预先定义的hook函数中通过返回地址回溯到调用者调用fp的汇编代码,根据这条汇编代码参考ARM指令集可以计算出fp的值,然后遍历mt和fp对应的字典记录就可以确定本次调用的函数的MonoMethod指针mt,调用mono_method_get_name可以得到本次调用的函数的完整函数名,再在自定义hook函数中记录下函数的函数进入时间、函数退出时间、函数参数和函数返回值就可以完成对托管代码的函数监控功能,监控的数据至少包括:函数名、函数进入时间、函数退出时间、函数参数和函数返回值,具体地,经过编译函数编译成非托管函数之后,获取到非托管函数的函数指针fp,对获取到的fp执行hook操作,其中,这个fp就可以理解为是“被hook函数”,上述实施例中预先定义的hook函数可以存在有多种情况,预先定义的hook函数主要用于知晓预先定义的hook函数自身被调用时,是代替哪个函数去执行的,所以预先定义的hook函数动态定位到被替代的函数fp,这个过程可以大致理解为是通过返回地址回溯到fp值的过程。
具体流程见图7,图7为根据本发明示例的监控函数调用信息的流程图,如图7所示,主要包括以下步骤:
步骤S702,当前正在运行的程序中执行一次非托管函数,以及定义mt与fp的对应关系:map<mt,fp>;
步骤S704,通过hook操作得到函数指针fp;
步骤S706,将函数指针代入到预先定义的hook函数中;
需要说明的是,通过步骤S706中代入到预先定义的hook函数中中,可以实现修改参数和返回值,进而在步骤S712中就可以记录。
步骤S708,通过返回地址(可以理解为是一种返回值)回溯到fp的值并通过查询对应关系map<mt,fp>得到指针mt;
步骤S710,调用mono_method_get_name可以得到本次调用的函数的完整函数名;
步骤S712,至少记录本地调用的函数的函数进入时间、函数退出时间,以及参数返回值。
以下从另一个角度理解上述图7所示的技术方案,由于事先已经hook了mono_compile_method,这个函数在游戏运行过程中只要执行了以此没有编译过的C语言,就会调用一次,调用之后将托管函数编译成非托管函数,即本发明实施例的主要思想是被动触发执行,主要游戏执行了一次mono_compile_method,由于这个函数被hook替换成了my_mono_compile_method,进而就会执行my_mono_compile_method,而这个函数用于调用函数mono_compile_method,进而将托管函数编译成非托管函数,mono_compile_method的其中一个参数可以理解为是上述实施例中的指针mt,其返回值就是上述函数指针fp,之后,将每次经由my_mono_compile_method的所有方法都hook操作一遍,这样就可以监控所有托管函数的执行了。
综上,本发明实施例以及示例的技术方案能够实时记录在mono中运行的.Net程序的托管函数级别的调用以及运行情况,可以有序地记录函数的进入时间,退出时间,函数的参数和返回值,最终得到的数据可以详细地展示.Net程序在运行时函数间的调用情况,这个过程可以根据时间需求修改参数和返回值以达到特殊的调试目的。根据记录下的函数进入时间和函数退出时间,还可以用来分析运行时程序的性能,可用定位程序的性能瓶颈进而可以进行针对性的优化,从而可以快速解决程序在逻辑上的性能问题,利用本发明还可以用来统计代码执行的覆盖度,在测试中可以用来统计代码执行的覆盖度,对试用例的代码覆盖情况有一个直观的反映。
而应用相关技术提供的技术方案,需要定位性能问题需要凭开发者的经验判断可能存在性能瓶颈的函数打log进行判断这些函数是否真的存在性能问题,非常耗时耗精力;此外,测试人员往往会因为不知道自己编写的测试用例覆盖了多少代码逻辑而可能会漏测不少逻辑导致发布的程序有bug。
而采用本发明实施例提供的上述技术方案,不仅解决了偶现Crash的问题,还能记录和修改所有托管函数运行时的参数和返回值,利用函数的进入和退出时间可以快速定位程序函数级别的逻辑性能瓶颈,统计函数的调用次数可以有针对性地对频繁调用的函数进行针对性的优化,利用监控的参数情况,可以针对性地对参数进行优化,通过这些数据可以提供程序的性能;测试人员还可以在黑盒测试层面获取测试用例执行时的代码覆盖率,对设计更全面的测试用例有非常大的帮助,使用修改参数和返回值的功能,可以对程序进行逻辑层面的安全性和程序健壮性进行针对性地测试,可以极大地方便测试工作。
需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明所必须的。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到根据上述实施例的方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
实施例2
根据本发明实施例,还提供了一种用于实施上述函数调用信息的获取方法的函数调用信息的获取装置,如图8所示,该装置包括:
1)编译单元80,用于在运行待测试的程序的过程中,对程序中待调用的托管函数进行编译;
2)第一确定单元82,用于对托管函数编译后得到非托管函数,其中,非托管函数被允许直接运行在中央处理器CPU上;
3)第二确定单元84,用于对非托管函数进行钩子hook操作,得到第一函数调用信息,其中,hook操作用于监控非托管函数在运行时的参数和返回值,第一函数调用信息至少包括:函数进入时间、函数退出时间,函数返回值;
4)生成单元86,用于根据第一函数调用信息和托管函数的函数名生成第二函数调用信息,其中,第二函数调用信息中包括具有对应关系的托管函数的函数名、函数进入时间、函数退出时间,函数返回值;
5)输出单元88,用于输出第二函数调用信息。
可选地,在本实施例中,上述函数调用情况的获取方法可以但不限于应用于测试设备中,也可以应用于终端中,本发明实施例对此不作任何限定。需要说明的是,本发明实施例对第一函数调用信息和第二函数调用信息不作具体限定,例如,第一函数调用信息还可以包括函数名和发生的行为,其中,发生的行为可以是进入函数,也可以是退出函数;第二函数调用信息中还可以包括发生的行为。
需要说明的是,在本发明实施例中,在运行待测试的程序的过程中,对程序中待调用的托管函数进行编译,得到非托管函数,对非托管函数进行钩子hook操作,得到第一函数调用信息,根据第一函数调用信息和托管函数的函数名生成第二函数调用信息,进而输出得到的第二函数调用信息,通过hook操作技术来得到第一函数调用信息,再得到根据第一函数调用信息和托管函数的函数名生成的第二函数调用信息,从而不会出现crash崩溃现象,进而解决了相关技术中采用mono提供的分析工具获取托管函数的调用情况的技术方案,偶现crash现象的技术问题。
在一个可选示例中,可以通过编译函数对上述托管函数进行编译得到非托管函数,本发明实施例中的编译函数可以是函数mono_compile_method,也可以是函数mono_jit_compile_method,还可以是mono_jit_compile_method_with_opt,只要是能够将托管函数编译成非托管函数,均在本发明实施例的保护范围内。
需要说明的是,由于本发明实施例是在运行待测试的程序的过程中,对程序中待调用的托管函数进行编译进而得到非托管函数的,也就是说,本发明实施例的技术方案能够获取到运行时托管函数的调用信息,解决了相关技术中无法记录运行时托管函数的调用信息的问题。
图9为根据本发明实施例的一种可选的函数调用信息的获取装置的另一结构框图,如图9所示,上述装置还包括:
第一获取单元90,用于根据预先建立的对应关系获取与非托管函数的第一函数指针对应的托管函数的第二函数指针;查找单元92,用于通过第二函数指针查找到托管函数的函数名。
也就是说,对非托管函数进行hook操作之后,本发明实施例能够获取到非托管函数的第一函数指针,进而根据预先建立的对应关系获取与第一函数指针对应的托管函数的第二函数指针,在这之前,可以建立非托管函数的第一函数指针与托管函数的第二函数指针之间的对应关系,其中,进行编译所需的参数包括托管函数的第二函数指针,进行编译之后所得到的返回值包括非托管函数的第一函数指针,具体地,第一函数指针和第二函数指针可以通过以下方式体现对应关系:第二函数指针作为上述编译函数的参数值,第一函数指针作为将第二函数指针作为参数值代入到上述编译函数中得到的返回值。
如图9所示,上述装置还包括:第二获取单元92,用于通过执行hook操作得到的返回地址调用非托管函数的汇编代码;第三获取单元94,用于根据汇编代码获取非托管函数的第一函数指针。
由于hook操作的核心思想在于替代部分代码的执行,本发明实施例的技术方案实际上可以理解为对非托管函数执行完hook操作之后,能够动态定位到被代替执行的代码处,上述返回地址可以用于指示被替代执行的代码,对于根据汇编代码得到上述第一函数指针的技术方案,本发明实施例可以通过预先定义的hook函数实现,也可以通过本领域技术人员有能力知晓的其他任何技术方案,本发明实施例对此不作限定。
可选地,如图9所示,上述装置还可以包括:
建立单元96,用于建立非托管函数的第一函数指针与托管函数的第二函数指针之间的对应关系,其中,进行编译所需的参数包括托管函数的第二函数指针,进行编译之后所得到的返回值包括非托管函数的第一函数指针。
图10为根据本发明实施例的一种可选的第一确定单元的结构框图,如图10所示,第一确定单元82包括:
操作模块820,用于使用预先定义的hook函数对非托管函数进行hook操作,其中,预先定义的hook函数输入参数包括:需要被hook操作的参数,预先定义的hook函数输出参数包括:托管函数运行时的参数和返回值,预先定义的hook函数,用于监控非托管函数在运行时的参数和返回值,需要说明的是,上述第一函数指针可以理解为是需要被hook操作的参数。
在实际应用中,相关技术中的技术方案虽然能够记录托管函数的调用情况,但也只能调用mono主用调用托管函数而不能记录到所有托管代码函数,本发明实施例在执行对程序中待调用的托管函数进行编译时,通过编译单元98(如图9所示),对所有待调用的托管函数进行编译,进而能够获取到所有托管函数的调用信息。
综上,本发明实施例以及示例的技术方案能够实时记录在mono中运行的.Net程序的托管函数级别的调用以及运行情况,可以有序地记录函数的进入时间,退出时间,函数的参数和返回值,最终得到的数据可以详细地展示.Net程序在运行时函数间的调用情况,这个过程可以根据时间需求修改参数和返回值以达到特殊的调试目的。根据记录下的函数进入时间和函数退出时间,还可以用来分析运行时程序的性能,可用定位程序的性能瓶颈进而可以进行针对性的优化,从而可以快速解决程序在逻辑上的性能问题,利用本发明还可以用来统计代码执行的覆盖度,在测试中可以用来统计代码执行的覆盖度,对试用例的代码覆盖情况有一个直观的反映。
实施例3
根据本发明实施例,还提供了一种用于实施上述函数调用信息的获取方法的测试设备,如图11所示,该测试设备包括:
处理器110;
用于存储处理器可执行指令的存储器112;
其中,处理器110,用于在运行待测试的程序的过程中,对程序中待调用的托管函数进行编译,得到非托管函数,对非托管函数进行钩子hook操作,得到第一函数调用信息,根据第一函数调用信息和托管函数的函数名生成第二函数调用信息,进而输出第二函数调用信息,其中,非托管函数被允许直接运行在中央处理器CPU上,hook操作用于监控非托管函数在运行时的参数和返回值,第一函数调用信息至少包括:函数进入时间、函数退出时间,函数返回值,第二函数调用信息中包括具有对应关系的托管函数的函数名、函数进入时间、函数退出时间,函数返回值。
可选地,测试设备还设置有操作界面,操作界面用于接收用户操作,所述处理器,还用于根据用户操作对与测试设备相连接的终端进行测试得到托管代码函数的调用信息。
处理器110,还用于将所述托管代码函数的调用信息发送至所述终端,进而在终端的指定文件夹下保存上述调用信息。
通过上述处理器110和存储器112,在运行待测试的程序的过程中,对程序中待调用的托管函数进行编译,得到非托管函数,对非托管函数进行钩子hook操作,得到第一函数调用信息,根据第一函数调用信息和托管函数的函数名生成第二函数调用信息,进而输出得到的第二函数调用信息,通过hook操作技术来得到第一函数调用信息,再得到根据第一函数调用信息和托管函数的函数名生成的第二函数调用信息,从而不会出现crash崩溃现象,进而解决了相关技术中采用mono提供的分析工具获取托管函数的调用情况的技术方案,偶现crash现象的技术问题。
对于上述步骤S202可以有多种实现方式,在一个可选示例中,可以通过编译函数对上述托管函数进行编译得到非托管函数,本发明实施例中的编译函数可以是函数mono_compile_method,也可以是函数mono_jit_compile_method,还可以是mono_jit_compile_method_with_opt,只要是能够将托管函数编译成非托管函数,均在本发明实施例的保护范围内。
需要说明的是,由于步骤S202是在运行待测试的程序的过程中,对程序中待调用的托管函数进行编译进而得到非托管函数的,也就是说,本发明实施例的技术方案能够获取到运行时托管函数的调用信息,解决了相关技术中无法记录运行时托管函数的调用信息的问题。
可选地,在对非托管函数进行钩子hook操作之后,且在根据第一函数调用信息和托管函数的函数名生成第二函数调用信息之前,本发明实施例还提供了以下技术方案:根据预先建立的对应关系获取与非托管函数的第一函数指针对应的托管函数的第二函数指针;通过第二函数指针查找到托管函数的函数名。
也就是说,对非托管函数进行hook操作之后,本发明实施例能够获取到非托管函数的第一函数指针,进而根据预先建立的对应关系获取与第一函数指针对应的托管函数的第二函数指针,在这之前,可以建立非托管函数的第一函数指针与托管函数的第二函数指针之间的对应关系,其中,进行编译所需的参数包括托管函数的第二函数指针,进行编译之后所得到的返回值包括非托管函数的第一函数指针,具体地,第一函数指针和第二函数指针可以通过以下方式体现对应关系:第二函数指针作为上述编译函数的参数值,第一函数指针作为将第二函数指针作为参数值代入到上述编译函数中得到的返回值。
基于上述方案,在对非托管函数进行钩子hook操作之后,且在根据预先建立的对应关系获取与非托管函数的第一函数指针对应的托管函数的第二函数指针之前,本发明实施例还提供了以下技术方案:
通过执行hook操作得到的返回地址获取非托管函数的汇编代码;根据汇编代码获取非托管函数的第一函数指针,由于hook操作的核心思想在于替代部分代码的执行,本发明实施例的技术方案实际上可以理解为对非托管函数执行完hook操作之后,能够动态定位到被代替执行的代码处,上述返回地址可以用于指示被替代执行的代码,对于根据汇编代码得到上述第一函数指针的技术方案,本发明实施例可以通过预先定义的hook函数实现,也可以通过本领域技术人员有能力知晓的其他任何技术方案,本发明实施例对此不作限定。
可选地,本发明实施例还可以通过以下技术方案实现上述步骤S204的过程,使用预先定义的hook函数对非托管函数进行hook操作,其中,预先定义的hook函数输入参数包括:需要被hook操作的参数,预先定义的hook函数输出参数包括:托管函数运行时的参数和返回值,预先定义的hook函数,用于监控非托管函数在运行时的参数和返回值,需要说明的是,上述第一函数指针可以理解为是需要被hook操作的参数。
在实际应用中,相关技术中的技术方案虽然能够记录托管函数的调用情况,但也只能调用mono主用调用托管函数而不能记录到所有托管代码函数,本发明实施例在执行对程序中待调用的托管函数进行编译时,通过对所有待调用的托管函数进行编译,进而能够获取到所有托管函数的调用信息。
以下结合一示例对测试设备的获取函数调用信息的流程以及测试设备与终端之间的流程进行解释说明。
上述测试设备可以对基于Mono运行的.NET程序进行托管代码函数的测试,本发明示例通过展现一个测试设备的产品客户端的显示形式来说明测试设备对终端测试以及获取函数调用信息的过程,。
图12为根据本发明实施例的一种可选的产品设备的主界面的示意图,如图12所示,
打开产品客户端,并与终端手机进行了连接,本发明实施例的连接可以采用有线方式,也可以蓝牙,无线网等无线方式,测设设备会根据实际需要选择终端上的一个手游进行测试,选择完待进行测试的游戏之后,会出现如图13所示的界面。
如图14所示,点击确定选择的待测试游戏以后,测试设备首先会对游戏进行必要的初始化工作,初始化流程完成以后,再拉起游戏。
测试设备就会开始执行测试过程,测试过程结束后,测试设备会将测试结果发送至终端,终端在预先设备的目录下就会生成一个文件(可以是function.txt文件),在这个指定文件夹下,详细记录了游戏运行过程中对托管代码函数的调用情况,如下所示:
1642421[1467193517,604471204]leave:Npc 2:Update()ret:0
1642422[1467193517,604532239]enter:HitEffectController:Update()
1642423[1467193517,604593274]leave:HitEffectController:Update()ret:0.
由上述游戏运行过程中的记录结果可知,上述方括号内的数据为发生这个行为的时间戳,第一个数据的单位为秒,第二个数据的单位为纳秒,紧接着为发生的行为,enter表示进入这个函数,leave表示退出这个函数,行为后面的即为函数名,可以看到参数和返回值。开发人员可以利用这些信息进行统计以定位出程序的性能问题,测试人员可以根据这些信息在黑盒的情况下大致判断程序的运行逻辑,同时也可以测试用例的代码覆盖率。
可选地,本实施例中的具体示例可以参考上述实施例1和实施例2中所描述的示例,本实施例在此不再赘述。
实施例4
本发明的实施例还提供了一种存储介质。可选地,在本实施例中,上述存储介质可以位于测试设备中。
可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:
S1,在运行待测试的程序的过程中,对程序中待调用的托管函数进行编译,得到非托管函数,其中,非托管函数被允许直接运行在中央处理器CPU上;
S2,对非托管函数进行钩子hook操作,得到第一函数调用信息,其中,hook操作用于监控非托管函数在运行时的参数和返回值,第一函数调用信息至少包括:函数进入时间、函数退出时间,函数返回值;
S3,根据第一函数调用信息和托管函数的函数名生成第二函数调用信息,其中,第二函数调用信息中包括具有对应关系的托管函数的函数名、函数进入时间、函数退出时间,函数返回值;
S4,输出第二函数调用信息。
可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:
S1,根据预先建立的对应关系获取与所述非托管函数的第一函数指针对应的所述托管函数的第二函数指针;
S2,通过所述第二函数指针查找到所述托管函数的所述函数名。
可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:
S1,通过执行所述hook操作得到的返回地址获取所述非托管函数的汇编代码;
S2,根据所述汇编代码获取所述非托管函数的第一函数指针。
可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:
S1,建立所述非托管函数的第一函数指针与所述托管函数的第二函数指针之间的所述对应关系,其中,进行所述编译所需的参数包括所述托管函数的第二函数指针,进行所述编译之后所得到的返回值包括所述非托管函数的第一函数指针。
可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:
S1,使用预先定义的hook函数对非托管函数进行所述hook操作,其中,所述预先定义的hook函数输入参数包括:需要被hook操作的参数,所述预先定义的hook函数输出参数包括:所述托管函数运行时的参数和返回值,所述预先定义的hook函数,用于监控所述非托管函数在运行时的参数和返回值。
可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:
S1,对所述程序中所有待调用的托管函数进行编译,得到对应的非托管函数。
可选地,在本实施例中,上述存储介质可以包括但不限于:U盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
可选地,本实施例中的具体示例可以参考上述实施例1和实施例2中所描述的示例,本实施例在此不再赘述。
综上所述,本发明实施例达到了以下技术效果:能够实时记录在mono中运行的.Net程序的托管函数级别的调用以及运行情况,可以有序地记录函数的进入时间,退出时间,函数的参数和返回值,最终得到的数据可以详细地展示.Net程序在运行时函数间的调用情况,这个过程可以根据时间需求修改参数和返回值以达到特殊的调试目的。根据记录下的函数进入时间和函数退出时间,还可以用来分析运行时程序的性能,可用定位程序的性能瓶颈进而可以进行针对性的优化,从而可以快速解决程序在逻辑上的性能问题,利用本发明还可以用来统计代码执行的覆盖度,在测试中可以用来统计代码执行的覆盖度,对试用例的代码覆盖情况有一个直观的反映。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
上述实施例中的集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在上述计算机可读取的存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在存储介质中,包括若干指令用以使得一台或多台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。
在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
在本申请所提供的几个实施例中,应该理解到,所揭露的客户端,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (13)
1.一种函数调用信息的获取方法,其特征在于,包括:
在运行待测试的程序的过程中,对所述程序中待调用的托管函数进行编译,得到非托管函数,其中,所述非托管函数被允许直接运行在中央处理器CPU上;
对所述非托管函数进行钩子hook操作,得到第一函数调用信息,其中,所述hook操作用于监控所述非托管函数在运行时的参数和返回值,所述第一函数调用信息至少包括:函数进入时间、函数退出时间,函数返回值;
根据所述第一函数调用信息和所述托管函数的函数名生成第二函数调用信息,其中,所述第二函数调用信息中包括具有对应关系的所述托管函数的函数名、函数进入时间、函数退出时间,函数返回值;
输出所述第二函数调用信息。
2.根据权利要求1所述的方法,其特征在于,在对所述非托管函数进行钩子hook操作之后,且在根据所述第一函数调用信息和所述托管函数的函数名生成第二函数调用信息之前,还包括:
根据预先建立的对应关系获取与所述非托管函数的第一函数指针对应的所述托管函数的第二函数指针;
通过所述第二函数指针查找到所述托管函数的所述函数名。
3.根据权利要求2所述的方法,其特征在于,在对所述非托管函数进行钩子hook操作之后,且在根据预先建立的对应关系获取与所述非托管函数的第一函数指针对应的所述托管函数的第二函数指针之前,还包括:
通过执行所述hook操作得到的返回地址获取所述非托管函数的汇编代码;
根据所述汇编代码获取所述非托管函数的第一函数指针。
4.根据权利要求2所述的方法,其特征在于,在对所述程序中待调用的托管函数进行编译之后,且在根据预先建立的对应关系获取与所述非托管函数的第一函数指针对应的所述托管函数的第二函数指针之前,还包括:
建立所述非托管函数的第一函数指针与所述托管函数的第二函数指针之间的所述对应关系,其中,进行所述编译所需的参数包括所述托管函数的第二函数指针,进行所述编译之后所得到的返回值包括所述非托管函数的第一函数指针。
5.根据权利要求1至4中任一项所述的方法,其特征在于,对所述非托管函数进行钩子hook操作,得到第一函数调用信息包括:
使用预先定义的hook函数对非托管函数进行所述hook操作,其中,所述预先定义的hook函数输入参数包括:需要被hook操作的参数,所述预先定义的hook函数输出参数包括:所述托管函数运行时的参数和返回值,所述预先定义的hook函数,用于监控所述非托管函数在运行时的参数和返回值。
6.根据权利要求1至4中任一项所述的方法,其特征在于,对所述程序中待调用的托管函数进行编译,得到非托管函数包括:
对所述程序中所有待调用的托管函数进行编译,得到对应的非托管函数。
7.一种函数调用信息的获取装置,其特征在于,包括:
编译单元,用于在运行待测试的程序的过程中,对所述程序中待调用的托管函数进行编译;
第一确定单元,用于对所述托管函数编译后得到非托管函数,其中,所述非托管函数被允许直接运行在中央处理器CPU上;
第二确定单元,用于对所述非托管函数进行钩子hook操作,得到第一函数调用信息,其中,所述hook操作用于监控所述非托管函数在运行时的参数和返回值,所述第一函数调用信息至少包括:函数进入时间、函数退出时间,函数返回值;
生成单元,用于根据所述第一函数调用信息和所述托管函数的函数名生成第二函数调用信息,其中,所述第二函数调用信息中包括具有对应关系的所述托管函数的函数名、函数进入时间、函数退出时间,函数返回值;
输出单元,用于输出所述第二函数调用信息。
8.根据权利要求7所述的装置,其特征在于,所述装置还包括:
第一获取单元,用于根据预先建立的对应关系获取与所述非托管函数的第一函数指针对应的所述托管函数的第二函数指针;
查找单元,用于通过所述第二函数指针查找到所述托管函数的所述函数名。
9.根据权利要求8所述的装置,其特征在于,所述装置还包括:
第二获取单元,用于通过执行所述hook操作得到的返回地址获取所述非托管函数的汇编代码;
第三获取单元,用于根据所述汇编代码获取所述非托管函数的第一函数指针。
10.根据权利要求8所述的装置,其特征在于,所述装置还包括:
建立单元,用于建立所述非托管函数的第一函数指针与所述托管函数的第二函数指针之间的所述对应关系,其中,进行所述编译所需的参数包括所述托管函数的第二函数指针,进行所述编译之后所得到的返回值包括所述非托管函数的第一函数指针。
11.根据权利要求7至10中任一项所述的装置,其特征在于,所述第一确定单元包括:
操作模块,用于使用预先定义的hook函数对非托管函数进行所述hook操作,其中,所述预先定义的hook函数输入参数包括:需要被hook操作的参数,所述预先定义的hook函数输出参数包括:所述托管函数运行时的参数和返回值,所述预先定义的hook函数,用于监控所述非托管函数在运行时的参数和返回值。
12.根据权利要求7至10中任一项所述的装置,其特征在于,所述编译单元,还用于对所述程序中所有待调用的托管函数进行编译,得到对应的非托管函数。
13.一种测试设备,其特征在于,包括:
处理器;
用于存储处理器可执行指令的存储器;
其中,所述处理器,用于在运行待测试的程序的过程中,对所述程序中待调用的托管函数进行编译,得到非托管函数,对所述非托管函数进行钩子hook操作,得到第一函数调用信息,根据所述第一函数调用信息和所述托管函数的函数名生成第二函数调用信息,进而输出所述第二函数调用信息,其中,所述非托管函数被允许直接运行在中央处理器CPU上,所述hook操作用于监控所述非托管函数在运行时的参数和返回值,所述第一函数调用信息至少包括:函数进入时间、函数退出时间,函数返回值,所述第二函数调用信息中包括具有对应关系的所述托管函数的函数名、函数进入时间、函数退出时间,函数返回值。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610825962.XA CN106649084B (zh) | 2016-09-14 | 2016-09-14 | 函数调用信息的获取方法及装置、测试设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610825962.XA CN106649084B (zh) | 2016-09-14 | 2016-09-14 | 函数调用信息的获取方法及装置、测试设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106649084A true CN106649084A (zh) | 2017-05-10 |
CN106649084B CN106649084B (zh) | 2019-05-24 |
Family
ID=58852197
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610825962.XA Active CN106649084B (zh) | 2016-09-14 | 2016-09-14 | 函数调用信息的获取方法及装置、测试设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106649084B (zh) |
Cited By (16)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107480029A (zh) * | 2017-08-02 | 2017-12-15 | 北京深思数盾科技股份有限公司 | 一种函数调用时间的监控方法及装置 |
CN107545182A (zh) * | 2017-09-06 | 2018-01-05 | 武汉斗鱼网络科技有限公司 | 一种ios应用中绕过函数调用链检测的方法及系统 |
CN108108304A (zh) * | 2017-12-29 | 2018-06-01 | 北京奇艺世纪科技有限公司 | 一种测试覆盖率的检测方法及装置 |
CN108197004A (zh) * | 2018-01-23 | 2018-06-22 | 武汉斗鱼网络科技有限公司 | Ios应用的方法耗时、加载视图耗时的监测方法及系统 |
CN108304303A (zh) * | 2018-01-03 | 2018-07-20 | 珠海金山网络游戏科技有限公司 | 一种统计帧同步服务器的脚本运行性能的方法和系统 |
CN108595319A (zh) * | 2018-03-30 | 2018-09-28 | 阿里巴巴集团控股有限公司 | 函数选取方法和服务器 |
CN108984409A (zh) * | 2018-07-13 | 2018-12-11 | 郑州云海信息技术有限公司 | 一种函数定位的方法及装置 |
CN109471767A (zh) * | 2017-09-08 | 2019-03-15 | 福建省天奕网络科技有限公司 | 一种hook虚拟机中的函数的方法及终端 |
CN112486700A (zh) * | 2020-11-20 | 2021-03-12 | 北京邮电大学 | 通信方法、装置和存储介质 |
CN112631904A (zh) * | 2020-12-17 | 2021-04-09 | 展讯通信(上海)有限公司 | 函数调用信息的记录方法及设备 |
CN112882754A (zh) * | 2019-11-29 | 2021-06-01 | 大唐移动通信设备有限公司 | 一种函数调用方法及处理器 |
CN113051088A (zh) * | 2021-03-31 | 2021-06-29 | 广州锦行网络科技有限公司 | 程序加载方法、装置、设备及计算机可读介质 |
CN113190235A (zh) * | 2021-05-27 | 2021-07-30 | 武汉斗鱼鱼乐网络科技有限公司 | 一种代码的分析方法、装置、电子终端及存储介质 |
WO2021190354A1 (zh) * | 2020-03-26 | 2021-09-30 | 华为技术有限公司 | 一种采集追踪trace调用链的方法和电子设备 |
CN113535143A (zh) * | 2020-04-21 | 2021-10-22 | 腾讯科技(深圳)有限公司 | 堆栈信息处理方法、装置、电子设备和存储介质 |
CN113905025A (zh) * | 2021-09-27 | 2022-01-07 | 武汉斗鱼网络科技有限公司 | 一种传输流数据的方法、装置、介质及计算机设备 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101576829A (zh) * | 2009-06-12 | 2009-11-11 | 宋志飞 | 嵌入式Linux系统中应用进程的托管方法及系统 |
CN101853204A (zh) * | 2010-06-01 | 2010-10-06 | 华南理工大学 | 一种windows环境下的复杂控件测试系统 |
US20110307858A1 (en) * | 2010-06-14 | 2011-12-15 | Microsoft Corporation | Pre-compiling hosted managed code |
CN105550585A (zh) * | 2016-03-02 | 2016-05-04 | 腾讯科技(深圳)有限公司 | 一种应用程序安全性测试方法、装置和系统 |
-
2016
- 2016-09-14 CN CN201610825962.XA patent/CN106649084B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101576829A (zh) * | 2009-06-12 | 2009-11-11 | 宋志飞 | 嵌入式Linux系统中应用进程的托管方法及系统 |
CN101853204A (zh) * | 2010-06-01 | 2010-10-06 | 华南理工大学 | 一种windows环境下的复杂控件测试系统 |
US20110307858A1 (en) * | 2010-06-14 | 2011-12-15 | Microsoft Corporation | Pre-compiling hosted managed code |
CN105550585A (zh) * | 2016-03-02 | 2016-05-04 | 腾讯科技(深圳)有限公司 | 一种应用程序安全性测试方法、装置和系统 |
Non-Patent Citations (1)
Title |
---|
CSDN: "C#调用DLL函数方法(上)", 《HTTP://DEVELOPER.51CTO.COM/ART/200908/141697.HTML》 * |
Cited By (25)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107480029B (zh) * | 2017-08-02 | 2019-02-15 | 北京深思数盾科技股份有限公司 | 一种函数调用时间的监控方法及装置 |
CN107480029A (zh) * | 2017-08-02 | 2017-12-15 | 北京深思数盾科技股份有限公司 | 一种函数调用时间的监控方法及装置 |
CN107545182A (zh) * | 2017-09-06 | 2018-01-05 | 武汉斗鱼网络科技有限公司 | 一种ios应用中绕过函数调用链检测的方法及系统 |
CN107545182B (zh) * | 2017-09-06 | 2019-11-15 | 武汉斗鱼网络科技有限公司 | 一种ios应用中绕过函数调用链检测的方法及系统 |
CN109471767A (zh) * | 2017-09-08 | 2019-03-15 | 福建省天奕网络科技有限公司 | 一种hook虚拟机中的函数的方法及终端 |
CN108108304A (zh) * | 2017-12-29 | 2018-06-01 | 北京奇艺世纪科技有限公司 | 一种测试覆盖率的检测方法及装置 |
CN108304303A (zh) * | 2018-01-03 | 2018-07-20 | 珠海金山网络游戏科技有限公司 | 一种统计帧同步服务器的脚本运行性能的方法和系统 |
CN108197004B (zh) * | 2018-01-23 | 2021-04-27 | 武汉斗鱼网络科技有限公司 | Ios应用的方法耗时、加载视图耗时的监测方法及系统 |
CN108197004A (zh) * | 2018-01-23 | 2018-06-22 | 武汉斗鱼网络科技有限公司 | Ios应用的方法耗时、加载视图耗时的监测方法及系统 |
CN108595319A (zh) * | 2018-03-30 | 2018-09-28 | 阿里巴巴集团控股有限公司 | 函数选取方法和服务器 |
CN108595319B (zh) * | 2018-03-30 | 2020-08-04 | 阿里巴巴集团控股有限公司 | 函数选取方法和服务器 |
CN108984409A (zh) * | 2018-07-13 | 2018-12-11 | 郑州云海信息技术有限公司 | 一种函数定位的方法及装置 |
CN108984409B (zh) * | 2018-07-13 | 2021-10-22 | 郑州云海信息技术有限公司 | 一种函数定位的方法及装置 |
CN112882754B (zh) * | 2019-11-29 | 2023-07-07 | 大唐移动通信设备有限公司 | 一种函数调用方法及处理器 |
CN112882754A (zh) * | 2019-11-29 | 2021-06-01 | 大唐移动通信设备有限公司 | 一种函数调用方法及处理器 |
WO2021190354A1 (zh) * | 2020-03-26 | 2021-09-30 | 华为技术有限公司 | 一种采集追踪trace调用链的方法和电子设备 |
CN113535143A (zh) * | 2020-04-21 | 2021-10-22 | 腾讯科技(深圳)有限公司 | 堆栈信息处理方法、装置、电子设备和存储介质 |
CN112486700B (zh) * | 2020-11-20 | 2023-06-02 | 北京邮电大学 | 通信方法、装置和存储介质 |
CN112486700A (zh) * | 2020-11-20 | 2021-03-12 | 北京邮电大学 | 通信方法、装置和存储介质 |
CN112631904A (zh) * | 2020-12-17 | 2021-04-09 | 展讯通信(上海)有限公司 | 函数调用信息的记录方法及设备 |
CN113051088A (zh) * | 2021-03-31 | 2021-06-29 | 广州锦行网络科技有限公司 | 程序加载方法、装置、设备及计算机可读介质 |
CN113190235A (zh) * | 2021-05-27 | 2021-07-30 | 武汉斗鱼鱼乐网络科技有限公司 | 一种代码的分析方法、装置、电子终端及存储介质 |
CN113190235B (zh) * | 2021-05-27 | 2022-05-10 | 武汉斗鱼鱼乐网络科技有限公司 | 一种代码的分析方法、装置、电子终端及存储介质 |
CN113905025A (zh) * | 2021-09-27 | 2022-01-07 | 武汉斗鱼网络科技有限公司 | 一种传输流数据的方法、装置、介质及计算机设备 |
CN113905025B (zh) * | 2021-09-27 | 2023-06-16 | 武汉斗鱼网络科技有限公司 | 一种传输流数据的方法、装置、介质及计算机设备 |
Also Published As
Publication number | Publication date |
---|---|
CN106649084B (zh) | 2019-05-24 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106649084A (zh) | 函数调用信息的获取方法及装置、测试设备 | |
US9529692B2 (en) | Memory management tools | |
CN102667730B (zh) | 设计时调试 | |
US9280451B2 (en) | Testing device | |
US9971672B2 (en) | Using emulation to disassociate verification from stimulus in functional test | |
CN103984626B (zh) | 一种生成测试用例脚本的方法及装置 | |
US8312417B2 (en) | Using dynamic call graphs for creating state machines | |
CN110321275A (zh) | 程序监控方法、装置、计算设备以及存储介质 | |
CN111538659B (zh) | 业务场景的接口测试方法、系统、电子设备和存储介质 | |
CN104346148A (zh) | 获取程序性能消耗信息的方法、装置及系统 | |
CN105512562B (zh) | 一种漏洞挖掘方法、装置及电子设备 | |
EP4085336B1 (en) | Computer resource leak detection | |
CN109947624A (zh) | 状态监控方法及装置 | |
US10241895B2 (en) | Memory stack trace management tool | |
CN111330280A (zh) | 游戏中的数据处理方法、装置、存储介质与电子设备 | |
CN109634838A (zh) | 定位应用程序故障的方法、装置、存储介质和电子设备 | |
CN111385661B (zh) | 语音控制全屏播放的方法、装置、终端及存储介质 | |
CN113220586A (zh) | 一种自动化的接口压力测试执行方法、装置和系统 | |
CN111459547A (zh) | 一种函数调用链路的展示方法和装置 | |
CN109308256A (zh) | 一种java程序动态分析方法、设备和存储介质 | |
US20240211360A1 (en) | Method and system for test script generation and execution | |
CN117348917A (zh) | 程序代码的处理方法、装置、存储介质和电子装置 | |
CN115904949A (zh) | 接口模拟方法、装置、设备及存储介质 | |
CN116149981A (zh) | 测试方法及装置、电子设备、计算机可读存储介质 | |
CN117873482A (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 | ||
TR01 | Transfer of patent right |
Effective date of registration: 20240111 Address after: 518000 Tencent Building, No. 1 High-tech Zone, Nanshan District, Shenzhen City, Guangdong Province, 35 Floors Patentee after: TENCENT TECHNOLOGY (SHENZHEN) Co.,Ltd. Patentee after: TENCENT CLOUD COMPUTING (BEIJING) Co.,Ltd. Address before: 2, 518000, East 403 room, SEG science and Technology Park, Zhenxing Road, Shenzhen, Guangdong, Futian District Patentee before: TENCENT TECHNOLOGY (SHENZHEN) Co.,Ltd. |
|
TR01 | Transfer of patent right |