一种代码重定向方法、装置、设备及计算机可读存储介质制造方法及图纸

技术编号:35688900 阅读:16 留言:0更新日期:2022-11-23 14:36
本申请提供了一种代码重定向方法、装置、设备及计算机可读存储介质,将针对初始方法的重定向需求所确定的重定向方法,编译成动态链接库文件;在JIT编译器对初始方法的CIL代码进行编译之前,采用程序集中待调用方法的CIL代码对初始方法的CIL代码进行匹配;若检测到与初始方法的CIL代码相匹配的目标调用方法的目标CIL代码,则采用目标CIL代码替换CIL代码;若目标调用方法插桩失败,则调用重定向方法,对初始方法进行重定向。通过本申请方案的实施,在JIT编译器编译之前对CIL代码替换失败时,对目标调用方法的目标CIL代码进行重定向,保证应用在插桩失败之后继续运行,提高应用运行效率。率。率。

【技术实现步骤摘要】
一种代码重定向方法、装置、设备及计算机可读存储介质


[0001]本申请涉及电子
,尤其涉及一种代码重定向方法、装置、设备及计算机可读存储介质。

技术介绍

[0002].NET平台代码在编译完成后是一个与平台无关的通用中间语言(Common Intermediate Language,简称CIL),我们在日常开发中需要对应用的性能进行分析监控或者对应用实现自动化覆盖测试等,这时就需要对应用进行插桩。
[0003]它是在保证被测程序原有逻辑完整性的基础上在程序中插入一些探针(又称为“探测仪”,本质上就是进行信息采集的代码段,可以是赋值语句或采集覆盖信息的函数调用),通过探针的执行并抛出程序运行的特征数据,通过对这些数据的分析,可以获得程序的控制流和数据流信息,进而得到逻辑覆盖等动态信息,从而实现测试目的的方法。目前.NET平台中常用的插桩方式是通过修改CIL从而实现插桩功能,但是这种插桩存在一个缺陷:一些底层的方法如mscorlib.dll中提供的一些方法是无法进行有效的插桩,因为在托管程序中,一个应用AppDomain在启动初始化之前或者正在启动初始化时,此时托管程序一些功能并未初始化完成,该应用的初始化可能不足以处理一些托管代码的执行(如探针的加载处理等),这些代码可能会从您重写的CIL(直接或间接)调用,造成无限递归或者CIL验证无效。此时插桩就会失败,应用报错终止运行。

技术实现思路

