一种过程变量的存储方法及装置转让专利

申请号 : CN201410802799.6

文献号 : CN104572482B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 谢江帆

申请人 : 北京华为数字技术有限公司

摘要 :

本发明公开了一种过程变量的存储方法及装置,涉及通信领域,降低了系统分析的开销。具体方案为:为目标程序分配中间帧;其中,目标程序中包含被测函数;通过执行入口桩函数,获得被测函数被调用时的调用信息,将调用信息存储在存储区中,并将调用信息在存储区中的存储地址存储在中间帧中;通过执行出口桩函数,获得被测函数被调用时的返回信息,并根据中间帧中存储的调用信息在存储区中的存储地址,将返回信息存储在存储区中,调用信息和返回信息存储在存储区中的同一个存储单元的两个子单元中。本发明用于过程变量的存储过程中。

权利要求 :

1.一种过程变量的存储方法,其特征在于,包括:

为目标程序分配中间帧;其中,所述目标程序中包含被测函数;

通过执行入口桩函数,获得所述被测函数被调用时的调用信息,将所述调用信息存储在存储区中,并将所述调用信息在所述存储区中的存储地址存储在所述中间帧中;

通过执行出口桩函数,获得所述被测函数被调用时的返回信息,并根据所述中间帧中存储的所述调用信息在所述存储区中的存储地址,将所述返回信息存储在所述存储区中,其中,所述调用信息和所述返回信息存储在所述存储区中的同一个存储单元的两个子单元中;

其中,在所述为目标程序分配中间帧之前,还包括:

对所述目标程序进行分析,获得所述目标程序的应用二进制接口ABI规则;

根据所述被测函数的函数名,查找所述目标程序中的所述被测函数,并根据所述被测函数的函数名和所述ABI规则对所述目标程序进行分析,获得所述被测函数的参数调用规则;

根据所述ABI规则和所述被测函数的参数调用规则生成第一中间汇编码和第二中间汇编码,并对所述被测函数进行二进制动态插桩;其中,所述第一中间汇编码用于调用所述入口桩函数,所述第二中间汇编码用于调用所述出口桩函数。

2.根据权利要求1所述的方法,其特征在于,所述为目标程序分配中间帧,包括:通过执行所述第一中间汇编码,为所述目标程序分配所述中间帧,并将所述被测函数的返回地址、所述被测函数的参数表和指向所述参数表的第一指针存储在所述中间帧中;

所述通过执行入口桩函数,获得所述被测函数被调用时的调用信息,包括:通过执行所述入口桩函数,将根据所述第一指针获得的所述被测函数的参数表中的参数作为所述被测函数被调用时的调用信息。

3.根据权利要求2所述的方法,其特征在于,在所述通过执行入口桩函数,获得所述被测函数被调用时的调用信息,将所述调用信息存储在存储区中,并将所述调用信息在所述存储区中的存储地址存储在所述中间帧中之后,还包括:通过返回执行所述第一中间汇编码,将所述第一指针修改为所述第二中间汇编码的入口地址;

通过执行所述被测函数,获得所述被测函数的返回值;

根据所述第二中间汇编码的入口地址,执行所述第二中间汇编码,并通过执行所述第二中间汇编码,将所述返回值和指向所述返回值的第二指针存储在所述中间帧中。

4.根据权利要求3所述的方法,其特征在于,所述通过执行出口桩函数,获得所述被测函数被调用时的返回信息,包括:通过执行所述出口桩函数,将根据所述第二指针获得的所述返回值作为所述被测函数被调用时的返回信息。

5.根据权利要求1所述的方法,其特征在于,在所述为目标程序分配中间帧之前,还包括:对所述目标程序进行分析,获得所述被测函数的参数个数;

所述为所述目标程序分配中间帧,包括:

根据所述被测函数的参数个数,为所述目标程序分配存储空间大于存储所述被测函数的参数所需空间的中间帧。

6.一种过程变量的存储装置,其特征在于,包括:

分配单元,用于为目标程序分配中间帧;其中,所述目标程序中包含被测函数;

处理单元,用于通过执行入口桩函数,获得所述被测函数被调用时的调用信息,将所述调用信息存储在存储区中,并将所述调用信息在所述存储区中的存储地址存储在所述分配单元分配的所述中间帧中;

所述处理单元,还用于通过执行出口桩函数,获得所述被测函数被调用时的返回信息,并根据所述中间帧中存储的所述调用信息在所述存储区中的存储地址,将所述返回信息存储在所述存储区中,其中,所述调用信息和所述返回信息存储在所述存储区中的同一个存储单元的两个子单元中;

应用二进制接口ABI分析单元,用于对所述目标程序进行分析,获得所述目标程序的ABI规则,根据所述被测函数的函数名,查找所述目标程序中的所述被测函数,并根据所述被测函数的函数名和所述ABI规则对所述目标程序进行分析,获得所述被测函数的参数调用规则;

插桩单元,用于根据所述ABI分析单元分析得到的所述ABI规则和所述被测函数的参数调用规则生成第一中间汇编码和第二中间汇编码,并对所述被测函数进行二进制动态插桩;其中,所述第一中间汇编码用于调用所述入口桩函数,所述第二中间汇编码用于调用所述出口桩函数。

