一种程序处理方法、装置及设备制造方法及图纸

技术编号:24798941 阅读:30 留言:0更新日期:2020-07-07 20:57
本申请实施例公开了一种程序处理方法、装置及设备,用于在不需要子函数的原始代码的前提下实现主程序在运行过程中对子函数的处理。本申请实施例方法包括:获取主程序和目标函数,所述主程序包括子函数,所述目标函数用于在所述子函数被调用时对所述子函数进行处理;在所述主程序运行过程中,在所述子函数中插入所述目标函数;当所述子函数被调用时,执行所述目标函数和所述子函数。

【技术实现步骤摘要】
一种程序处理方法、装置及设备
本申请涉及计算机领域,尤其涉及一种程序处理方法、装置及设备。
技术介绍
在实际应用中,程序在运行时可能会出现一些问题,及时的对问题进行处理(例如对问题进行定位或修复)非常重要。而在一些环境下,例如电信行业,程序一旦被运行过程就不能被重新启动,所以如何在不中断程序运行的情况下实现对程序问题的处理,是目前程序研究的焦点。一个主程序往往包括一个或多个子函数,主程序出现问题的根本原因是子函数出现问题。在主程序运行过程中,通常采用在线补丁技术对子函数进行处理。在线补丁技术的原理是:为子函数编写一段补丁程序,补丁程序涵盖该子函数,该补丁程序的用途可以例如为在子函数执行的过程中对子函数进行监控,或者对子函数输出的结果进行修改等等;然后,在子函数被调用时,跳转执行该补丁程序,最终执行的是该补丁程序而不是子函数。虽然在线补丁技术能够实现在主程序运行过程中对子函数的处理,但是补丁程序的生成需要子函数的原始代码,如果没有原始代码,则无法生成该补丁程序,所以应用范围受限。
技术实现思路
本申请实施例提供了一种程序处理方法、装置及设备,用于在不需要子函数的原始代码的前提下实现主程序在运行过程中对子函数的处理。第一方面,本申请实施例提供了一种程序处理方法,该方法可以应用于用户设备或服务器等设备,其中,用户设备可以包括个人计算机(personalcomputer,PC)、手机、平板电脑等。该程序处理方法包括如下步骤:首先,获取主程序和目标函数,其中,一个主程序可以包括一个或多个子函数。一个子函数可以包括一条或多条指令,子函数是主程序运行的最小单元。目标函数是用于在子函数被调用过程中对子函数进行处理的程序,例如可以获取子函数的被调用时间、被调用次数或修改子函数的输出结果等。目标函数可以包括入口函数和/或出口函数。入口函数是指在子函数的入口处插入的程序,一般用于对子函数进行监控,例如获取子函数的被调用时间、被调用次数等。出口函数是指在子函数的出口处插入的程序,一般用于对子函数的输出结果进行修改。入口函数和出口函数可以单独使用,也可以结合使用,例如入口函数和出口函数结合使用可以获取子函数的执行时长。在主程序运行过程中,在子函数中插入目标函数。当子函数被调用时,执行目标函数和子函数。为了实现在主程序运行的过程中对子函数进行处理,本申请实施例在子函数中插入目标函数。与在线补丁技术不同的是,本申请实施例并不对子函数进行替换,而是在保留子函数的同时在子函数中插入目标函数。在执行的时候,目标函数和子函数都需要执行,而且通过执行目标函数,可以实现对子函数的处理。由于目标函数不涵盖子函数,所以编写目标函数时不需要子函数的原始代码,应用范围更加广泛。而且,若子函数有多个时,还可以批量在多个子函数中插入目标函数,效率较高。可选的,目标函数包括入口函数和/或出口函数;在子函数中插入目标函数包括:在子函数的入口插入入口函数,和/或,在子函数的出口插入出口函数。可选的,方法还包括:获取目标函数的地址;作为其中一种可能实现的方式,在子函数中插入目标函数可以通过如下方式实现:首先,申请第一内存区。其次,复制子函数,并将复制后的子函数存储在第一内存区中。最后,将子函数替换为第一指令集,第一指令集用于在子函数被调用时,根据第一内存区的地址执行复制后的子函数,以及根据目标函数的地址执行目标函数。在子函数被调用时,执行目标函数和子函数包括:在子函数被调用时,执行第一指令集。也就是说,当子函数被调用时,通过执行第一指令集来达到执行复制后的子函数和目标函数的目的。可选的,第一指令集可以包括第一跳转指令。第一指令集用于在子函数被调用时,根据第一内存区的地址执行复制后的子函数,以及根据目标函数的地址执行目标函数包括:第一跳转指令用于在子程序被调用时,跳转到第二内存区,第二内存区中存储有第二指令集和第三指令集;其中,第二指令集用于在第一跳转指令被触发之后,根据第一内存区的地址跳转到第一内存区,执行复制后的子程序;第三指令集用于在第一跳转指令被触发之后,根据目标程序的地址执行目标程序。可以理解的是,如果目标函数为入口函数,那么可以先执行第三指令集,后执行第二指令集。如果目标函数为出口函数,那么可以先执行第二指令集,后执行第三指令集。如果目标函数为入口函数和出口函数,那么第三指令集可以分为入口指令集和出口指令集,入口指令集用于在第一跳转指令被触发之后,根据入口函数的地址执行入口函数;出口指令集用于在第一跳转指令被触发之后,根据出口函数的地址执行出口函数。相应的,执行顺序为:先执行入口指令集,然后执行第二指令集,最后执行出口指令集。在实际应用中,可选的,方法还可以包括:预先建立索引号与目标函数的地址以及第一内存区的地址之间的映射关系。根据索引号可以找到对应的目标函数的地址和第一内存区的地址。第一指令集除了第一跳转指令以外,还可以包括存储指令,存储指令用于将索引号存储在寄存器或子函数的栈空间中。第二指令集包括第一查询指令和第二跳转指令,第一查询指令用于在第一跳转指令被触发之后根据寄存器或子函数的栈空间中的索引号和映射关系获取第一内存区的地址,第二跳转指令用于根据第一内存区的地址跳转到第一内存区。第三指令集包括第二查询指令和第三跳转指令,第二查询指令用于在第一跳转指令被触发之后根据寄存器或子函数的栈空间中的索引号和映射关系获取目标函数的地址,第三跳转指令用于根据目标程序的地址执行目标程序。当需要插入目标函数的子函数较多,且这些子函数插入相同的子函数时,利用索引号可以使得这些子函数共享第二内存区的第二指令集和第三指令集,减少存储空间。此外,为了节约存储空间,可选的,复制子函数,并将复制后的子函数存储在第一内存区中包括:复制子函数的前N条指令,并将复制后的前N条指令存储在第一内存区。也就是说,子函数的所有指令划分为两部分,一部分是前N条指令,存储在第一内存区中;另外一部分是其余的指令,存储在子函数原来的内存区。由于第一内存区存储的是复制后的前N条指令,而不是全部的子函数,所以节约了存储空间。在第一内存区仅存储了前N条指令的前提下,为了保证子函数的执行,可以在在第一内存区中生成第四跳转指令,第四跳转指令用于在复制后的前N条指令被执行之后,跳转到子函数的第N+1条指令,并从子函数的第N+1条指令开始执行,直到执行完成子函数的最后一条指令。将子函数替换为第一指令集包括:将子函数的前N条指令替换为第一指令集,N为大于或等于1的整数,前N条指令的长度大于或等于第一指令集的长度。在本申请实施例中,当不需要对子函数进行处理时,可以将插入子函数的目标函数撤除。具体的,可选的,在将子函数替换为第一指令集之前,方法还包括:获取子函数的起始地址。在将子函数替换为第一指令集之后,方法还包括:根据子函数的起始地址,将第一指令集替换为第一内存区中存储的复制后的子函数。第二方面,本申请实施例提供了一种程序处理装置,装置包括:函数获取单元,用于获取主程序和目标函数,主程序包括子函数,目标函数用于在子函数被调本文档来自技高网...

