CN111381905B - 一种程序处理方法、装置及设备 - Google Patents

一种程序处理方法、装置及设备 Download PDF

Info

Publication number
CN111381905B
CN111381905B CN201811612194.5A CN201811612194A CN111381905B CN 111381905 B CN111381905 B CN 111381905B CN 201811612194 A CN201811612194 A CN 201811612194A CN 111381905 B CN111381905 B CN 111381905B
Authority
CN
China
Prior art keywords
function
sub
instruction
address
memory area
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.)
Active
Application number
CN201811612194.5A
Other languages
English (en)
Other versions
CN111381905A (zh
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 Huawei Digital Technologies Co Ltd
Original Assignee
Beijing Huawei Digital Technologies 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 Huawei Digital Technologies Co Ltd filed Critical Beijing Huawei Digital Technologies Co Ltd
Priority to CN201811612194.5A priority Critical patent/CN111381905B/zh
Publication of CN111381905A publication Critical patent/CN111381905A/zh
Application granted granted Critical
Publication of CN111381905B publication Critical patent/CN111381905B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4482Procedural
    • G06F9/4484Executing subprograms
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/60Software deployment
    • G06F8/65Updates
    • G06F8/658Incremental updates; Differential updates
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Security & Cryptography (AREA)
  • Stored Programmes (AREA)

Abstract

本申请实施例公开了一种程序处理方法、装置及设备,用于在不需要子函数的原始代码的前提下实现主程序在运行过程中对子函数的处理。本申请实施例方法包括:获取主程序和目标函数,所述主程序包括子函数,所述目标函数用于在所述子函数被调用时对所述子函数进行处理;在所述主程序运行过程中,在所述子函数中插入所述目标函数;当所述子函数被调用时,执行所述目标函数和所述子函数。

Description

一种程序处理方法、装置及设备
技术领域
本申请涉及计算机领域,尤其涉及一种程序处理方法、装置及设备。
背景技术
在实际应用中,程序在运行时可能会出现一些问题,及时的对问题进行处理(例如对问题进行定位或修复)非常重要。而在一些环境下,例如电信行业,程序一旦被运行过程就不能被重新启动,所以如何在不中断程序运行的情况下实现对程序问题的处理,是目前程序研究的焦点。
一个主程序往往包括一个或多个子函数,主程序出现问题的根本原因是子函数出现问题。在主程序运行过程中,通常采用在线补丁技术对子函数进行处理。在线补丁技术的原理是:为子函数编写一段补丁程序,补丁程序涵盖该子函数,该补丁程序的用途可以例如为在子函数执行的过程中对子函数进行监控,或者对子函数输出的结果进行修改等等;然后,在子函数被调用时,跳转执行该补丁程序,最终执行的是该补丁程序而不是子函数。
虽然在线补丁技术能够实现在主程序运行过程中对子函数的处理,但是补丁程序的生成需要子函数的原始代码,如果没有原始代码,则无法生成该补丁程序,所以应用范围受限。
发明内容
本申请实施例提供了一种程序处理方法、装置及设备,用于在不需要子函数的原始代码的前提下实现主程序在运行过程中对子函数的处理。
第一方面,本申请实施例提供了一种程序处理方法,该方法可以应用于用户设备或服务器等设备,其中,用户设备可以包括个人计算机(personal computer,PC)、手机、平板电脑等。该程序处理方法包括如下步骤:首先,获取主程序和目标函数,其中,一个主程序可以包括一个或多个子函数。一个子函数可以包括一条或多条指令,子函数是主程序运行的最小单元。目标函数是用于在子函数被调用过程中对子函数进行处理的程序,例如可以获取子函数的被调用时间、被调用次数或修改子函数的输出结果等。目标函数可以包括入口函数和/或出口函数。入口函数是指在子函数的入口处插入的程序,一般用于对子函数进行监控,例如获取子函数的被调用时间、被调用次数等。出口函数是指在子函数的出口处插入的程序,一般用于对子函数的输出结果进行修改。入口函数和出口函数可以单独使用,也可以结合使用,例如入口函数和出口函数结合使用可以获取子函数的执行时长。在主程序运行过程中,在子函数中插入目标函数。当子函数被调用时,执行目标函数和子函数。为了实现在主程序运行的过程中对子函数进行处理,本申请实施例在子函数中插入目标函数。与在线补丁技术不同的是,本申请实施例并不对子函数进行替换,而是在保留子函数的同时在子函数中插入目标函数。在执行的时候,目标函数和子函数都需要执行,而且通过执行目标函数,可以实现对子函数的处理。由于目标函数不涵盖子函数,所以编写目标函数时不需要子函数的原始代码,应用范围更加广泛。而且,若子函数有多个时,还可以批量在多个子函数中插入目标函数,效率较高。
可选的,目标函数包括入口函数和/或出口函数;
在子函数中插入目标函数包括:在子函数的入口插入入口函数,和/或,在子函数的出口插入出口函数。
可选的,方法还包括:获取目标函数的地址;
作为其中一种可能实现的方式,在子函数中插入目标函数可以通过如下方式实现:首先,申请第一内存区。其次,复制子函数,并将复制后的子函数存储在第一内存区中。最后,将子函数替换为第一指令集,第一指令集用于在子函数被调用时,根据第一内存区的地址执行复制后的子函数,以及根据目标函数的地址执行目标函数。在子函数被调用时,执行目标函数和子函数包括:在子函数被调用时,执行第一指令集。也就是说,当子函数被调用时,通过执行第一指令集来达到执行复制后的子函数和目标函数的目的。
可选的,第一指令集可以包括第一跳转指令。第一指令集用于在子函数被调用时,根据第一内存区的地址执行复制后的子函数,以及根据目标函数的地址执行目标函数包括:第一跳转指令用于在子程序被调用时,跳转到第二内存区,第二内存区中存储有第二指令集和第三指令集;其中,第二指令集用于在第一跳转指令被触发之后,根据第一内存区的地址跳转到第一内存区,执行复制后的子程序;第三指令集用于在第一跳转指令被触发之后,根据目标程序的地址执行目标程序。
可以理解的是,如果目标函数为入口函数,那么可以先执行第三指令集,后执行第二指令集。如果目标函数为出口函数,那么可以先执行第二指令集,后执行第三指令集。如果目标函数为入口函数和出口函数,那么第三指令集可以分为入口指令集和出口指令集,入口指令集用于在第一跳转指令被触发之后,根据入口函数的地址执行入口函数;出口指令集用于在第一跳转指令被触发之后,根据出口函数的地址执行出口函数。相应的,执行顺序为:先执行入口指令集,然后执行第二指令集,最后执行出口指令集。
在实际应用中,可选的,方法还可以包括:预先建立索引号与目标函数的地址以及第一内存区的地址之间的映射关系。根据索引号可以找到对应的目标函数的地址和第一内存区的地址。
第一指令集除了第一跳转指令以外,还可以包括存储指令,存储指令用于将索引号存储在寄存器或子函数的栈空间中。第二指令集包括第一查询指令和第二跳转指令,第一查询指令用于在第一跳转指令被触发之后根据寄存器或子函数的栈空间中的索引号和映射关系获取第一内存区的地址,第二跳转指令用于根据第一内存区的地址跳转到第一内存区。第三指令集包括第二查询指令和第三跳转指令,第二查询指令用于在第一跳转指令被触发之后根据寄存器或子函数的栈空间中的索引号和映射关系获取目标函数的地址,第三跳转指令用于根据目标程序的地址执行目标程序。当需要插入目标函数的子函数较多,且这些子函数插入相同的子函数时,利用索引号可以使得这些子函数共享第二内存区的第二指令集和第三指令集,减少存储空间。
此外,为了节约存储空间,可选的,复制子函数,并将复制后的子函数存储在第一内存区中包括:复制子函数的前N条指令,并将复制后的前N条指令存储在第一内存区。也就是说,子函数的所有指令划分为两部分,一部分是前N条指令,存储在第一内存区中;另外一部分是其余的指令,存储在子函数原来的内存区。由于第一内存区存储的是复制后的前N条指令,而不是全部的子函数,所以节约了存储空间。
在第一内存区仅存储了前N条指令的前提下,为了保证子函数的执行,可以在在第一内存区中生成第四跳转指令,第四跳转指令用于在复制后的前N条指令被执行之后,跳转到子函数的第N+1条指令,并从子函数的第N+1条指令开始执行,直到执行完成子函数的最后一条指令。将子函数替换为第一指令集包括:将子函数的前N条指令替换为第一指令集,N为大于或等于1的整数,前N条指令的长度大于或等于第一指令集的长度。
在本申请实施例中,当不需要对子函数进行处理时,可以将插入子函数的目标函数撤除。具体的,可选的,在将子函数替换为第一指令集之前,方法还包括:获取子函数的起始地址。在将子函数替换为第一指令集之后,方法还包括:根据子函数的起始地址,将第一指令集替换为第一内存区中存储的复制后的子函数。
第二方面,本申请实施例提供了一种程序处理装置,装置包括:函数获取单元,用于获取主程序和目标函数,主程序包括子函数,目标函数用于在子函数被调用时对子函数进行处理;函数插入单元,用于在主程序运行过程中,在子函数中插入目标函数;函数执行单元,用于当子函数被调用时,执行目标函数和子函数。
可选的,目标函数包括入口函数和/或出口函数;
在子函数中插入目标函数包括:在子函数的入口插入入口函数,和/或,在子函数的出口插入出口函数。
可选的,装置还包括:第一地址获取单元,用于获取目标函数的地址;
函数插入单元,用于申请第一内存区;复制子函数,并将复制后的子函数存储在第一内存区中;将子函数替换为第一指令集,第一指令集用于在子函数被调用时,根据第一内存区的地址执行复制后的子函数,以及根据目标函数的地址执行目标函数;
函数执行单元,用于在子函数被调用时,执行第一指令集。
可选的,第一指令集包括第一跳转指令;第一指令集用于在子函数被调用时,根据第一内存区的地址执行复制后的子函数,以及根据目标函数的地址执行目标函数包括:第一跳转指令用于在子程序被调用时,跳转到第二内存区,第二内存区中存储有第二指令集和第三指令集;其中,第二指令集用于在第一跳转指令被触发之后,根据第一内存区的地址跳转到第一内存区,执行复制后的子程序;第三指令集用于在第一跳转指令被触发之后,根据目标程序的地址执行目标程序。
可选的,装置还包括:关系建立单元,用于预先建立索引号与目标函数的地址以及第一内存区的地址之间的映射关系;
第一指令集包括存储指令,存储指令用于将索引号存储在寄存器或子函数的栈空间中;
第二指令集包括第一查询指令和第二跳转指令,第一查询指令用于在第一跳转指令被触发之后根据寄存器或子函数的栈空间中的索引号和映射关系获取第一内存区的地址,第二跳转指令用于根据第一内存区的地址跳转到第一内存区;
第三指令集包括第二查询指令和第三跳转指令,第二查询指令用于在第一跳转指令被触发之后根据寄存器或所述子函数的栈空间中的索引号和映射关系获取目标函数的地址,第三跳转指令用于根据目标程序的地址执行目标程序。
可选的,复制子函数,并将复制后的子函数存储在第一内存区中包括:复制子函数的前N条指令,并将复制后的前N条指令存储在第一内存区;在第一内存区中生成第四跳转指令,第四跳转指令用于在复制后的前N条指令被执行之后,跳转到子函数的第N+1条指令,并从子函数的第N+1条指令开始执行,直到执行完成子函数的最后一条指令;
将子函数替换为第一指令集包括:将子函数的前N条指令替换为第一指令集,N为大于或等于1的整数,前N条指令的长度大于或等于第一指令集的长度。
可选的,装置还包括:第二地址获取单元,用于在将子函数替换为第一指令集之前获取子函数的起始地址;指令替换单元,用于在将子函数替换为第一指令集之后,根据子函数的起始地址,将第一指令集替换为第一内存区中存储的复制后的子函数。
第三方面,本申请实施例还提供了一种程序处理设备,包括存储单元和处理单元;
存储单元,用于存储指令;处理单元,用于执行存储器中的指令,执行上述程序处理方法。
第四方面,本申请实施例还提供了一种计算机可读存储介质,包括指令,当其在计算机上运行时,使得计算机执行上述程序处理方法。
附图说明
图1为本申请实施例提供的一种程序处理方法的流程图;
图2为本申请实施例提供的一种程序处理方法的另一个流程图;
图3为本申请实施例提供的一种程序处理装置的结构框图;
图4为本申请实施例提供的一种程序处理设备的硬件架构图。
具体实施方式
本申请实施例提供了一种程序处理方法、装置及设备,能够在不需要子函数的原始代码的情况下,也能够实现在主程序运行过程中对子函数进行处理的目的。
下面结合附图详细介绍本申请实施例提供的技术方案。
参见图1,该图为本申请实施例提供的程序处理方法的流程图。
本申请实施例提供的程序处理方法可以应用于用户设备或服务器等设备,其中,用户设备可以包括个人计算机(personal computer,PC)、手机、平板电脑等。
该程序处理方法具体包括如下步骤:
S101:获取主程序和目标函数。
在本申请实施例中,一个主程序可以包括一个或多个子函数。一个子函数可以包括一条或多条指令,子函数是主程序运行的最小单元。
目标函数是用于在子函数被调用过程中对子函数进行处理的程序,例如可以获取子函数的被调用时间、被调用次数或修改子函数的输出结果等。目标函数可以包括入口函数和/或出口函数。入口函数是指在子函数的入口处插入的程序,一般用于对子函数进行监控,例如获取子函数的被调用时间、被调用次数等。出口函数是指在子函数的出口处插入的程序,一般用于对子函数的输出结果进行修改。入口函数和出口函数可以单独使用,也可以结合使用,例如入口函数和出口函数结合使用可以获取子函数的执行时长。
在本申请实施例中,入口函数的数目可以是一个或多个,出口函数的数目也可以是一个或多个。
S102:在主程序运行过程中,在子函数中插入目标函数。
S103:当子函数被调用时,执行目标函数和子函数。
为了实现在主程序运行的过程中对子函数进行处理,本申请实施例在子函数中插入目标函数。与在线补丁技术不同的是,本申请实施例并不对子函数进行替换,而是在保留子函数的同时在子函数中插入目标函数。在执行的时候,目标函数和子函数都需要执行,而且通过执行目标函数,可以实现对子函数的处理。由于目标函数不涵盖子函数,所以编写目标函数时不需要子函数的原始代码,应用范围更加广泛。而且,若子函数有多个时,还可以批量在多个子函数中插入目标函数,效率较高。
作为其中一种可能实现的方式,在子函数中插入目标函数可以通过如下方式实现:首先,申请第一内存区。其次,复制子函数,并将复制后的子函数存储在第一内存区中。最后,将子函数替换为第一指令集,第一指令集用于在子函数被调用时,根据第一内存区的地址执行复制后的子函数,以及根据目标函数的地址执行目标函数。也就是说,当子函数被调用时,通过执行第一指令集来达到执行复制后的子函数和目标函数的目的。
其中,可选的,第一指令集可以包括第一跳转(jump)指令,该第一跳转指令中包括第二内存区的地址,用于根据第二内存区的地址跳转到第二内存区。第二内存区可以存储第二指令集和第三指令集,第二指令集用于在第一跳转指令被触发之后,根据第一内存区的地址跳转到第一内存区,执行复制后的子函数。第三指令集用于在第一指令集被触发之后,根据目标函数的地址执行目标函数。目标函数的地址可以是第二内存区的地址,也可以是其他内存区的地址。但是目标函数的地址不是第一内存区的地址,这样能够保证目标函数和子函数都能被执行。
可以理解的是,如果目标函数为入口函数,那么可以先执行第三指令集,后执行第二指令集。如果目标函数为出口函数,那么可以先执行第二指令集,后执行第三指令集。如果目标函数为入口函数和出口函数,那么第三指令集可以分为入口指令集和出口指令集,入口指令集用于在第一跳转指令被触发之后,根据入口函数的地址执行入口函数;出口指令集用于在第一跳转指令被触发之后,根据出口函数的地址执行出口函数。相应的,执行顺序为:先执行入口指令集,然后执行第二指令集,最后执行出口指令集。
在实际应用中,可选的,可以预先建立索引号与目标函数的地址以及第一内存区的地址之间的映射关系,该映射关系可以存储在数据结构中。根据索引号可以找到对应的目标函数的地址和第一内存区的地址。在第一指令集被执行时,可以根据索引号获取第一内存区的地址和目标函数的地址,并根据第一内存区的地址执行复制后的子函数,以及根据目标函数的地址执行目标函数。
在具体实现时,第一指令集除了第一跳转指令以外,还可以包括存储指令,该存储指令用于将索引号存储在寄存器或子函数的栈空间中。在执行第一指令集时先执行存储指令,然后执行第一跳转指令。当执行第二指令集和第三指令集时,从子函数的栈空间或者寄存器中获取索引号,并根据索引号以及上述映射关系找到对应的目标函数的地址和第一内存区的地址。
具体的,第二指令集包括第一查询指令和第二跳转指令,第一查询指令用于在第一跳转指令被触发之后根据寄存器或所述子函数的栈空间中的索引号和上述映射关系获取第一内存区的地址,第二跳转指令用于根据第一内存区的地址跳转到第一内存区。
第三指令集包括第二查询指令和第三跳转指令,第二查询指令用于在第一跳转指令被触发之后根据寄存器或所述子函数的栈空间中的索引号和上述映射关系获取目标函数的地址,第三跳转指令用于根据目标程序的地址执行目标程序。
当需要插入目标函数的子函数较多,且这些子函数插入相同的子函数时,利用索引号可以使得这些子函数共享第二内存区的第二指令集和第三指令集,减少存储空间。
此外,在对子函数进行复制时,为了节约存储空间,可以仅对子函数的前N条指令进行复制并存储,但需要保证前N条指令的长度大于或等于第一指令集的长度,N为大于或等于1的整数。需要说明的是,前N条指令中的每条指令都是完整的、没有被截断的指令,以保证能够被执行。在进行指令替换时,可以将子函数的前N条指令替换为第一指令集。也就是说,子函数的所有指令划分为两部分,一部分是前N条指令,存储在第一内存区中;另外一部分是其余的指令,存储在子函数原来的内存区。由于第一内存区存储的是复制后的前N条指令,而不是全部的子函数,所以节约了存储空间。
在第一内存区仅存储了前N条指令的前提下,为了保证子函数的执行,可以在第一内存区中生成第四跳转指令,第四跳转指令用于在复制后的前N条指令被执行之后,跳转到子函数的第N+1条指令,并从子函数的第N+1条指令开始执行,直到执行完成子函数的最后一条指令。所以,第一内存区的长度大于或等于前N条指令的长度与第四跳转指令的长度之和。
例如,子函数一共有10条指令,根据第一指令集的长度可以确定出仅需要复制并存储前4条指令即可。所以可以将该子函数的前4条指令进行复制,并存储到第一内存区,然后在第一内存区中生成第四跳转指令,第四跳转指令中包括子函数的第5条指令的地址。第四跳转指令可以根据子函数的第5条指令的地址跳转到子函数的第5条指令。所以,在该子函数被调用时,先执行第一内存区的前4条指令,然后根据第5条指令的地址跳转到子函数的第5条指令,并执行第5条指令以及后续的指令,直到执行完第10条指令,完成对子函数的执行。
需要说明的是,在一些应用场景中,每条指令的长度是固定的,所以,只需要根据第一指令集包括的指令的个数决定需要替换的子函数的前N条指令中N的值。若第一指令集包括一条指令,即第一跳转指令,则可以知晓N的值为1;若第一指令集包括两条指令,即第一跳转指令和存储指令,则可以知晓N的值为2。
但是在另外一些应用场景中,不同的指令其长度不同,所以需要根据第一指令集的具体长度来确定N的值。在确定N的值时,可以对子函数进行反汇编,得到子函数的各个指令,每个指令都包括操作符和操作数。根据操作符的类型可以确定出子函数中对应指令的长度,进而确定N的值。例如,子函数的第一条指令在反汇编之后对应的操作符为push,该类型的操作符对应的指令长度为4bit;子函数的第二条指令在反汇编之后对应的操作符为mov,该类型的操作符对应的指令长度为8bit。假设第一指令集的长度为10bit,那么需要替换子函数的第一条指令和第二条指令。
需要注意的是,反汇编的过程并不需要子函数的原始代码。
在本申请实施例中,当不需要对子函数进行处理时,可以将插入子函数的目标函数撤除。具体的,可以在将子函数替换为第一指令集之前,获取子函数的起始地址。当子函数被替换为第一指令集之后,根据子函数的起始地址,将第一指令集替换为第一内存区中存储的复制后的子函数,以对子函数进行恢复。
在实际应用中,还可以建立索引号与子函数起始地址之间的映射关系,在对子函数进行恢复时,可以根据索引号获取子函数的起始地址。
下面以一个应用场景为例介绍本申请实施例提供的程序处理方法。
参见图2,本申请实施例提供的程序处理方法可以包括如下步骤:
S201:获取主程序M、入口函数Function C和出口函数Function D。主程序M包括子函数Function A。
S202:申请第一内存区,第一内存区的长度为三条指令的长度。将子函数FunctionA的前两条指令存入第一内存区,并在第一内存区构建跳转指令5,跳转指令5用于在执行完第一内存区的前两条指令后,跳转到子函数Function A的第3条指令继续执行。
S203:在数据结构中构建如表1的映射关系。
表1
在本申请实施例中,每个子函数可以对应一个索引号,不同的子函数对应不同的索引号。例如子函数Function A对应的索引号为1,子函数Function B对应的索引号为2。不同的子函数对应的入口函数C的地址可以相同,也可以不同;对应的出口函数Function D的地址可以相同,也可以不同。
S204:生成指令集1。
指令集1包括存储指令和跳转指令1,存储指令用于将索引号存储在子函数的栈空间或者寄存器中。跳转指令1用于在子函数Function A被调用时,跳转到第二内存区。
第二内存区中存储有指令集2、指令集3和指令集4。指令集2包括查询指令1和跳转指令2,查询指令1用于根据索引号查询入口函数Function C的地址Address 1,跳转指令2用于根据Address 1跳转执行入口函数Function C。指令集3包括查询指令2和跳转指令3,查询指令2用于根据索引号查询第一内存区的地址Address 3,跳转指令3用于根据Address3跳转到第一内存区执行子函数Function A复制后的前2条指令。指令集4包括查询指令3和跳转指令4,查询指令3用于根据索引号查询出口函数Function D的地址Address 2,跳转指令4用于根据Address 2跳转执行出口函数。
S205:将子函数Function A的前两条指令替换为指令集1。
S206:令第二内存区运行环境与子函数Function A的运行环境保持一致。
运行环境可以包括寄存器空间和栈空间。
S207:在子函数Function A被调用时,执行指令集1,实现先后执行入口函数Function C、子函数Function A和出口函数Function D的目的。
S208:根据索引号查找子函数Function A的起始地址Address 4,根据Address 4将第一内存区中子函数Function A的前两条指令替换指令集1,实现对子函数Function A的恢复。
需要说明的是,上述步骤并不构成对本申请技术方案的限定,例如S206可以不在S205之后执行,而是在S204之后执行,等等。
相应的,参见图3,本申请实施例还提供了一种程序处理装置,该装置可以实现图1所示实施例中的功能。该装置包括:函数获取单元301、函数插入单元302和函数执行单元303。其中,函数获取单元301用于执行图1所示实施例中的S101;函数插入单元302用于执行图1所示实施例中的S102;函数执行单元303用于执行图1所示实施例中的S103。具体的,
函数获取单元301,用于获取主程序和目标函数,主程序包括子函数,目标函数用于在子函数被调用时对子函数进行处理;
函数插入单元302,用于在主程序运行过程中,在子函数中插入目标函数;
函数执行单元303,用于当子函数被调用时,执行目标函数和子函数。
可选的,目标函数包括入口函数和/或出口函数;
在子函数中插入目标函数包括:在子函数的入口插入入口函数,和/或,在子函数的出口插入出口函数。
可选的,装置还包括:第一地址获取单元,用于获取目标函数的地址;
函数插入单元,用于申请第一内存区;复制子函数,并将复制后的子函数存储在第一内存区中;将子函数替换为第一指令集,第一指令集用于在子函数被调用时,根据第一内存区的地址执行复制后的子函数,以及根据目标函数的地址执行目标函数;
函数执行单元,用于在子函数被调用时,执行第一指令集。
可选的,第一指令集包括第一跳转指令;第一指令集用于在子函数被调用时,根据第一内存区的地址执行复制后的子函数,以及根据目标函数的地址执行目标函数包括:第一跳转指令用于在子程序被调用时,跳转到第二内存区,第二内存区中存储有第二指令集和第三指令集;其中,第二指令集用于在第一跳转指令被触发之后,根据第一内存区的地址跳转到第一内存区,执行复制后的子程序;第三指令集用于在第一跳转指令被触发之后,根据目标程序的地址执行目标程序。
可选的,装置还包括:关系建立单元,用于预先建立索引号与目标函数的地址以及第一内存区的地址之间的映射关系;
第一指令集包括存储指令,存储指令用于将索引号存储在寄存器或子函数的栈空间中;
第二指令集包括第一查询指令和第二跳转指令,第一查询指令用于在第一跳转指令被触发之后根据寄存器或子函数的栈空间中的索引号和映射关系获取第一内存区的地址,第二跳转指令用于根据第一内存区的地址跳转到第一内存区;
第三指令集包括第二查询指令和第三跳转指令,第二查询指令用于在第一跳转指令被触发之后根据寄存器或所述子函数的栈空间中的索引号和映射关系获取目标函数的地址,第三跳转指令用于根据目标程序的地址执行目标程序。
可选的,复制子函数,并将复制后的子函数存储在第一内存区中包括:复制子函数的前N条指令,并将复制后的前N条指令存储在第一内存区;在第一内存区中生成第四跳转指令,第四跳转指令用于在复制后的前N条指令被执行之后,跳转到子函数的第N+1条指令,并从子函数的第N+1条指令开始执行,直到执行完成子函数的最后一条指令;
将子函数替换为第一指令集包括:将子函数的前N条指令替换为第一指令集,N为大于或等于1的整数,前N条指令的长度大于或等于第一指令集的长度。
可选的,装置还包括:第二地址获取单元,用于在将子函数替换为第一指令集之前获取子函数的起始地址;指令替换单元,用于在将子函数替换为第一指令集之后,根据子函数的起始地址,将第一指令集替换为第一内存区中存储的复制后的子函数。
参见图4,本申请实施例还提供了一种程序处理设备400,包括存储单元401和处理单元402;
存储单元401,用于存储指令;
处理单元402,用于执行存储器中的指令,执行图1所示实施例的程序处理方法。
存储单元401和处理单元402通过总线403相互连接;总线403可以是外设部件互连标准(peripheral component interconnect,简称PCI)总线或扩展工业标准结构(extended industry standard architecture,简称EISA)总线等。总线可以分为地址总线、数据总线、控制总线等。为便于表示,图4中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
上述存储单元401可以是随机存取存储器(random-access memory,RAM)、闪存(flash)、只读存储器(read only memory,ROM)、可擦写可编程只读存储器(erasableprogrammable read only memory,EPROM)、电可擦除可编程只读存储器(electricallyerasable programmable read only memory,EEPROM)、寄存器(register)、硬盘、移动硬盘、CD-ROM或者本领域技术人员知晓的任何其他形式的存储介质。
上述处理单元402例如可以是中央处理器(central processing unit,CPU)、通用处理器、数字信号处理器(digital signal processor,DSP)、专用集成电路(application-specific integrated circuit,ASIC)、现场可编程门阵列(field programmable gatearray,FPGA)或者其他可编程逻辑器件、晶体管逻辑器件、硬件部件或者其任意组合。其可以实现或执行结合本申请公开内容所描述的各种示例性的逻辑方框,模块和电路。处理器也可以是实现计算功能的组合,例如包含一个或多个微处理器组合,DSP和微处理器的组合等等。
本申请实施例还提供了一种计算机可读存储介质,包括指令,当其在计算机上运行时,使得计算机执行上述程序处理方法。
本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
本领域技术人员应该可以意识到,在上述一个或多个示例中,本发明所描述的功能可以用硬件、软件、固件或它们的任意组合来实现。当使用软件实现时,可以将这些功能存储在计算机可读介质中或者作为计算机可读介质上的一个或多个指令或代码进行传输。计算机可读介质包括计算机存储介质和通信介质,其中通信介质包括便于从一个地方向另一个地方传送计算机程序的任何介质。存储介质可以是通用或专用计算机能够存取的任何可用介质。
以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已。
以上所述,以上实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的范围。

Claims (14)

1.一种程序处理方法,其特征在于,所述方法包括:
获取主程序和目标函数,所述主程序包括子函数,所述目标函数用于在所述子函数被调用时对所述子函数进行处理;
在所述主程序运行过程中,在所述子函数中插入所述目标函数;
当所述子函数被调用时,执行所述目标函数和所述子函数;
所述方法还包括:
获取所述目标函数的地址;
所述在所述子函数中插入所述目标函数包括:
申请第一内存区;
复制所述子函数,并将复制后的子函数存储在所述第一内存区中;
将所述子函数替换为第一指令集,所述第一指令集用于在所述子函数被调用时,根据所述第一内存区的地址执行所述复制后的子函数,以及根据所述目标函数的地址执行所述目标函数;
所述在所述子函数被调用时,执行所述目标函数和所述子函数包括:
在所述子函数被调用时,执行所述第一指令集。
2.根据权利要求1所述的方法,其特征在于,所述目标函数包括入口函数和/或出口函数;
所述在所述子函数中插入目标函数包括:
在所述子函数的入口插入所述入口函数,和/或,在所述子函数的出口插入所述出口函数。
3.根据权利要求1所述的方法,其特征在于,所述第一指令集包括第一跳转指令;所述第一指令集用于在所述子函数被调用时,根据所述第一内存区的地址执行所述复制后的子函数,以及根据所述目标函数的地址执行所述目标函数包括:
所述第一跳转指令用于在所述子函数被调用时,跳转到第二内存区,所述第二内存区中存储有第二指令集和第三指令集;其中,所述第二指令集用于在所述第一跳转指令被触发之后,根据所述第一内存区的地址跳转到所述第一内存区,执行所述复制后的子函数;所述第三指令集用于在所述第一跳转指令被触发之后,根据所述目标函数的地址执行所述目标函数。
4.根据权利要求3所述的方法,其特征在于,所述方法还包括:
预先建立索引号与所述目标函数的地址以及所述第一内存区的地址之间的映射关系;
所述第一指令集包括存储指令,所述存储指令用于将所述索引号存储在寄存器或所述子函数的栈空间中;
所述第二指令集包括第一查询指令和第二跳转指令,所述第一查询指令用于在所述第一跳转指令被触发之后根据寄存器或所述子函数的栈空间中的索引号和所述映射关系获取所述第一内存区的地址,所述第二跳转指令用于根据所述第一内存区的地址跳转到所述第一内存区;
所述第三指令集包括第二查询指令和第三跳转指令,所述第二查询指令用于在所述第一跳转指令被触发之后根据所述寄存器或所述子函数的栈空间中的索引号和所述映射关系获取所述目标函数的地址,所述第三跳转指令用于根据所述目标函数的地址执行所述目标函数。
5.根据权利要求1所述的方法,其特征在于,所述复制所述子函数,并将复制后的子函数存储在所述第一内存区中包括:
复制所述子函数的前N条指令,并将复制后的所述前N条指令存储在所述第一内存区;
在所述第一内存区中生成第四跳转指令,所述第四跳转指令用于在所述复制后的所述前N条指令被执行之后,跳转到所述子函数的第N+1条指令,并从所述子函数的第N+1条指令开始执行,直到执行完成所述子函数的最后一条指令;
所述将所述子函数替换为第一指令集包括:
将所述子函数的前N条指令替换为第一指令集,所述N为大于或等于1的整数,所述前N条指令的长度大于或等于所述第一指令集的长度。
6.根据权利要求1所述的方法,其特征在于,在将所述子函数替换为第一指令集之前,所述方法还包括:
获取所述子函数的起始地址;
在将所述子函数替换为第一指令集之后,所述方法还包括:
根据所述子函数的起始地址,将所述第一指令集替换为所述第一内存区中存储的所述复制后的子函数。
7.一种程序处理装置,其特征在于,所述装置包括:
函数获取单元,用于获取主程序和目标函数,所述主程序包括子函数,所述目标函数用于在所述子函数被调用时对所述子函数进行处理;
函数插入单元,用于在所述主程序运行过程中,在所述子函数中插入所述目标函数;
函数执行单元,用于当所述子函数被调用时,执行所述目标函数和所述子函数;
所述装置还包括:
第一地址获取单元,用于获取所述目标函数的地址;
所述函数插入单元,用于申请第一内存区;复制所述子函数,并将复制后的子函数存储在所述第一内存区中;将所述子函数替换为第一指令集,所述第一指令集用于在所述子函数被调用时,根据所述第一内存区的地址执行所述复制后的子函数,以及根据所述目标函数的地址执行所述目标函数;
所述函数执行单元,用于在所述子函数被调用时,执行所述第一指令集。
8.根据权利要求7所述的装置,其特征在于,所述目标函数包括入口函数和/或出口函数;
所述在所述子函数中插入目标函数包括:
在所述子函数的入口插入所述入口函数,和/或,在所述子函数的出口插入所述出口函数。
9.根据权利要求7所述的装置,其特征在于,所述第一指令集包括第一跳转指令;所述第一指令集用于在所述子函数被调用时,根据所述第一内存区的地址执行所述复制后的子函数,以及根据所述目标函数的地址执行所述目标函数包括:
所述第一跳转指令用于在所述子函数被调用时,跳转到第二内存区,所述第二内存区中存储有第二指令集和第三指令集;其中,所述第二指令集用于在所述第一跳转指令被触发之后,根据所述第一内存区的地址跳转到所述第一内存区,执行所述复制后的子函数;所述第三指令集用于在所述第一跳转指令被触发之后,根据所述目标函数的地址执行所述目标函数。
10.根据权利要求9所述的装置,其特征在于,所述装置还包括:
关系建立单元,用于预先建立索引号与所述目标函数的地址以及所述第一内存区的地址之间的映射关系;
所述第一指令集包括存储指令,所述存储指令用于将所述索引号存储在寄存器或所述子函数的栈空间中;
所述第二指令集包括第一查询指令和第二跳转指令,所述第一查询指令用于在所述第一跳转指令被触发之后根据寄存器或所述子函数的栈空间中的索引号和所述映射关系获取所述第一内存区的地址,所述第二跳转指令用于根据所述第一内存区的地址跳转到所述第一内存区;
所述第三指令集包括第二查询指令和第三跳转指令,所述第二查询指令用于在所述第一跳转指令被触发之后根据所述寄存器或所述子函数的栈空间中的索引号和所述映射关系获取所述目标函数的地址,所述第三跳转指令用于根据所述目标函数的地址执行所述目标函数。
11.根据权利要求7所述的装置,其特征在于,所述复制所述子函数,并将复制后的子函数存储在所述第一内存区中包括:
复制所述子函数的前N条指令,并将复制后的所述前N条指令存储在所述第一内存区;在所述第一内存区中生成第四跳转指令,所述第四跳转指令用于在所述复制后的所述前N条指令被执行之后,跳转到所述子函数的第N+1条指令,并从所述子函数的第N+1条指令开始执行,直到执行完成所述子函数的最后一条指令;
所述将所述子函数替换为第一指令集包括:将所述子函数的前N条指令替换为第一指令集,所述N为大于或等于1的整数,所述前N条指令的长度大于或等于所述第一指令集的长度。
12.根据权利要求7所述的装置,其特征在于,所述装置还包括:
第二地址获取单元,用于在将所述子函数替换为第一指令集之前获取所述子函数的起始地址;
指令替换单元,用于在将所述子函数替换为第一指令集之后,根据所述子函数的起始地址,将所述第一指令集替换为所述第一内存区中存储的所述复制后的子函数。
13.一种程序处理设备,其特征在于,包括存储单元和处理单元;
所述存储单元,用于存储指令;
所述处理单元,用于执行所述存储单元中的所述指令,执行权利要求1-6任意一项所述的方法。
14.一种计算机可读存储介质,包括指令,当其在计算机上运行时,使得所述计算机执行以上权利要求1-6任意一项所述的方法。
CN201811612194.5A 2018-12-27 2018-12-27 一种程序处理方法、装置及设备 Active CN111381905B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201811612194.5A CN111381905B (zh) 2018-12-27 2018-12-27 一种程序处理方法、装置及设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201811612194.5A CN111381905B (zh) 2018-12-27 2018-12-27 一种程序处理方法、装置及设备

Publications (2)

Publication Number Publication Date
CN111381905A CN111381905A (zh) 2020-07-07
CN111381905B true CN111381905B (zh) 2023-07-18

Family

ID=71216237

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201811612194.5A Active CN111381905B (zh) 2018-12-27 2018-12-27 一种程序处理方法、装置及设备

Country Status (1)

Country Link
CN (1) CN111381905B (zh)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111949336A (zh) * 2020-08-03 2020-11-17 中国民用航空华东地区空中交通管理局 函数文件的调整方法、装置、计算机设备和存储介质
CN115185615B (zh) * 2022-09-09 2022-12-02 湖南三湘银行股份有限公司 基于内存空间优化的插件程序调用方法

Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1475909A (zh) * 2002-08-16 2004-02-18 华为技术有限公司 一种嵌入式系统软件补丁的实现和控制方法
CN101246449A (zh) * 2008-02-25 2008-08-20 华为技术有限公司 跟踪函数调用轨迹的方法和装置
CN105573788A (zh) * 2015-12-15 2016-05-11 华为技术有限公司 补丁处理的方法和设备以及生成补丁的方法和设备
CN106095416A (zh) * 2016-06-01 2016-11-09 腾讯科技(深圳)有限公司 一种在应用程序中的跳转处理方法、装置及智能终端
CN106484369A (zh) * 2013-10-24 2017-03-08 华为技术有限公司 一种在线补丁激活的方法及装置
CN107908444A (zh) * 2017-10-26 2018-04-13 北京奇虎科技有限公司 终端应用的挂钩方法及装置
CN108536434A (zh) * 2018-01-09 2018-09-14 武汉斗鱼网络科技有限公司 一种基于高级程序设计语言实现钩子函数的方法及装置

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102156661B (zh) * 2010-02-11 2013-06-12 华为技术有限公司 在线补丁的激活方法、装置及系统

Patent Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1475909A (zh) * 2002-08-16 2004-02-18 华为技术有限公司 一种嵌入式系统软件补丁的实现和控制方法
CN101246449A (zh) * 2008-02-25 2008-08-20 华为技术有限公司 跟踪函数调用轨迹的方法和装置
CN106484369A (zh) * 2013-10-24 2017-03-08 华为技术有限公司 一种在线补丁激活的方法及装置
CN105573788A (zh) * 2015-12-15 2016-05-11 华为技术有限公司 补丁处理的方法和设备以及生成补丁的方法和设备
CN106095416A (zh) * 2016-06-01 2016-11-09 腾讯科技(深圳)有限公司 一种在应用程序中的跳转处理方法、装置及智能终端
CN107908444A (zh) * 2017-10-26 2018-04-13 北京奇虎科技有限公司 终端应用的挂钩方法及装置
CN108536434A (zh) * 2018-01-09 2018-09-14 武汉斗鱼网络科技有限公司 一种基于高级程序设计语言实现钩子函数的方法及装置

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
一种监测函数语义信息访存地址序列的方法;陈荔城等;《计算机研究与发展》;20130515(第05期);全文 *

Also Published As

Publication number Publication date
CN111381905A (zh) 2020-07-07

Similar Documents

Publication Publication Date Title
EP2840495B1 (en) Container-based processing method and apparatus
CN107832062B (zh) 一种程序更新方法及终端设备
US20190087208A1 (en) Method and apparatus for loading elf file of linux system in windows system
TW200839779A (en) Method and apparatus of cache assisted error detection and correction in memory
CN111381905B (zh) 一种程序处理方法、装置及设备
CN110377276B (zh) 源代码文件管理方法及设备
CN110333944B (zh) 话单数据业务处理方法及设备
CN109416664B (zh) 用于增强的地址空间布局随机化的系统、设备和方法
CN112000484A (zh) 栈帧地址随机化方法及相关设备
US8726101B2 (en) Apparatus and method for tracing memory access information
CN112269665B (zh) 内存的处理方法和装置、电子设备和存储介质
KR101666974B1 (ko) 소수 생성
CN110941516B (zh) 操作系统还原方法、装置、设备及存储介质
CN113703753B (zh) 用于产品开发的方法、装置和产品开发系统
CN109271538A (zh) 一种图片存储方法及相关设备
CN111651124B (zh) Ssd映射表多核分区并行重建方法、装置、设备及介质
CN111258733B (zh) 一种嵌入式os任务调度方法、装置、终端设备及存储介质
CN108133149B (zh) 一种数据保护方法、装置及电子设备
CN107634826B (zh) 一种基于zynq器件的加密方法和系统
CN110782389A (zh) 一种图像数据字节对齐方法和终端
CN111381977A (zh) 消息处理方法及设备
CN112445390B (zh) 子菜单选择方法、装置及终端设备
CN113448958B (zh) 数据处理方法和装置、电子设备、存储介质
WO2017050029A1 (zh) 一种数据块处理的方法、装置及设备
CN109408035B (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