7.根据权利要求6所述的装置,其特征在于,

所述分配单元,具体用于通过执行所述第一中间汇编码,为所述目标程序分配所述中间帧,并将所述被测函数的返回地址、所述被测函数的参数表和指向所述参数表的第一指针存储在所述中间帧中;

所述处理单元,具体用于通过执行所述入口桩函数,将根据所述第一指针获得的所述被测函数的参数表中的参数作为所述被测函数被调用时的调用信息。

8.根据权利要求7所述的装置,其特征在于,还包括:获取单元;

所述处理单元,还用于在所述通过执行入口桩函数,获得所述被测函数被调用时的调用信息,将所述调用信息存储在存储区中,并将所述调用信息在所述存储区中的存储地址存储在所述中间帧中之后,通过返回执行所述第一中间汇编码,将所述第一指针修改为所述第二中间汇编码的入口地址;

所述获取单元,用于通过执行所述被测函数,获得所述被测函数的返回值;

所述处理单元,还用于根据所述第二中间汇编码的入口地址,执行所述第二中间汇编码,并通过执行所述第二中间汇编码,将所述获取单元得到的所述返回值和指向所述返回值的第二指针存储在所述中间帧中。

9.根据权利要求8所述的装置,其特征在于,

所述处理单元,具体用于通过执行所述出口桩函数,将根据所述第二指针获得的所述返回值作为所述被测函数被调用时的返回信息。

10.根据权利要求6所述的装置,其特征在于,

所述ABI分析单元,还用于在所述分配单元为目标程序分配中间帧之前,对所述目标程序进行分析,获得所述被测函数的参数个数;

所述分配单元,具体用于根据所述ABI分析单元分析得到的所述被测函数的参数个数,为所述目标程序分配存储空间大于存储所述被测函数的参数所需空间的中间帧。

说明书 :

一种过程变量的存储方法及装置

技术领域

[0001] 本发明涉及通信领域,尤其涉及一种过程变量的存储方法及装置。

背景技术

[0002] 随着计算机技术的不断发展,软件动态测试变得越来越重要,在软件动态测试中,插桩技术是一种基本的测试手段。插桩技术主要是通过在被测程序中插入相应的语句,以便在程序执行过程中获得所需的信息,从而可以根据获得的信息进行系统分析和性能收集。例如,如图1所示,在某个任务调用函数A(被测函数)的过程中,对函数A的出入口进行插桩之后,通过分析该任务对应的堆栈可以获得在执行桩函数A1时收集到的函数A被调用时的参数、时间t1等相关信息,以及在执行桩函数A2时收集到的函数A被调用时的返回值、时间t2等相关信息,这样通过持续对函数A被调用的相关信息的收集便可以获得函数A随输入参数变化的输出以及开销。
[0003] 在现有技术中,常用的插桩方法是:在某个任务调用函数A(被测函数)的过程中,通过修改函数A的入口指令,将程序跳转到桩函数A1执行,以便收集函数A被调用时的相关信息M1,将M1记录在存储区S中,将函数A的原返回地址Ra记录在全局表RT中,并修改函数A的返回地址为RetA2,在桩函数A1执行完成之后,继续执行函数A,当函数A执行完成之后,根据RetA2返回并执行桩函数A2,以便收集函数A被调用时的相关信息M2,并将M2记录在存储区S中,最后,从全局表RT中恢复原返回地址Ra,以便根据原返回地址Ra返回函数A的原调用者继续执行程序。
[0004] 现有技术中至少存在如下问题:由于系统分析和性能收集均是基于单次调用时在函数的入口和出口处采集到的所有存在对应关系的信息对(即M1和M2)进行的,而若存在多个任务并行或嵌套调用同一个被测函数,则单次调用该函数时,在该函数的入口和出口处分别采集到的信息存在极大的可能被记录在存储区中较远的位置,这样在进行离线分析时,需要相当复杂的分析才能得到采集到的所有存在对应关系的信息对,增加了系统分析的开销。

发明内容