【技术保护点】
1.一种程序处理方法,其特征在于,所述方法包括:/n获取主程序和目标函数,所述主程序包括子函数,所述目标函数用于在所述子函数被调用时对所述子函数进行处理;/n在所述主程序运行过程中,在所述子函数中插入所述目标函数;/n当所述子函数被调用时,执行所述目标函数和所述子函数。/n

【技术特征摘要】
1.一种程序处理方法,其特征在于,所述方法包括:
获取主程序和目标函数,所述主程序包括子函数,所述目标函数用于在所述子函数被调用时对所述子函数进行处理;
在所述主程序运行过程中,在所述子函数中插入所述目标函数;
当所述子函数被调用时,执行所述目标函数和所述子函数。


2.根据权利要求1所述的方法,其特征在于,所述目标函数包括入口函数和/或出口函数;
所述在所述子函数中插入目标函数包括:
在所述子函数的入口插入所述入口函数,和/或,在所述子函数的出口插入所述出口函数。


3.根据权利要求1或2所述的方法,其特征在于,所述方法还包括:
获取所述目标函数的地址;
所述在所述子函数中插入所述目标函数包括:
申请第一内存区;
复制所述子函数,并将复制后的子函数存储在所述第一内存区中;
将所述子函数替换为第一指令集,所述第一指令集用于在所述子函数被调用时,根据所述第一内存区的地址执行所述复制后的子函数,以及根据所述目标函数的地址执行所述目标函数;
所述在所述子函数被调用时,执行所述目标函数和所述子函数包括:
在所述子函数被调用时,执行所述第一指令集。