[0004]本申请实施例提供了一种代码重定向方法、装置、设备及计算机可读存储介质,至少能够解决相关技中插桩失败导致应用报错终止运行的问题。
[0005]本申请实施例第一方面提供了一种代码重定向方法,包括:
[0006]将针对初始方法的重定向需求所确定的重定向方法,编译成动态链接库文件;其中,所述重定向方法为用户自定义的包装方法;
[0007]在JIT编译器对所述初始方法的CIL代码进行编译之前,采用程序集中待调用方法的CIL代码对所述初始方法的CIL代码进行匹配;其中,所述CIL代码包括:CIL操作码;
[0008]若检测到与所述初始方法的CIL代码相匹配的目标调用方法的目标CIL代码,则采用所述目标CIL代码替换所述CIL代码;
[0009]在替换过程中,若所述目标调用方法插桩失败,则调用所述动态链接库文件中的所述重定向方法,对所述初始方法进行重定向。
[0010]本申请实施例第二方面提供了一种代码重定向装置,包括:
[0011]编译模块,用于将针对初始方法的重定向需求所确定的重定向方法,编译成动态链接库文件;其中,所述重定向方法为用户自定义的包装方法;
[0012]匹配模块,用于在JIT编译器对所述初始方法的CIL代码进行编译之前,采用程序集中待调用方法的CIL代码对所述初始方法的CIL代码进行匹配;其中,所述CIL代码包括:
CIL操作码;
[0013]替换模块,用于若检测到与所述初始方法的CIL代码相匹配的目标调用方法的目标CIL代码,则通过所述目标CIL代码替换所述CIL代码;
[0014]重定向模块,用于在替换过程中,若所述目标调用方法插桩失败,则调用所述动态链接库文件中的所述重定向方法,对所述初始方法进行重定向。
[0015]本申请实施例第三方面提供了一种电子设备,其特征在于,包括存储器及处理器,其中,所述处理器用于执行存储在所述存储器上的计算机程序,所述处理器执行所述计算机程序时上述本申请实施例第一方面提供的代码重定向方法中的各步骤。
[0016]本申请实施例第四方面提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时,实现上述本申请实施例第一方面提供的代码重定向方法中的各步骤。
[0017]由上可见,根据本申请方案所提供的代码重定向方法、装置、设备及计算机可读存储介质,将针对初始方法的重定向需求所确定的重定向方法,编译成动态链接库文件;其中,所述重定向方法为用户自定义的包装方法;在JIT编译器对所述初始方法的CIL代码进行编译之前,采用程序集中待调用方法的CIL代码对所述初始方法的CIL代码进行匹配;其中,所述CIL代码包括:CIL操作码;若检测到与所述初始方法的CIL代码相匹配的目标调用方法的目标CIL代码,则采用所述目标CIL代码替换所述CIL代码;在替换过程中,若所述目标调用方法插桩失败,则调用所述动态链接库文件中的所述重定向方法,对所述初始方法进行重定向。通过本申请方案的实施,在JIT编译器编译之前对CIL代码替换失败时,会对目标调用方法的目标CIL代码进行重定向,在重定向完成之后再次进行编译,保证应用在插桩失败之后继续运行,提高应用运行效率。
附图说明
[0018]图1为本申请第一实施例提供的代码重定向方法的基本流程示意图;
[0019]图2为本申请第二实施例提供的代码重定向方法的细化流程示意图;
[0020]图3为本申请第三实施例提供的代码重定向装置的程序模块示意图;
[0021]图4为本申请第四实施例提供的电子设备的结构示意图。
具体实施方式
[0022]为使得本申请的专利技术目的、特征、优点能够更加的明显和易懂,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而非全部实施例。基于本申请中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
[0023]为了解决相关技术中插桩失败导致应用报错终止运行的问题,本申请第一实施例提供了一种代码重定向方法。
[0024]如下为执行CIL代码替换的关键代码:
[0025]IL_0001:newobj instance void ConsoleAppCore.B::.ctor()
[0026]IL_0006:stloc.0
[0027]IL_0007:ldloc.0
[0028]IL_0008:ldarg.1
[0029]IL_0009:callvirt instance int32 ConsoleAppCore.B::MeyhodB(string)
[0030]IL_000e:stloc.1
[0031]如下为对方法进行重定向的关键代码:
[0032]IL_0001:ldarg.1
[0033]IL_0002:call int32 ConsoleAppCore.C::MethodC(string)
[0034]IL_0007:stloc.0
[0035]如图1为本实施例提供的代码重定向方法的基本流程图,该代码重定向方法包括以下的步骤:
[0036]步骤101、将针对初始方法的重定向需求所确定的重定向方法,编译成动态链接库文件。
[0037]具体的,传统插桩失败会导致整个程序无法运行,所以我们在插桩之前就要通过技术手段找到那些无法通过传统手段本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种代码重定向方法,其特征在于,包括:将针对初始方法的重定向需求所确定的重定向方法,编译成动态链接库文件;其中,所述重定向方法为用户自定义的包装方法;在JIT编译器对所述初始方法的CIL代码进行编译之前,采用程序集中待调用方法的CIL代码对所述初始方法的CIL代码进行匹配;其中,所述CIL代码包括:CIL操作码;若检测到与所述初始方法的CIL代码相匹配的目标调用方法的目标CIL代码,则采用所述目标CIL代码替换所述CIL代码;在替换过程中,若所述目标调用方法插桩失败,则调用所述动态链接库文件中的所述重定向方法,对所述初始方法进行重定向。2.根据权利要求1所述的代码重定向方法,其特征在于,所述将针对初始方法的重定向需求所确定的重定向方法,编译成动态链接库文件的步骤之前,还包括:对所述初始方法的CIL代码进行预处理,并根据预处理结果确定所述初始方法的重定向需求;根据所述重定向需求确定对应于所述初始方法的所述重定向方法。3.根据权利要求1所述的代码重定向方法,其特征在于,所述采用程序集中待调用方法的CIL代码对所述初始方法的CIL代码进行匹配的步骤,包括:基于CIL的运行机制获取所述初始方法的CIL代码;对所述初始方法的CIL代码进行分析;根据分析结果添加程序集引用;将所述初始方法的CIL代码与引用的程序集中待调用方法的CIL代码进行匹配。4.根据权利要求1所述的代码重定向方法,其特征在于,所述采用所述目标CIL代码替换所述CIL代码的步骤,包括:通过newobj操作码调用所述初始方法的构造函数,并返回一个目标调用方法的引用实例;通过stloc.0操作码将所述引用实例推入本地变量栈;其中,所述stloc.0操作码表示为stloc操作码的下标为0,所述下标对应的数据包括:本地变量、方法参数;通过ldloc.0操作码将下标为0的所述本地变量推出到求值栈,并通过ldloc.1操作码将下标为1的初始方法参数推入所述求值栈;通过callvirt操作码调用目标调用方法,将所述初始方法参数与所述目标调用方法参数进行替换,并通过stloc.1操作码将所述目标...

【专利技术属性】
技术研发人员:贾宏祥万振华王颉李华董燕
申请(专利权)人:深圳开源互联网安全技术有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1