[0005] 本发明提供一种过程变量的存储方法及装置,降低了系统分析的开销。
[0006] 为达到上述目的,本发明采用如下技术方案:
[0007] 本发明的第一方面,提供一种过程变量的存储方法,包括:
[0008] 为目标程序分配中间帧;其中,所述目标程序中包含被测函数;
[0009] 通过执行入口桩函数,获得所述被测函数被调用时的调用信息,将所述调用信息存储在存储区中,并将所述调用信息在所述存储区中的存储地址存储在所述中间帧中;
[0010] 通过执行出口桩函数,获得所述被测函数被调用时的返回信息,并根据所述中间帧中存储的所述调用信息在所述存储区的中存储地址,将所述返回信息存储在所述存储区中,其中,所述调用信息和所述返回信息存储在所述存储区中的同一个存储单元的两个子单元中。
[0011] 结合第一方面,在第一种可能的实现方式中,在所述为目标程序分配中间帧之前,还包括:
[0012] 对所述目标程序进行分析,获得所述目标程序的应用二进制接口ABI规则;
[0013] 根据所述被测函数的函数名,查找所述目标程序中的所述被测函数,并根据所述被测函数的函数名和所述ABI规则对所述目标程序进行分析,获得所述被测函数的参数调用规则;
[0014] 根据所述ABI规则和所述被测函数的参数调用规则生成第一中间汇编码和第二中间汇编码,并对所述被测函数进行二进制动态插桩;其中,所述第一中间汇编码用于调用所述入口桩函数,所述第二中间汇编码用于调用所述出口桩函数。
[0015] 结合第一方面的第一种可能的实现方式,在第二种可能的实现方式中,所述为目标程序分配中间帧,包括:
[0016] 通过执行所述第一中间汇编码,为所述目标程序分配所述中间帧,并将所述被测函数的返回地址、所述被测函数的参数表和指向所述参数表的第一指针存储在所述中间帧中;
[0017] 所述通过执行入口桩函数,获得所述被测函数被调用时的调用信息,包括:
[0018] 通过执行所述入口桩函数,将根据所述第一指针获得的所述被测函数的参数表中的参数作为所述被测函数被调用时的调用信息。
[0019] 结合第一方面的第一种可能的实现方式或第一方面的第二种可能的实现方式,在第三种可能的实现方式中,在所述通过执行入口桩函数,获得所述被测函数被调用时的调用信息,将所述调用信息存储在存储区中,并将所述调用信息在所述存储区中的存储地址存储在所述中间帧中之后,还包括:
[0020] 通过返回执行所述第一中间汇编码,将所述第一指针修改为所述第二中间汇编码的入口地址;
[0021] 通过执行所述被测函数,获得所述被测函数的返回值;
[0022] 根据所述第二中间汇编码的入口地址,执行所述第二中间汇编码,并通过执行所述第二中间汇编码,将所述返回值和指向所述返回值的第二指针存储在所述中间帧中。
[0023] 结合第一方面的第三种可能的实现方式,在第四种可能的实现方式中,所述通过执行出口桩函数,获得所述被测函数被调用时的返回信息,包括:
[0024] 通过执行所述出口桩函数,将根据所述第二指针获得的所述返回值作为所述被测函数被调用时的返回信息。
[0025] 结合第一方面,在第五种可能的实现方式中,在所述为目标程序分配中间帧之前,还包括:
[0026] 对所述目标程序进行分析,获得所述被测函数的参数个数;
[0027] 所述为所述目标程序分配中间帧,包括:
[0028] 根据所述被测函数的参数个数,为所述目标程序分配存储空间大于存储所述被测函数的参数所需空间的中间帧。
[0029] 本发明的第二方面,提供一种过程变量的存储装置,包括:
[0030] 分配单元,用于为目标程序分配中间帧;其中,所述目标程序中包含被测函数;
[0031] 处理单元,用于通过执行入口桩函数,获得所述被测函数被调用时的调用信息,将所述调用信息存储在存储区中,并将所述调用信息在所述存储区中的存储地址存储在所述分配单元分配的所述中间帧中;
[0032] 所述处理单元,还用于通过执行出口桩函数,获得所述被测函数被调用时的返回信息,并根据所述中间帧中存储的所述调用信息在所述存储区中的存储地址,将所述返回信息存储在所述存储区中,其中,所述调用信息和所述返回信息存储在所述存储区中的同一个存储单元的两个子单元中。
[0033] 结合第二方面,在第一种可能的实现方式中,还包括:
[0034] 应用二进制接口ABI分析单元,用于对所述目标程序进行分析,获得所述目标程序的ABI规则,根据所述被测函数的函数名,查找所述目标程序中的所述被测函数,并根据所述被测函数的函数名和所述ABI规则对所述目标程序进行分析,获得所述被测函数的参数调用规则;
[0035] 插桩单元,用于根据所述ABI分析单元分析得到的所述ABI规则和所述被测函数的参数调用规则生成第一中间汇编码和第二中间汇编码,并对所述被测函数进行二进制动态插桩;其中,所述第一中间汇编码用于调用所述入口桩函数,所述第二中间汇编码用于调用所述出口桩函数。
[0036] 结合第二方面的第一种可能的实现方式,在第二种可能的实现方式中,[0037] 所述分配单元,具体用于通过执行所述第一中间汇编码,为所述目标程序分配所述中间帧,并将所述被测函数的返回地址、所述被测函数的参数表和指向所述参数表的第一指针存储在所述中间帧中;
[0038] 所述处理单元,具体用于通过执行所述入口桩函数,将根据所述第一指针获得的所述被测函数的参数表中的参数作为所述被测函数被调用时的调用信息。
[0039] 结合第二方面的第一种可能的实现方式或第二方面的第二种可能的实现方式,在第三种可能的实现方式中,还包括:获取单元;
[0040] 所述处理单元,还用于在所述通过执行入口桩函数,获得所述被测函数被调用时的调用信息,将所述调用信息存储在存储区中,并将所述调用信息在所述存储区中的存储地址存储在所述中间帧中之后,通过返回执行所述第一中间汇编码,将所述第一指针修改为所述第二中间汇编码的入口地址;
[0041] 所述获取单元,用于通过执行所述被测函数,获得所述被测函数的返回值;
[0042] 所述处理单元,还用于根据所述第二中间汇编码的入口地址,执行所述第二中间汇编码,并通过执行所述第二中间汇编码,将所述获取单元得到的所述返回值和指向所述返回值的第二指针存储在所述中间帧中。
[0043] 结合第二方面的第三种可能的实现方式,在第四种可能的实现方式中,[0044] 所述处理单元,具体用于通过执行所述出口桩函数,将根据所述第二指针获得的所述返回值作为所述被测函数被调用时的返回信息。
[0045] 结合第二方面,在第五种可能的实现方式中,
[0046] 所述ABI分析单元,还用于在所述分配单元为目标程序分配中间帧之前,对所述目标程序进行分析,获得所述被测函数的参数个数;
[0047] 所述分配单元,具体用于根据所述ABI分析单元分析得到的所述被测函数的参数个数,为所述目标程序分配存储空间大于存储所述被测函数的参数所需空间的中间帧。
[0048] 本发明提供的过程变量的存储方法及装置,通过执行入口桩函数,获得目标程序中的被测函数被调用时的调用信息,将调用信息存储在存储区中,并将调用信息在存储区中的存储地址存储在为目标程序分配的中间帧中,通过执行出口桩函数,获得被测函数被调用时的返回信息,并根据存储的调用信息在存储区中的存储地址,将返回信息存储在存储区中与调用信息相邻的存储空间中,通过将被测函数被调用时的调用信息在存储区中的存储地址保存在中间帧中,使得在存储与调用信息存在对应关系的、被测函数被调用时的返回信息时,可以根据调用信息在存储区中的存储地址,将返回信息存储在存储区中,该返回信息和调用信息存储在存储区中的同一个存储单元的两个子单元中,从而使得进行离线分析时,不需复杂的分析便可以得到采集到的所有存在对应关系的信息对,很大程度上降低了系统分析的开销。