4.根据权利要求3所述的方法,其特征在于,所述第一指令集包括第一跳转指令;所述第一指令集用于在所述子函数被调用时,根据所述第一内存区的地址执行所述复制后的子函数,以及根据所述目标函数的地址执行所述目标函数包括:
所述第一跳转指令用于在所述子程序被调用时,跳转到第二内存区,所述第二内存区中存储有第二指令集和第三指令集;其中,所述第二指令集用于在所述第一跳转指令被触发之后,根据所述第一内存区的地址跳转到所述第一内存区,执行所述复制后的子程序;所述第三指令集用于在所述第一跳转指令被触发之后,根据所述目标程序的地址执行所述目标程序。


5.根据权利要求4所述的方法,其特征在于,所述方法还包括:
预先建立索引号与所述目标函数的地址以及所述第一内存区的地址之间的映射关系;
所述第一指令集包括存储指令,所述存储指令用于将所述索引号存储在寄存器或所述子函数的栈空间中;
所述第二指令集包括第一查询指令和第二跳转指令,所述第一查询指令用于在所述第一跳转指令被触发之后根据寄存器或所述子函数的栈空间中的索引号和所述映射关系获取所述第一内存区的地址,所述第二跳转指令用于根据所述第一内存区的地址跳转到所述第一内存区;
所述第三指令集包括第二查询指令和第三跳转指令,所述第二查询指令用于在所述第一跳转指令被触发之后根据所述寄存器或所述子函数的栈空间中的索引号和所述映射关系获取所述目标函数的地址,所述第三跳转指令用于根据所述目标程序的地址执行所述目标程序。


6.根据权利要求3-5任一项所述的方法,其特征在于,所述复制所述子函数,并将复制后的子函数存储在所述第一内存区中包括:
复制所述子函数的前N条指令,并将复制后的所述前N条指令存储在所述第一内存区;
在所述第一内存区中生成第四跳转指令,所述第四跳转指令用于在所述复制后的所述前N条指令被执行之后,跳转到所述子函数的第N+1条指令,并从所述子函数的第N+1条指令开始执行,直到执行完成所述子函数的最后一条指令;
所述将所述子函数替换为第一指令集包括:
将所述子函数的前N条指令替换为第一指令集,所述N为大于或等于1的整数,所述前N条指令的长度大于或等于所述第一指令集的长度。


7.根据权利要求3-6任一项所述的方法,其特征在于,在将所述子函数替换为第一指令集之前,所述方法还包括:
获取所述子函数的起始地址;
在将所述子函数替换为第一指令集之后,所述方法还包括:
根据所述子函数的起始地址,将所述第一指令集替换为所述第一内存区中存储的所述复制后的子函数。


8.一种程序处理装置,其特征在于,所述装置包括:
函数获取单元,用于获取主程序和目标函数,所述主程序包括子函数,所述目标函数用于在所述子函数被调用时对所述子函数进行处理;<...

【专利技术属性】
技术研发人员:张建涛李章涛钟海峰桂蕾
申请(专利权)人:北京华为数字技术有限公司
类型:发明
国别省市:北京;11

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

1