附图说明

[0049] 为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
[0050] 图1为现有技术提供的一种函数A被插桩后的调用时序图;
[0051] 图2为本发明一实施例提供的一种过程变量的存储方法流程图;
[0052] 图3为本发明另一实施例提供的一种过程变量的存储方法流程图;
[0053] 图4为本发明另一实施例提供的一种被测函数被插桩后的调用时序图;
[0054] 图5为本发明另一实施例提供的一种为目标程序分配的堆栈空间的示意图;
[0055] 图6为本发明另一实施例提供的另一种为目标程序分配的堆栈空间的示意图;
[0056] 图7为本发明另一实施例提供的又一种为目标程序分配的堆栈空间的示意图;
[0057] 图8为本发明另一实施例提供的一种过程变量的存储装置组成示意图;
[0058] 图9为本发明另一实施例提供的另一种过程变量的存储装置组成示意图;
[0059] 图10为本发明另一实施例提供的一种过程变量的存储装置组成示意图。

具体实施方式

[0060] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0061] 本发明一实施例提供一种过程变量的存储方法,如图2所示,该方法可以包括:
[0062] 101、为目标程序分配中间帧。
[0063] 其中,目标程序中包含被测函数。当用户需要针对被测函数进行系统分析和性能收集时,可以通过插桩技术来实现系统分析和性能收集的目的。在对目标程序中包含的被测函数进行插桩之后,在目标程序运行的过程中,可以为目标程序分配一个中间帧。该中间帧用于保存被测函数的参数、返回地址、返回值以及执行入口桩函数和出口桩函数使用到的存储单元的存储地址等过程变量。
[0064] 102、通过执行入口桩函数,获得被测函数被调用时的调用信息,将调用信息存储在存储区中,并将调用信息在存储区中的存储地址存储在中间帧中。
[0065] 其中,在目标程序执行到入口桩函数时,可以通过执行入口桩函数,获得被测函数被调用时的调用信息,将该调用信息存储在存储区中,并将调用信息在存储区中的存储地址存储在为目标程序分配的中间帧中。执行入口桩函数时获得的被测函数被调用时的调用信息可以包括以下任意一种或多种的组合:被测函数被调用时的参数、被测函数被调用时的时间、调用栈等信息。
[0066] 103、通过执行出口桩函数,获得被测函数被调用时的返回信息,并根据中间帧中存储的调用信息在存储区中的存储地址,将返回信息存储在存储区中,调用信息和返回信息存储在存储区中的同一个存储单元的两个子单元中。
[0067] 其中,在目标程序执行到出口桩函数时,可以通过执行出口桩函数,获得被测函数被调用时的返回信息,并且通过获取为目标程序分配的中间帧中存储的、被测函数被调用时的调用信息在存储区中的存储地址,将收集到与调用信息存在对应关系的被测函数被调用时的返回信息存储到存储区中,该返回信息和调用信息存储在存储区中的同一个存储单元的两个子单元中。执行出口桩函数时获得的被测函数被调用时的返回信息可以包括以下任意一种或多种的组合:被测函数被调用时的返回值、被测函数被调用时的时间、调用栈等信息。其中,调用栈(CallStack)可以仅通过执行入口桩函数获得(即,调用信息中记录调用栈),也可以仅通过执行出口桩函数获得(即,返回信息中记录调用栈),还可以分别通过执行入口桩函数和执行出口桩函数获得。
[0068] 本发明提供的过程变量的存储方法及装置,通过执行入口桩函数,获得目标程序中的被测函数被调用时的调用信息,将调用信息存储在存储区中,并将调用信息在存储区中的存储地址存储在为目标程序分配的中间帧中,通过执行出口桩函数,获得被测函数被调用时的返回信息,并根据存储的调用信息在存储区中的存储地址,将返回信息存储在存储区中与调用信息相邻的存储空间中,通过将被测函数被调用时的调用信息在存储区中的存储地址保存在中间帧中,使得在存储与调用信息存在对应关系的、被测函数被调用时的返回信息时,可以根据调用信息在存储区中的存储地址,将返回信息存储在存储区中,该返回信息和调用信息存储在存储区中的同一个存储单元的两个子单元中,从而使得进行离线分析时,不需复杂的分析便可以得到采集到的所有存在对应关系的信息对,很大程度上降低了系统分析的开销。
[0069] 本发明另一实施例提供一种过程变量的存储方法,如图3所示,该方法可以包括:
[0070] 201、获取被测函数的函数名。
[0071] 其中,当用户需要针对被测函数进行系统分析和性能收集时,用户可以先通过集成开发环境(Integrated Development Environment,IDE)输入被测函数的缩略名,这样根据用户输入的被测函数的缩略名便可以获得被测函数的函数名。
[0072] 202、对目标程序进行分析,获得目标程序的应用二进制接口(Application Binary Interface,ABI)规则,根据被测函数的函数名,查找目标程序中的被测函数,并根据被测函数的函数名和ABI规则对目标程序进行分析,获得被测函数的参数调用规则。
[0073] 其中,在获取到被测函数的函数名之后,可以对目标程序的二进制文件的调试(debug)段进行分析,以获得该目标程序的ABI规则。该ABI规则描述了应用程序(或者其他类型)和操作系统之间,或应用程序和其他应用程序之间的低级接口,其可以包括:数据类型的大小、布局;函数调用的约定,如,在进行参数传递时,是所有的参数都通过堆栈传递,还是部分参数通过堆栈传递,部分参数通过寄存器传递,哪些寄存器用于传递参数,哪些参数使用堆栈传递等规则。然后可以根据被测函数的函数名查找目标程序中的被测函数,并根据被测函数的函数名和分析得到的ABI规则对目标程序进行分析,以获得被测函数的参数调用规则。
[0074] 203、对目标程序进行分析,获得被测函数的参数个数。
[0075] 其中,在获取到被测函数的函数名之后,在对目标程序的二进制文件的debug段进行分析的过程中,还可以获得被测函数的参数个数以及参数类型。
[0076] 204、根据ABI规则和被测函数的参数调用规则生成第一中间汇编码和第二中间汇编码,并对被测函数进行二进制动态插桩。
[0077] 其中,第一中间汇编码(intercode1)用于调用入口桩函数,第二中间汇编码(intercode2)用于调用出口桩函数。在对目标程序进行分析获得目标程序的ABI规则和被测函数的参数调用规则之后,便可以根据获取到的ABI规则和被测函数的参数调用规则生成第一中间汇编码和第二中间汇编码,然后对被测函数进行二进制动态插桩,且在对被测函数进行二进制动态插桩之后,被测函数被插桩后的调用时序图可以如图4所示,也就是说,某个任务需调用被测函数时,其具体的调用过程包括以下步骤205-步骤210。
[0078] 205、通过执行第一中间汇编码,为目标程序分配中间帧,并将被测函数的返回地址、被测函数的参数表和指向参数表的第一指针存储在中间帧中。
[0079] 其中,当被测函数的调用者调用被测函数时,首先会跳转到第一中间汇编码执行,且通过执行第一中间汇编码,可以为目标程序在调用者帧和入口桩函数帧之间开辟一段临时的中间帧,且将被测函数的返回地址、被测函数的参数表和指向参数表的第一指针存储在中间帧中,且在执行第一中间汇编码时执行call(调用)入口桩函数,以便继续执行入口桩函数。其中为目标程序分配中间帧具体的可以为:根据分析获得的被测函数的参数个数,为目标程序分配存储空间大于存储被测函数的参数所需空间的中间帧。
[0080] 为目标程序分配中间帧后的堆栈空间可以如图5所示,且示例性的,当中央处理器(Central Processing Unit,CPU)体系架构为x86 ABI时,可以根据对应的ABI规则,从高地址向地地址依次存储:桩共享变量、被测函数的返回地址Ra、被测函数的参数表、指向参数表的第一指针Pa1,其中,被测函数的返回地址Ra、被测函数的参数表可以从调用者帧中直接拷贝过来,桩共享变量可以初始化为0,指向参数表的第一指针Pa1具体的是指向参数表的第一个参数的存储地址。
[0081] 206、通过执行入口桩函数,将根据第一指针获得的被测函数的参数表中的参数作为被测函数被调用时的调用信息,将调用信息存储在存储区中,并将调用信息在存储区中的存储地址存储在中间帧中。
[0082] 其中,在执行第一中间汇编码时执行call入口桩函数之后,可以继续执行入口桩函数,通过执行入口桩函数,获得被测函数被调用时的调用信息,具体的是根据ABI规则,将根据第一指针获得的被测函数的参数表中的参数作为被测函数被调用时的调用信息,以完成信息的采集,并将采集到的调用信息存储在存储区中,且需将调用信息在存储区中的存储地址存储在中间帧的桩共享变量中,即可以得到:Pa1->桩共享变量=Addr(M1),其中M1指的是采集到被测函数被调用时的调用信息,Addr(M1)指的是调用信息在存储区中的存储地址。
[0083] 207、通过返回执行第一中间汇编码,将第一指针修改为第二中间汇编码的入口地址。
[0084] 其中,在入口桩函数执行完成之后,便会返回第一中间汇编码继续执行,通过执行第一中间汇编码,入口桩函数帧被回退,并将第一指针修改为第二中间汇编码的入口地址,并在执行第一中间汇编码时执行jmp(跳转)被测函数,以便继续执行被测函数,这时,以被测函数的角度看就像收到了参数表内的参数,并且被第二中间汇编码调用。通过返回执行第一中间汇编码后目标程序的堆栈空间可以如图6所示,其中Ric2表示第二中间汇编码的入口地址。
[0085] 208、通过执行被测函数,获得被测函数的返回值。
[0086] 其中,在执行第一中间汇编码时执行jmp被测函数之后,继续执行被测函数,通过执行被测函数可以获得被测函数的返回值。
[0087] 209、根据第二中间汇编码的入口地址,执行第二中间汇编码,并通过执行第二中间汇编码,将返回值和指向返回值的第二指针存储在中间帧中。
[0088] 其中,在被测函数执行完成之后,被测函数帧被回退,中间帧中的第二中间汇编码的入口地址被部分回退,并会根据第二中间汇编码的入口地址,进入第二中间汇编码继续执行。通过执行第二中间汇编码,中间帧继续被回退(如,可以按照将参数表的字节数减去8进行回退),然后在被回退前存储参数表的位置存储被测函数的两个返回值和指向返回值的第二指针,且在执行第二中间汇编码时执行call出口桩函数,以便继续执行出口桩函数。通过执行第二中间汇编码后目标程序的堆栈空间可以如图7所示,其中Pa2为第二指针,用于指向返回值1。
[0089] 210、通过执行出口桩函数,将根据第二指针获得的返回值作为被测函数被调用时的返回信息,并根据中间帧中存储的调用信息在存储区中的存储地址,将返回信息存储在存储区中,调用信息和返回信息存储在存储区中的同一个存储单元的两个子单元中。
[0090] 其中,在执行第二中间汇编码时执行call出口桩函数之后,可以继续执行出口桩函数,通过执行出口桩函数,可以获得被测函数被调用时的返回信息,具体的,可以将根据第二指针获得的返回值作为被测函数被调用时的返回信息,并通过访问Pa2->桩共享变量,可以得到执行入口桩函数时在中间帧中存储的调用信息在存储区中的存储地址,这样便可以根据中间帧中存储的调用信息在存储区中的存储地址,将返回信息存储在存储区中,其中,调用信息和返回信息存储在存储区中的同一个存储单元的两个子单元中。在出口桩函数执行完成之后,可以返回执行第二中间汇编码,并在第二中间汇编码执行完成之后,根据中间帧中存储的被测函数的返回地址Ra返回被测函数的调用者继续执行。
[0091] 本发明提供的过程变量的存储方法,通过执行入口桩函数,获得目标程序中的被测函数被调用时的调用信息,将调用信息存储在存储区中,并将调用信息在存储区中的存储地址存储在为目标程序分配的中间帧中,通过执行出口桩函数,获得被测函数被调用时的返回信息,并根据存储的调用信息在存储区中的存储地址,将返回信息存储在存储区中与调用信息相邻的存储空间中,通过将被测函数被调用时的调用信息在存储区中的存储地址保存在中间帧中,使得在存储与调用信息存在对应关系的、被测函数被调用时的返回信息时,可以根据调用信息在存储区中的存储地址,将返回信息存储在存储区中,该返回信息和调用信息存储在存储区中的同一个存储单元的两个子单元中,从而使得进行离线分析时,不需复杂的分析便可以得到采集到的所有存在对应关系的信息对,很大程度上降低了系统分析的开销。
[0092] 并且,通过将被测函数的返回地址存储在中间帧中,与将返回地址存储在全局表项中相比,避免了读写全局表项时加锁互斥带来的开销,这样有利于提高插桩时多任务调用被测函数时的性能。
[0093] 本发明另一实施例提供一种过程变量的存储装置,如图8所示,该过程变量的存储装置可以包括:分配单元31、处理单元32。
[0094] 分配单元31,用于为目标程序分配中间帧;其中,所述目标程序中包含被测函数。
[0095] 处理单元32,用于通过执行入口桩函数,获得所述被测函数被调用时的调用信息,将所述调用信息存储在存储区中,并将所述调用信息在所述存储区中的存储地址存储在所述分配单元31分配的所述中间帧中。
[0096] 所述处理单元32,还用于通过执行出口桩函数,获得所述被测函数被调用时的返回信息,并根据所述中间帧中存储的所述调用信息在所述存储区中的存储地址,将所述返回信息存储在所述存储区中,其中,所述调用信息和所述返回信息存储在所述存储区中的同一个存储单元的两个子单元中。
[0097] 在本发明实施例中,进一步的,如图9所示,该过程变量的存储装置还可以包括:ABI分析单元33、插桩单元34。
[0098] ABI分析单元33,用于对所述目标程序进行分析,获得所述目标程序的ABI规则,根据所述被测函数的函数名,查找所述目标程序中的所述被测函数,并根据所述被测函数的函数名和所述ABI规则对所述目标程序进行分析,获得所述被测函数的参数调用规则。
[0099] 插桩单元34,用于根据所述ABI分析单元33分析得到的所述ABI规则和所述被测函数的参数调用规则生成第一中间汇编码和第二中间汇编码,并对所述被测函数进行二进制动态插桩;其中,所述第一中间汇编码用于调用所述入口桩函数,所述第二中间汇编码用于调用所述出口桩函数。
[0100] 在本发明实施例中,进一步的,所述分配单元31,具体用于通过执行所述第一中间汇编码,为所述目标程序分配所述中间帧,并将所述被测函数的返回地址、所述被测函数的参数表和指向所述参数表的第一指针存储在所述中间帧中。
[0101] 所述处理单元32,具体用于通过执行所述入口桩函数,将根据所述第一指针获得的所述被测函数的参数表中的参数作为所述被测函数被调用时的调用信息。
[0102] 在本发明实施例中,进一步的,该过程变量的存储装置还可以包括:获取单元35。
[0103] 所述处理单元32,还用于在所述通过执行入口桩函数,获得所述被测函数被调用时的调用信息,将所述调用信息存储在存储区中,并将所述调用信息在所述存储区中的存储地址存储在所述中间帧中之后,通过返回执行所述第一中间汇编码,将所述第一指针修改为所述第二中间汇编码的入口地址。
[0104] 所述获取单元35,用于通过执行所述被测函数,获得所述被测函数的返回值。
[0105] 所述处理单元32,还用于根据所述第二中间汇编码的入口地址,执行所述第二中间汇编码,并通过执行所述第二中间汇编码,将所述获取单元35得到的所述返回值和指向所述返回值的第二指针存储在所述中间帧中。
[0106] 在本发明实施例中,进一步的,所述处理单元32,具体用于通过执行所述出口桩函数,将根据所述第二指针获得的所述返回值作为所述被测函数被调用时的返回信息。
[0107] 在本发明实施例中,进一步的,所述ABI分析单元33,还用于在所述分配单元31为目标程序分配中间帧之前,对所述目标程序进行分析,获得所述被测函数的参数个数。
[0108] 所述分配单元31,具体用于根据所述ABI分析单元33分析得到的所述被测函数的参数个数,为所述目标程序分配存储空间大于存储所述被测函数的参数所需空间的中间帧。
[0109] 需要说明的是,本发明实施例提供的过程变量的存储装置中各功能模块的具体工作过程可以参考方法实施例中对应过程的具体描述,本发明实施例在此不再详细赘述。
[0110] 本发明提供的过程变量的存储装置,通过执行入口桩函数,获得目标程序中的被测函数被调用时的调用信息,将调用信息存储在存储区中,并将调用信息在存储区中的存储地址存储在为目标程序分配的中间帧中,通过执行出口桩函数,获得被测函数被调用时的返回信息,并根据存储的调用信息在存储区中的存储地址,将返回信息存储在存储区中与调用信息相邻的存储空间中,通过将被测函数被调用时的调用信息在存储区中的存储地址保存在中间帧中,使得在存储与调用信息存在对应关系的、被测函数被调用时的返回信息时,可以根据调用信息在存储区中的存储地址,将返回信息存储在存储区中,该返回信息和调用信息存储在存储区中的同一个存储单元的两个子单元中,从而使得进行离线分析时,不需复杂的分析便可以得到采集到的所有存在对应关系的信息对,很大程度上降低了系统分析的开销。
[0111] 并且,通过将被测函数的返回地址存储在中间帧中,与将返回地址存储在全局表项中相比,避免了读写全局表项时加锁互斥带来的开销,这样有利于提高插桩时多任务调用被测函数时的性能。
[0112] 本发明另一实施例提供一种过程变量的存储装置,如图10所示,包括:至少一个处理器41、存储器42、通信接口43和总线44,该至少一个处理器41、存储器42和通信接口43通过总线44连接并完成相互间的通信,其中:
[0113] 所述总线44可以是工业标准体系结构(Industry Standard Architecture,ISA)总线、外部设备互连(Peripheral Component Interconnect,PCI)总线或扩展工业标准体系结构(Extended Industry Standard Architecture,EISA)总线等。该总线44可以分为地址总线、数据总线、控制总线等。为便于表示,图10中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
[0114] 所述存储器42用于存储可执行程序代码,该程序代码包括计算机操作指令。存储器42可能包含高速RAM存储器,也可能还包括非易失性存储器(non-volatile memory),例如至少一个磁盘存储器。
[0115] 所述处理器41可能是一个中央处理器(Central Processing Unit,CPU),或者是特定集成电路(Application Specific Integrated Circuit,ASIC),或者是被配置成实施本发明实施例的一个或多个集成电路。
[0116] 所述通信接口43,主要用于实现本实施例的设备之间的通信。
[0117] 所述处理器41,用于执行所述存储器42中存储的可执行程序代码,具体的用于执行以下操作:
[0118] 所述处理器41,用于为目标程序分配中间帧;其中,所述目标程序中包含被测函数;通过执行入口桩函数,获得所述被测函数被调用时的调用信息,将所述调用信息存储在存储区中,并将所述调用信息在所述存储区中的存储地址存储在所述中间帧中;通过执行出口桩函数,获得所述被测函数被调用时的返回信息,并根据所述中间帧中存储的所述调用信息在所述存储区中的存储地址,将所述返回信息存储在所述存储区中,其中,所述调用信息和所述返回信息存储在所述存储区中的同一个存储单元的两个子单元中。
[0119] 在本发明实施例中,进一步的,所述处理器41,还用于在所述为目标程序分配中间帧之前,对所述目标程序进行分析,获得所述目标程序的应用二进制接口ABI规则;根据所述被测函数的函数名,查找所述目标程序中的所述被测函数,并根据所述被测函数的函数名和所述ABI规则对所述目标程序进行分析,获得所述被测函数的参数调用规则;根据所述ABI规则和所述被测函数的参数调用规则生成第一中间汇编码和第二中间汇编码,并对所述被测函数进行二进制动态插桩;其中,所述第一中间汇编码用于调用所述入口桩函数,所述第二中间汇编码用于调用所述出口桩函数。
[0120] 在本发明实施例中,进一步的,所述处理器41,具体用于通过执行所述第一中间汇编码,为所述目标程序分配所述中间帧,并将所述被测函数的返回地址、所述被测函数的参数表和指向所述参数表的第一指针存储在所述中间帧中。
[0121] 所述处理器41,具体用于通过执行所述入口桩函数,将根据所述第一指针获得的所述被测函数的参数表中的参数作为所述被测函数被调用时的调用信息。
[0122] 在本发明实施例中,进一步的,所述处理器41,还用于在所述通过执行入口桩函数,获得所述被测函数被调用时的调用信息,将所述调用信息存储在存储区中,并将所述调用信息在所述存储区中的存储地址存储在所述中间帧中之后,通过返回执行所述第一中间汇编码,将所述第一指针修改为所述第二中间汇编码的入口地址;通过执行所述被测函数,获得所述被测函数的返回值;根据所述第二中间汇编码的入口地址,执行所述第二中间汇编码,并通过执行所述第二中间汇编码,将所述返回值和指向所述返回值的第二指针存储在所述中间帧中。
[0123] 在本发明实施例中,进一步的,所述处理器41,具体用于通过执行所述出口桩函数,将根据所述第二指针获得的所述返回值作为所述被测函数被调用时的返回信息。
[0124] 在本发明实施例中,进一步的,所述处理器41,还用于在所述为目标程序分配中间帧之前,对所述目标程序进行分析,获得所述被测函数的参数个数。
[0125] 所述处理器41,具体用于根据所述被测函数的参数个数,为所述目标程序分配存储空间大于存储所述被测函数的参数所需空间的中间帧。
[0126] 需要说明的是,本发明实施例提供的过程变量的存储装置中各功能模块的具体工作过程可以参考方法实施例中对应过程的具体描述,本发明实施例在此不再详细赘述。
[0127] 本发明提供的过程变量的存储装置,通过执行入口桩函数,获得目标程序中的被测函数被调用时的调用信息,将调用信息存储在存储区中,并将调用信息在存储区中的存储地址存储在为目标程序分配的中间帧中,通过执行出口桩函数,获得被测函数被调用时的返回信息,并根据存储的调用信息在存储区中的存储地址,将返回信息存储在存储区中与调用信息相邻的存储空间中,通过将被测函数被调用时的调用信息在存储区中的存储地址保存在中间帧中,使得在存储与调用信息存在对应关系的、被测函数被调用时的返回信息时,可以根据调用信息在存储区中的存储地址,将返回信息存储在存储区中,该返回信息和调用信息存储在存储区中的同一个存储单元的两个子单元中,从而使得进行离线分析时,不需复杂的分析便可以得到采集到的所有存在对应关系的信息对,很大程度上降低了系统分析的开销。
[0128] 并且,通过将被测函数的返回地址存储在中间帧中,与将返回地址存储在全局表项中相比,避免了读写全局表项时加锁互斥带来的开销,这样有利于提高插桩时多任务调用被测函数时的性能。
[0129] 通过以上的实施方式的描述,所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。
[0130] 在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述模块或单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个装置,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
[0131] 所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是一个物理单元或多个物理单元,即可以位于一个地方,或者也可以分布到多个不同地方。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
[0132] 另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
[0133] 所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该软件产品存储在一个存储介质中,包括若干指令用以使得一个设备(可以是单片机,芯片等)或处理器(processor)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
[0134] 以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。