CN102109975A - 确定函数调用关系的方法、装置及系统 - Google Patents

确定函数调用关系的方法、装置及系统 Download PDF

Info

Publication number
CN102109975A
CN102109975A CN200910261275XA CN200910261275A CN102109975A CN 102109975 A CN102109975 A CN 102109975A CN 200910261275X A CN200910261275X A CN 200910261275XA CN 200910261275 A CN200910261275 A CN 200910261275A CN 102109975 A CN102109975 A CN 102109975A
Authority
CN
China
Prior art keywords
function
set value
address
instruction
stack
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
Application number
CN200910261275XA
Other languages
English (en)
Other versions
CN102109975B (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.)
Pang Shuangying
Original Assignee
Huawei 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 Huawei Technologies Co Ltd filed Critical Huawei Technologies Co Ltd
Priority to CN200910261275.XA priority Critical patent/CN102109975B/zh
Publication of CN102109975A publication Critical patent/CN102109975A/zh
Application granted granted Critical
Publication of CN102109975B publication Critical patent/CN102109975B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Debugging And Monitoring (AREA)
  • Executing Machine-Instructions (AREA)

Abstract

本发明实施例涉及一种确定函数调用关系的方法、装置及系统,其中,确定函数调用关系的方法包括:从函数的当前代码段指令地址处开始向高地址方向搜索指令,获得所述函数的第一SP偏移值;从所述代码段指令地址处开始向低地址方向搜索指令,获得所述函数的第二SP偏移值,以及获得保存函数返回地址的地址相对函数的栈帧的偏移值;根据所述第一SP偏移值及第二SP偏移值获得所述函数的SP偏移值,当所述SP偏移值符合预设要求时,所述函数的堆栈指针指向所述函数的栈帧,根据所述函数的栈帧及所述偏移值,得到所述函数的返回地址。通过高低地址双向追溯函数调用关系,提高追溯函数调用关系的准确性。

Description

确定函数调用关系的方法、装置及系统
技术领域
本发明涉及计算机领域,特别涉及一种确定函数调用关系的方法、装置及系统。
背景技术
程序异常或调试程序时,传统的追溯函数调用关系方法是使用CPU硬件寄存器(如帧寄存器)和堆栈来完成的。具体如,mips架构(一种CPU架构)下,帧寄存器指向当前函数的栈帧(Frame Pointer,FP),当前函数的返回地址保存在堆栈中,保存其返回地址的地址相对于当前函数的栈帧的偏移值是固定的。那么,根据栈帧和固定偏移值,可以读出当前函数的返回地址。以此循环,完成函数调用关系的追溯。
上面涉及的术语,可以参考如下理解:
栈帧:指调用函数时,在堆栈中保留的用于保存函数参数、局部变量、以及函数返回地址的一部分空间,函数返回时释放该部分空间,该部分空间的起始地址通常称为栈帧。
当前函数:指调用函数中被调用者。
上层函数:指当前函数的调用者。
函数的返回地址:指当前函数返回时,能够恢复到当前函数被调用前的代码区中地址,实现继续执行指令。
而对于如使用Gcc(GNU C Com piler,一种编译器)的O2选项构建的程序在运行时,不再使用帧寄存器来保存当前函数的栈帧,但是对于非叶子函数的情况,函数的返回地址仍然保存在堆栈区中。一种追溯函数调用关系方法,如暴力法,通过读堆栈区内存,读出的值如果恰好在代码段的区域内,则认为这是一个函数的返回地址。
在实现本发明过程中,发明人发现现有技术中至少存在如下问题:
由于堆栈区内大部分保存的都是函数参数、局部变量,只是占用很小的一部分空间来保存函数返回地址。函数参数、局部变量的值是无法预测的,一旦它们的值位于代码段,暴力法就认为这是一个函数返回地址,导致确定函数调用关系中函数的返回地址的准确性低。
发明内容
本发明的实施例提供了一种确定函数调用关系的方法、装置及系统,以提高确定函数调用关系中函数的返回地址的准确性。
本发明的实施例提供一种确定函数调用关系的方法,包括:
从函数的当前代码段指令地址处开始向高地址方向搜索指令,获得所述函数的第一SP偏移值;
从所述代码段指令地址处开始向低地址方向搜索指令,获得所述函数的第二SP偏移值,以及获得保存函数返回地址的地址相对函数的栈帧的偏移值;
根据所述第一SP偏移值及第二SP偏移值获得所述函数的SP偏移值,当所述SP偏移值符合预设要求时,所述函数的堆栈指针指向所述函数的栈帧,根据所述函数的栈帧及所述偏移值,得到所述函数的返回地址。
对应的,本发明的实施例提供一种确定函数调用关系的装置,包括:
前向搜索单元,用于从函数的当前代码段指令地址处开始向高地址方向搜索指令,获得所述函数的第一SP偏移值;
后向搜索单元,用于从所述代码段指令地址处开始向低地址方向搜索指令,获得所述函数的第二SP偏移值,以及获得保存函数返回地址的地址相对函数的栈帧的偏移值;
确定单元,用于根据所述第一SP偏移值及第二SP偏移值获得所述函数的SP偏移值,当所述SP偏移值符合预设要求时,所述函数的堆栈指针指向所述函数的栈帧,根据所述函数的栈帧及所述偏移值,得到所述函数的返回地址。
本发明的实施例提供一种确定函数调用关系的系统,包括用户接口和上述的确定函数调用关系的装置,所述确定函数调用关系的装置用于通过所述用户接口接收用户的函数调用命令,通过分析映射到内存的进程用户态代码段指令,追溯出函数的返回地址和SP值。
由上述本发明的实施例提供的技术方案可以看出,从函数的当前代码段指令地址处开始向高地址方向搜索以及从代码段地址处开始向低地址方向搜索,通过双向追溯函数调用关系,从而准确的确定函数的栈帧,得到函数的返回地址,提高追溯函数调用关系的准确性。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本发明一实施例确定函数调用关系的方法流程示意图;
图2为本发明另一实施例确定函数调用关系的方法流程示意图;
图3为本发明另一实施例确定函数调用关系的方法流程示意图;
图4为本发明另一实施例确定函数调用关系的方法流程示意图;
图5为本发明一实施例确定函数调用关系的方法中前向搜索应用流程示意图;
图6为本发明一实施例确定函数调用关系的方法中后向搜索应用流程示意图;
图7为本发明一实施例确定函数调用关系的装置构成示意图;
图8为本发明另一实施例确定函数调用关系的装置构成示意图;
图9为本发明另一实施例确定函数调用关系的装置构成示意图;
图10为本发明另一实施例确定函数调用关系的装置构成示意图;
图11为本发明一实施例确定函数调用关系的装置中前向搜索单元、后向搜索单元关系示意图;
图12为本发明一实施例提供的确定函数调用关系的系统结构示意图;
图13为本发明一实施例确定函数调用关系的系统应用场景示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
基于现有技术中,在mips构架下,不再使用帧寄存器来保存函数栈帧,暴力法追溯函数调用关系的准确率不高的缺陷。本发明的实施例提供了一种确定函数调用关系的方法及装置,在不使用帧寄存器来保存函数栈帧的情况下,程序异常或调试程序时,通过从函数的当前代码段指令地址处开始向高地址方向搜索以及从代码段地址处开始向低地址方向搜索,通过双向追溯函数调用关系,从而准确的确定函数的栈帧,得到函数的返回地址,提高追溯函数调用关系的准确性。
本发明实施例一
如图1所示,本发明实施例提供一种确定函数调用关系的方法,包括:
11、从函数的当前代码段指令地址处开始向高地址方向搜索指令,获得所述函数的第一SP(Stack Pointer,堆栈指针)偏移值。
12、从所述代码段指令地址处开始向低地址方向搜索指令,获得所述函数的第二SP偏移值,以及获得保存函数返回地址的地址相对函数的栈帧的偏移值。
13、根据所述第一SP偏移值及第二SP偏移值获得所述函数的SP偏移值,当所述SP偏移值符合预设要求时,所述函数的堆栈指针指向所述函数的栈帧,根据所述函数的栈帧及所述保存函数返回地址的地址相对函数的栈帧的偏移值,得到所述函数的返回地址。
步骤11中,从函数的当前代码段指令地址PC处开始向高地址方向搜索,可以理解为前向搜索方式。步骤12中,从所述代码段地址处PC开始向低地址方向搜索,可以理解为后向搜索方式。步骤11、12可以理解为双向追溯函数调用关系的方式,除去代码段的干扰指令,从而准确的获得函数的栈帧。
步骤13中,当函数的SP偏移值符合预设要求时,函数的堆栈指针指向函数的栈帧,根据函数的栈帧及保存函数返回地址的地址相对函数的栈帧的偏移值,得到保存函数的返回地址的地址,最后读出函数的返回地址。
可以理解的,所述当前代码段指令地址包括函数异常时或调试函数时对应的代码段指令地址。对应的,可以从SP寄存器中读出函数异常时或调试函数时,函数的堆栈指针SP,在此不作赘述。
在本发明实施例,mips指令可以包括:
jr ra——返回指令:ra是硬件寄存器,保存的是函数的返回地址。该条指令就是读ra值并返回到上层函数调用。
addiu,sp,sp,offset——栈调整指令:offset为SP偏移值,可为正、负数常量。该条指令用于堆栈指针向低地址方向增长时,offset为负时,保留堆栈空间,或offset为正时,释放堆栈空间。或者,堆栈指针向高地址方向增长时,offset为正时,保留堆栈空间,offset为负时,释放堆栈空间,在此不作赘述。
sd ra,ra_offset(sp)——保存函数返回地址指令:ra_offset为保存函数返回地址的地址相对栈帧的偏移值,ra_offset为常量。该条指令用于将ra寄存器的值,也就是函数返回地址保存到堆栈中。
代码段的干扰指令可以通过以下一个简单例子得以理解,如,对gcc生成的mips程序进行反汇编后可以找到类似的代码片段,其中,代码段地指由低向高方向增长,且程序出现了异常:
addiu sp,sp,-offset
sd ra,ra_offset(sp)
addiu sp,sp,-offset2;干扰指令
…←pc:出问题时在此处
addiu sp,sp,+offset2;干扰指令
jr ra
addiu sp,sp,+offset
基于程序出现了异常,假设从pc处开始追溯调用关系,根据符号表,得到pc所在函数的起始地址。对于非叶子函数的情况,从函数起始处搜索第一条addiu sp,sp,offset(此处offset为负数,其绝对值表示栈帧的大小)指令,这条指令就是建立栈帧的指令,还有保存函数返回地址的指令sd ra,ra_offset(sp)(ra_offset表示保存返回地址所在地址相对栈帧的偏移),offset和ra_offset都是常量且都能读出其值。sp+offset就是上层函数的栈帧,有了ra_offset和sp就可以得到堆栈中保存函数的返回地址的所在地址,从而读出保存在堆栈中的函数的返回地址。这样循环下去就能得到函数的调用流程。
但是,在addiu sp,sp,-offset指令之后,还有addiu sp,sp,-offset2指令和addiu sp,sp,+offset2指令,其二者都是影响函数的栈帧的干扰指令,上层函数的栈帧应该是sp+offset+offset2,而非sp+offset。可见,代码段的干扰指令,影响了获得函数的栈帧的准确性。
由上述本发明的实施例提供的技术方案可以看出,从函数的当前代码段指令地址处开始向高地址方向搜索以及从代码段地址处开始向低地址方向搜索,通过双向追溯函数调用关系,从而准确的确定函数的栈帧,得到函数的返回地址,提高追溯函数调用关系的准确性。
如图2所示,可选的,从函数的当前代码段指令地址处开始向高地址方向搜索指令,获得所述函数的第一SP偏移值的步骤11,可以包括:
21、从函数的当前代码段指令地址PC处开始向高地址PC+n方向搜索指令,所述n值递增;
22、获得各栈调整指令中SP偏移值的累加和作为第一SP偏移值,所述第一SP偏移值为正值或负值。
值得注意的是,第一SP偏移值为各条栈调整指令中SP偏移值的累加和。
可以知道,栈调整指令中SP偏移值包括正值或负值,则SP偏移值的累加和,即第一SP偏移值也可能是正值或负值,或者也可能是0。
如图3所示,可选的,从所述代码段指令地址处开始向低地址方向搜索指令,获得所述函数的第二SP偏移值,以及获得保存函数返回地址的地址相对函数的栈帧的偏移值的步骤12,可以包括:
31、从函数的当前代码段指令地址PC处开始向低地址PC-m方向搜索指令,所述m值递减;
32、获得栈调整指令中SP偏移值作为第二SP偏移值,所述第二SP偏移值为正值或负值;
33、获得保存函数返回地址指令中偏移值,所述偏移值为保存函数返回地址的地址相对函数的栈帧的偏移。
值得注意的是,第二SP偏移值为各条栈调整指令中SP偏移值,从函数的当前代码段指令地址PC处开始向低地址PC-m方向搜索指令,每得到一条栈调整指令,将栈调整指令中SP偏移值作为第二SP偏移值。栈调整指令中SP偏移值包括正值或负值,即第二SP偏移值也可能是正值或负值。
可选的,所述SP偏移值的预设要求,可以包括:
SP向低地址方向增长时,所述SP偏移值为负值,所述函数的堆栈指针指向所述函数的栈帧;或者,
SP向高地址方向增长时,所述SP偏移值为正值,所述函数的堆栈指针指向所述函数的栈帧。
如图4所示,可选的,步骤13中,根据所述第一SP偏移值及第二SP偏移值获得所述函数的SP偏移值,当所述SP偏移值符合预设要求时,所述函数的堆栈指针指向所述函数的栈帧,可以包括:
41、获得函数异常时或调试函数时所述函数的堆栈指针;
42、将所述第一SP偏移值及第二SP偏移值累加获得所述函数的SP偏移值;
43、确定所述SP偏移值符合预设要求,所述函数的堆栈指针指向所述函数的栈帧。
或者,确定所述SP偏移值不符合预设要求:
根据所述第二SP偏移值调整所述函数的堆栈指针;
之后,确定所述SP偏移值符合预设要求时,所述调整后的函数堆栈指针指向所述函数的栈帧。
具体的以一个事例说明,从函数的当前代码段指令地址PC处开始向低地址PC-m方向搜索指令,如得到一条栈调整指令,将栈调整指令中SP偏移值作为第二SP偏移值。将第二SP偏移值及第一SP偏移值累加后作为累加值。在SP向低地址方向增长的前提下,如果累加值为正则不符合预设要求,根据第二SP偏移值调整函数的堆栈指针。
继续搜索,如又得到一条栈调整指令,将栈调整指令中SP偏移值作为第二SP偏移值。将这个新得到的第二SP偏移值与之前得到的累加值相累加。如果累加值为负则符合预设要求,此时函数的堆栈指针(即累加值为正不符合预设要求时,调整过的函数的堆栈指针)指向所述函数的栈帧。这样,根据函数的栈帧以及保存函数返回地址的地址相对函数的栈帧的偏移值,可以得到保存函数返回地址的地址,最后读出函数返回地址。根据这个新得到的第二SP偏移值再次调整函数的堆栈指针,调整后的函数的堆栈指针指向上层函数的栈帧。
可选的,步骤11,可以具体通过依次分析地址PG+n的指令与地址PC+1+n的指令,获得栈调整指令中SP偏移值的累加和作为函数的SP偏移值,可以包括:
搜索到地址PC+n的指令为栈调整指令;
搜索到地址PC+1+n的指令不为返回调用的指令或栈调整指令,累加并保存栈调整指令中SP偏移值。
可选的,依次分析地址PC+n的指令与地址PC+1+n的指令,可以包括:
搜索到地址PC+n的指令为栈调整指令;搜索到地址PC+1+n的指令为返回调用的指令,则进入从所述代码段地址处开始向低地址方向搜索的步骤。
或者,搜索到地址PC+n的指令为返回调用的指令,搜索到地址PC+1+n的指令为栈调整指令,则进入从所述代码段地址处开始向低地址方向搜索的步骤。
或者,搜索到地址PC+n的指令为返回调用的指令,搜索到地址PC+1+n的指令不为栈调整指令或返回调用的指令,则进入从所述代码段地址处开始向低地址方向搜索的步骤。
注意,当搜索到地址PC+n的指令为返回调用的指令,且函数的第一SP偏移值为0,所述函数为叶子函数,返回地址在ra寄存器内,直接返回ra寄存器的值即可。
可选的,依次分析地址PC-m的指令与地址PC-m-1的指令,获得栈调整指令中SP偏移值与所述函数的第一SP偏移值进行累加,可以包括:
搜索到地址PC-m-1的指令为栈调整指令;
搜索到地址PC-m的指令不为栈调整指令或返回调用的指令,则累加栈调整指令中SP偏移值与函数的第一SP偏移值。
由上述本发明的实施例提供的技术方案可以看出,从函数的当前代码段指令地址处开始向高地址方向搜索以及从代码段地址处开始向低地址方向搜索,通过双向追溯函数调用关系,从而准确的确定函数的栈帧,得到函数的返回地址,提高追溯函数调用关系的准确性。
具体而言,参见图5,说明本发明实施例确定函数调用关系的方法前向搜索应用流程,其中,前向搜索forward_search需要函数的当前代码段指令地址PC以及函数的堆栈指针SP地址作为参数。如果forward_search从异常出口返回,则终止整个追溯流程,否则的话,流程最终都应该进入后向搜索backward_search流程。
1、根据PC值搜索代码段得到代码指令,如果搜索到的指令不是jr ra或者addiu,sp,sp.offset的话就递增PC的值,继续往代码段高地址方向搜索。
2、如果搜索到的是jr ra指令。
(1)如果累计的addiu,sp,sp,offset指令(图中addiu,sp是addiu,sp,sp,offset指令的缩写)的offset值为0,且这是叶子函数,则返回地址保存在ra寄存器中,直接返回ra即可。
(2)如果jr ra指令的下一条指令是addiu,sp,sp,offset指令,则进入backward_search流程。
(3)如果jr ra指令的下一条指令是jr ra指令,则异常。
(4)否则的话,进入backward_search流程。
3、如果搜索到的是addiu,sp,sp,offset指令。
(1)如果addiu,sp,sp,offset指令的下一条指令是jr ra指令,则进入backward_search流程。
(2)如果addiu,sp,sp,offset指令的下一条指令是addiu,sp,sp,offset指令,则异常。
(3)否则的话,累加并保存遇到的addiu指令的offset值。将流程跳转到步骤1递增PC的值继续进行forward_search。
参见图6,说明本发明实施例确定函数调用关系的方法后向搜索应用流程,其中,传入给backward_search的SP和PC值就是传递给forward_search的原始值。同时,forward_search中步骤3的(3)累计的offset值也要传递给backward_search作为参数。如果backward_search从异常出口返回,则终止整个追溯流程。
1、根据PC值搜索代码段得到代码指令,如果搜索到的指令不是jr ra或者addiu,sp,sp,offset的话跳转到步骤4。
2、如果搜索到的是ja ra指令。
如果ja ra指令的前一条指令是addiu,sp,sp,offset指令(图中addiu,sp是addiu,sp,sp,offset指令的缩写),则将PC递减,这样在下一轮的搜索中这条addiu,sp,sp,offset指令不会被搜索。然后跳转到步骤4。
如果ja ra指令的前一条指令是jr ra指令,则异常。
否则的话,跳转到步骤4。
3、如果搜索到的是addiu,sp,sp,offset指令。
如果addiu,sp,sp,offset指令的前一条指令是jr ra指令,则将PC递减,这样在下一轮的搜索中这条jr ra指令不会被搜索。然后跳转到步骤4。
如果addiu,sp,sp,offset指令的前一条指令是addiu,sp,sp,offset指令,则异常。
否则的话,在forward_search中累加的addiu指令的offset值基础上继续累加。同时,根据addiu的offset调整SP指针。
(1)如果上述继续累加的累加值不为负数,则跳转到步骤4。
(2)如果上述继续累加的累加值为负数,则步骤5得到的最新的ra_value就是函数的返回地址,而此时SP指向的也是上层函数堆栈区。
4、如果搜索到的不是sd ra,ra_offset(sp)指令(sd ra是sd ra,ra_offset(sp)指令的缩写),则将流程跳转到步骤1并递减PC的值继续进行backward_search。
5、如果搜索到的是sd ra,ra_offset(sp)指令,则根据步骤4的(2)最新调整过的SP值和sd ra,ra_offset(sp)指令的ra_offset读出保存在堆栈中的值ra_value,然后将流程跳转到步骤1并递减PC的值继续进行backward_search。
参见上述forward_search和backward_search,循环下去就能得到函数的调用流程。
由上述本发明的实施例提供的技术方案可以看出,从函数的当前代码段指令地址处开始向高地址方向搜索以及从代码段地址处开始向低地址方向搜索,通过双向追溯函数调用关系,从而准确的确定函数的栈帧,得到函数的返回地址,提高追溯函数调用关系的准确性。
本发明实施例二
如图7所示,本发明实施例提供一种确定函数调用关系的装置,包括:
前向搜索单元71,用于从函数的当前代码段指令地址处开始向高地址方向搜索指令,获得所述函数的第一SP偏移值;
后向搜索单元72,用于从所述代码段指令地址处开始向低地址方向搜索指令,获得所述函数的第二SP偏移值,以及获得保存函数返回地址的地址相对函数的栈帧的偏移值;
确定单元73,用于根据所述第一SP偏移值及第二SP偏移值获得所述函数的SP偏移值,当所述SP偏移值符合预设要求时,所述函数的堆栈指针指向所述函数的栈帧,根据所述函数的栈帧及所述偏移值,得到所述函数的返回地址。
所述当前代码段指令地址包括函数异常时或调试函数时对应的代码段指令地址。
所述SP偏移值的预设要求,包括:
SP向低地址方向增长时,所述SP偏移值为负值,所述函数的堆栈指针指向所述函数的栈帧;或者,
SP向高地址方向增长时,所述SP偏移值为正值,所述函数的堆栈指针指向所述函数的栈帧。
本发明实施例确定函数调用关系的装置,可以理解为双向追溯组件,从函数的当前代码段指令地址处开始向高地址方向搜索以及从代码段地址处开始向低地址方向搜索,通过双向追溯函数调用关系,剔除掉代码段的干扰指令,从而准确的获得函数的栈帧,提高追溯函数调用关系的准确性。
如图8所示,可选的,前向搜索单元71,可以包括:
第一搜索单元81,用于从函数的当前代码段指令地址PC处开始向高地址PC+n方向搜索指令,所述n值递增。
第一获取单元82,用于获得各栈调整指令中SP偏移值的累加和作为第一SP偏移值,所述第一SP偏移值为正值或负值。
如图9所示,可选的,后向搜索单元72,可以包括:
第二搜索单元91,用于从函数的当前代码段指令地址PC处开始向低地址PC-m方向搜索指令,所述m值递减。
第二获取单元92,用于获得栈调整指令中SP偏移值作为第二SP偏移值,所述第二SP偏移值为正值或负值,以及获得保存函数返回地址指令中偏移值,所述偏移值为保存函数返回地址的地址相对函数的栈帧的偏移。
如图10所示,可选的,确定单元73,可以包括:
第三获取单元101,用于获得函数异常时或调试函数时所述函数的堆栈指针。
第四获取单元102,用于将所述第一SP偏移值及第二SP偏移值累加获得所述函数的SP偏移值。
第一确定子单元103,用于确定所述SP偏移值符合预设要求,所述函数的SP指向所述函数的栈帧。
可选的,确定单元73,还可以包括:
调整子单元104,用于确定所述SP偏移值不符合预设要求,根据所述第二SP偏移值调整所述函数的堆栈指针。当所述第一确定子单元确定所述SP偏移值符合预设要求时,调整子单元调整后的堆栈指针指向所述函数的栈帧。
可选的,确定单元73,还可以包括:
第二确定子单元105,用于根据所述函数的栈帧及所述偏移值,得到所述函数的返回地址。
读取子单元106,用于从所述保存函数返回地址的地址中读出所述函数的返回地址。
可选的,前向搜索单元71,还可以包括:
跳转单元,用于搜索到地址PC+n的指令为栈调整指令;搜索到地址PC+1+n的指令为返回调用的指令,则进入从所述代码段地址处开始向低地址方向搜索的步骤;或者,搜索到地址PC+n的指令为返回调用的指令,搜索到地址PC+1+n的指令为栈调整指令,则进入从所述代码段地址处开始向低地址方向搜索的步骤;或者,搜索到地址PC+n的指令为返回调用的指令,搜索到地址PC+1+n的指令不为栈调整指令或返回调用的指令,则进入从所述代码段地址处开始向低地址方向搜索的步骤。
如图11所示,本发明实施例确定函数调用关系的装置中前向搜索单元、后向搜索单元关系示意图:
入口输入SP、PC值。
forward_search搜索结束后会得到addiu指令累计的offset值,把累计的offset值和SP以及PC一起作为参数传递给backward_search。
backward_search会根据输入的参数通过指令分析得到指向上层函数堆栈区的SP和保存在堆栈中的函数返回地址。
最后,返回上层函数SP和函数返回地址。
本发明实施例确定函数调用关系的装置及其各构成部分的功能等,可以依据上述本发明实施例确定函数调用关系的方法得以理解,在此不展开重复描述。
由上述本发明的实施例提供的技术方案可以看出,通过从函数的当前代码段指令地址处开始向高地址方向搜索以及从代码段地址处开始向低地址方向搜索,通过双向追溯函数调用关系,从而准确的确定函数的栈帧,得到函数的返回地址,提高追溯函数调用关系的准确性。
本发明实施例三
如图12所示,本发明实施例提供一种确定函数调用关系的系统,包括上述实施例提供的确定函数调用关系的装置1和用户接口2。
确定函数调用关系的装置用于通过用户接口接收用户的函数调用命令,通过分析映射到内存的进程用户态代码段指令,追溯出函数的返回地址和SP值。
本发明实施例确定函数调用关系的装置及其各构成部分的功能等,可以依据上述本发明实施例确定函数调用关系的装置得以理解,在此不展开重复描述。
本发明具体实施方式
如图13所示本发明实施例确定函数调用关系的系统应用场景示意图,用于确定在linux平台下任何时刻打印某个进程或所有进程的函数调用关系:
本发明实施例确定函数调用关系的系统,可以包括用户操作接口和内核功能模块以及输出模块。确定函数调用关系的装置如内核功能模块中的双向追溯组件。具体而言,确定函数调用关系的过程,包括:
1、用户操作接口PROC/snapshot基于linux提供的proc文件系统。
/proc/snapshot文件就是用户接口,用户传递如下命令给内核功能模块:
echo-p pid/proc/snapshot;输出进程号为pid的进程的函数调用关系。
echo-s/proc/snapshot;输出整个系统的进程的函数调用关系。
2、内核功能模块SNAPSHOT_MODULES,按流程处理顺序,其由三个部分组成。
FREEZE_PROCESS(进程冻结)组件:让所有进程都进入内核态,这样才能跟踪用户栈得到调用关系。
STACK_BACKTRACE(栈回溯)组件:根据用户接口传入的pid找到对应的进程控制块或遍历系统所有的进程控制块。从进程控制块得到进程进入内核态前的用户栈SP,PC值。将这2个值作为参数传递给双向追溯组件,而双向追溯组件会返回函数的返回地址和上层函数SP值。STACK_BACKTRACE组件会调用输出模块输出函数的返回地址,同时这个返回地址和上层函数SP值又会被传递给双向追溯组件,进一步得到更上层的返回地址和SP值,以此循环追溯整个调用流程。
双向追溯组件:双向追溯算法实现。以SP值和PC值为参数,通过分析映射到内存的进程用户态代码段指令,追溯出函数的返回地址和SP值。
在一个实施例中,内核功能模块中的双向追溯组件的结构和功能如上述实施例中确定函数调用关系的装置所述,在此不再赘述。
3、输出模块实现基于linux提供的printk机制。
用户可直接使用dmesg命令查看输出的函数返回地址序列。形式为:
<backtrace>
ADDR_A ADDR_B ADDR_C
</backtrace>
ADDR_A ADDR_B ADDR_C都是函数的返回地址,其调用关系为,C所在函数调用B,B所在函数调用A。如果有符号表,就能根据这个地址找到具体的函数名。
由上述本发明的实施例提供的技术方案可以看出,从函数的当前代码段指令地址处开始向高地址方向搜索以及从代码段地址处开始向低地址方向搜索,通过双向追溯函数调用关系,剔除掉代码段的干扰指令,从而准确的获得函数的栈帧,得到函数的返回地址,提高追溯函数调用关系的准确性。
需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明所必须的。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random Access Memory,RAM)等。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。

Claims (13)

1.一种确定函数调用关系的方法,其特征在于,包括:
从函数的当前代码段指令地址处开始向高地址方向搜索指令,获得所述函数的第一堆栈指针SP偏移值;
从所述代码段指令地址处开始向低地址方向搜索指令,获得所述函数的第二SP偏移值,以及获得保存函数返回地址的地址相对函数的栈帧的偏移值;
根据所述第一SP偏移值及第二SP偏移值获得所述函数的SP偏移值,当所述SP偏移值符合预设要求时,所述函数的堆栈指针指向所述函数的栈帧,根据所述函数的栈帧及所述保存函数返回地址的地址相对函数的栈帧的偏移值,得到所述函数的返回地址。
2.根据权利要求1所述的确定函数调用关系的方法,其特征在于,所述当前代码段指令地址包括函数异常时或调试函数时对应的代码段指令地址。
3.根据权利要求1所述的确定函数调用关系的方法,其特征在于,从函数的当前代码段指令地址处开始向高地址方向搜索指令,获得所述函数的第一SP偏移值,包括:
从函数的当前代码段指令地址PC处开始向高地址PC+n方向搜索指令,所述n值递增;
获得各栈调整指令中SP偏移值的累加和作为第一SP偏移值,所述第一SP偏移值为正值或负值。
4.根据权利要求1所述的确定函数调用关系的方法,其特征在于,从所述代码段指令地址处开始向低地址方向搜索指令,获得所述函数的第二SP偏移值,以及获得保存函数返回地址的地址相对函数的栈帧的偏移值,包括:
从函数的当前代码段指令地址PC处开始向低地址PC-m方向搜索指令,所述m值递减;
获得栈调整指令中SP偏移值作为第二SP偏移值,所述第二SP偏移值为正值或负值;
获得保存函数返回地址指令中偏移值,所述偏移值为保存函数返回地址的地址相对函数的栈帧的偏移。
5.根据权利要求1所述的确定函数调用关系的方法,其特征在于,所述SP偏移值的预设要求,包括:
SP向低地址方向增长时,所述SP偏移值的预设要求为所述SP偏移值为负值,所述函数的堆栈指针指向所述函数的栈帧;或者,
SP向高地址方向增长时,所述SP偏移值的预设要求为所述SP偏移值为正值,所述函数的堆栈指针指向所述函数的栈帧。
6.根据权利要求5所述的确定函数调用关系的方法,其特征在于,根据所述第一SP偏移值及第二SP偏移值获得所述函数的SP偏移值,当所述SP偏移值符合预设要求时,所述函数的堆栈指针指向所述函数的栈帧,包括:
获得函数异常时或调试函数时所述函数的堆栈指针;
将所述第一SP偏移值及第二SP偏移值累加获得所述函数的SP偏移值;
确定所述SP偏移值符合预设要求,所述函数的堆栈指针指向所述函数的栈帧。
7.根据权利要求6所述的确定函数调用关系的方法,其特征在于,所述方法还包括,根据所述第一SP偏移值及第二SP偏移值获得所述函数的SP偏移值,确定所述SP偏移值不符合预设要求:
根据所述第二SP偏移值调整所述函数的堆栈指针;
确定所述SP偏移值符合预设要求时,所述调整后的函数堆栈指针指向所述函数的栈帧。
8.一种确定函数调用关系的装置,其特征在于,包括:
前向搜索单元,用于从函数的当前代码段指令地址处开始向高地址方向搜索指令,获得所述函数的第一SP偏移值;
后向搜索单元,用于从所述代码段指令地址处开始向低地址方向搜索指令,获得所述函数的第二SP偏移值,以及获得保存函数返回地址的地址相对函数的栈帧的偏移值;
确定单元,用于根据所述第一SP偏移值及第二SP偏移值获得所述函数的SP偏移值,当所述SP偏移值符合预设要求时,所述函数的堆栈指针指向所述函数的栈帧,根据所述函数的栈帧及所述保存函数返回地址的地址相对函数的栈帧的偏移值,得到所述函数的返回地址。
9.根据权利要求8所述的确定函数调用关系的装置,其特征在于,所述前向搜索单元,包括:
第一搜索单元,用于从函数的当前代码段指令地址PC处开始向高地址PC+n方向搜索指令,所述n值递增;
第一获取单元,用于获得各栈调整指令中SP偏移值的累加和作为第一SP偏移值,所述第一SP偏移值为正值或负值。
10.根据权利要求8所述的确定函数调用关系的装置,其特征在于,所述后向搜索单元,包括:
第二搜索单元,用于从函数的当前代码段指令地址PC处开始向低地址PC-m方向搜索指令,所述m值递减;
第二获取单元,用于获得栈调整指令中SP偏移值作为第二SP偏移值,所述第二SP偏移值为正值或负值,以及获得保存函数返回地址指令中偏移值,所述偏移值为保存函数返回地址的地址相对函数的栈帧的偏移。
11.根据权利要求8所述的确定函数调用关系的装置,其特征在于,所述确定单元,包括:
第三获取单元,用于获得函数异常时或调试函数时所述函数的堆栈指针;
第四获取单元,用于将所述第一SP偏移值及第二SP偏移值累加获得所述函数的SP偏移值;
第一确定子单元,用于确定所述SP偏移值符合预设要求,所述函数的堆栈指针指向所述函数的栈帧。
12.根据权利要求11所述的确定函数调用关系的装置,其特征在于,所述确定单元,还包括:
调整子单元,用于确定所述SP偏移值不符合预设要求,根据所述第二SP偏移值调整所述函数的堆栈指针;
当所述第一确定子单元确定所述SP偏移值符合预设要求时,所述调整子单元调整后的堆栈指针指向所述函数的栈帧。
13.一种确定函数调用关系的系统,其特征在于,包括用户接口和如权利要求8-12中任一所述的确定函数调用关系的装置;
所述确定函数调用关系的装置用于通过所述用户接口接收用户的函数调用命令,通过分析映射到内存的进程用户态代码段指令,追溯出函数的返回地址和SP值。
CN200910261275.XA 2009-12-24 2009-12-24 确定函数调用关系的方法、装置及系统 Expired - Fee Related CN102109975B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN200910261275.XA CN102109975B (zh) 2009-12-24 2009-12-24 确定函数调用关系的方法、装置及系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN200910261275.XA CN102109975B (zh) 2009-12-24 2009-12-24 确定函数调用关系的方法、装置及系统

Publications (2)

Publication Number Publication Date
CN102109975A true CN102109975A (zh) 2011-06-29
CN102109975B CN102109975B (zh) 2015-03-11

Family

ID=44174153

Family Applications (1)

Application Number Title Priority Date Filing Date
CN200910261275.XA Expired - Fee Related CN102109975B (zh) 2009-12-24 2009-12-24 确定函数调用关系的方法、装置及系统

Country Status (1)

Country Link
CN (1) CN102109975B (zh)

Cited By (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103019787A (zh) * 2012-12-14 2013-04-03 华为技术有限公司 函数调用关系确定方法、热补丁升级方法及装置
CN103858100A (zh) * 2011-10-03 2014-06-11 国际商业机器公司 采用解码时间指令优化编译用于增强应用二进制接口(abi)的代码
CN103942083A (zh) * 2014-04-28 2014-07-23 中国人民解放军国防科学技术大学 一种面向可变参函数的编译实现方法
CN104484179A (zh) * 2014-12-23 2015-04-01 上海斐讯数据通信技术有限公司 一种栈回溯方法
CN104641347A (zh) * 2013-03-11 2015-05-20 华为技术有限公司 函数调用方法、装置和终端设备
CN106294095A (zh) * 2015-05-13 2017-01-04 苏州简约纳电子有限公司 一种跟踪嵌入式系统函数调用轨迹的方法
CN103019663B (zh) * 2011-09-26 2017-03-15 中兴通讯股份有限公司 一种获取程序中模块间函数接口的方法和系统
CN107122164A (zh) * 2017-03-31 2017-09-01 腾讯科技(深圳)有限公司 函数地址获取及应用其的方法、装置、设备及存储介质
CN107515769A (zh) * 2016-06-16 2017-12-26 中兴通讯股份有限公司 一种变量信息提取方法及装置
CN110046497A (zh) * 2018-01-16 2019-07-23 腾讯科技(深圳)有限公司 一种函数挂钩实现方法、装置和存储介质
CN110489165A (zh) * 2019-08-02 2019-11-22 北京字节跳动网络技术有限公司 获取调用栈栈帧指令偏移的方法、装置、介质和设备
CN113238800A (zh) * 2021-05-25 2021-08-10 上海安路信息科技股份有限公司 堆栈结构和函数调用方法及系统
CN113238883A (zh) * 2021-04-30 2021-08-10 烽火通信科技股份有限公司 一种堆栈回溯的方法及装置
WO2023016485A1 (zh) * 2021-08-12 2023-02-16 华为技术有限公司 用于获取函数调用信息的方法、装置、电子设备和介质

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101176060A (zh) * 2005-03-23 2008-05-07 高通股份有限公司 每索引存储两个或更多分支目标地址的分支目标地址高速缓冲存储器
CN101630269A (zh) * 2009-07-03 2010-01-20 中国人民解放军国防科学技术大学 基于块对目标代码扫描并替换敏感指令的方法
CN101727365A (zh) * 2008-10-29 2010-06-09 联发科技股份有限公司 电子设备,修补装置及方法
CN101799763A (zh) * 2009-02-10 2010-08-11 华为技术有限公司 内核在线补丁的方法、装置和系统

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101176060A (zh) * 2005-03-23 2008-05-07 高通股份有限公司 每索引存储两个或更多分支目标地址的分支目标地址高速缓冲存储器
CN101727365A (zh) * 2008-10-29 2010-06-09 联发科技股份有限公司 电子设备,修补装置及方法
CN101799763A (zh) * 2009-02-10 2010-08-11 华为技术有限公司 内核在线补丁的方法、装置和系统
CN101630269A (zh) * 2009-07-03 2010-01-20 中国人民解放军国防科学技术大学 基于块对目标代码扫描并替换敏感指令的方法

Cited By (19)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103019663B (zh) * 2011-09-26 2017-03-15 中兴通讯股份有限公司 一种获取程序中模块间函数接口的方法和系统
CN103858100A (zh) * 2011-10-03 2014-06-11 国际商业机器公司 采用解码时间指令优化编译用于增强应用二进制接口(abi)的代码
CN103858100B (zh) * 2011-10-03 2017-02-15 国际商业机器公司 优化编译用于增强应用二进制接口的代码的系统和方法
CN103019787A (zh) * 2012-12-14 2013-04-03 华为技术有限公司 函数调用关系确定方法、热补丁升级方法及装置
CN104641347A (zh) * 2013-03-11 2015-05-20 华为技术有限公司 函数调用方法、装置和终端设备
CN103942083A (zh) * 2014-04-28 2014-07-23 中国人民解放军国防科学技术大学 一种面向可变参函数的编译实现方法
CN103942083B (zh) * 2014-04-28 2017-10-17 中国人民解放军国防科学技术大学 一种面向可变参函数的编译实现方法
CN104484179A (zh) * 2014-12-23 2015-04-01 上海斐讯数据通信技术有限公司 一种栈回溯方法
CN106294095A (zh) * 2015-05-13 2017-01-04 苏州简约纳电子有限公司 一种跟踪嵌入式系统函数调用轨迹的方法
CN107515769A (zh) * 2016-06-16 2017-12-26 中兴通讯股份有限公司 一种变量信息提取方法及装置
CN107122164A (zh) * 2017-03-31 2017-09-01 腾讯科技(深圳)有限公司 函数地址获取及应用其的方法、装置、设备及存储介质
CN107122164B (zh) * 2017-03-31 2023-04-07 腾讯科技(深圳)有限公司 函数地址获取及应用其的方法、装置、设备及存储介质
CN110046497A (zh) * 2018-01-16 2019-07-23 腾讯科技(深圳)有限公司 一种函数挂钩实现方法、装置和存储介质
CN110046497B (zh) * 2018-01-16 2023-06-20 腾讯科技(深圳)有限公司 一种函数挂钩实现方法、装置和存储介质
CN110489165A (zh) * 2019-08-02 2019-11-22 北京字节跳动网络技术有限公司 获取调用栈栈帧指令偏移的方法、装置、介质和设备
CN110489165B (zh) * 2019-08-02 2021-10-15 北京字节跳动网络技术有限公司 获取调用栈栈帧指令偏移的方法、装置、介质和设备
CN113238883A (zh) * 2021-04-30 2021-08-10 烽火通信科技股份有限公司 一种堆栈回溯的方法及装置
CN113238800A (zh) * 2021-05-25 2021-08-10 上海安路信息科技股份有限公司 堆栈结构和函数调用方法及系统
WO2023016485A1 (zh) * 2021-08-12 2023-02-16 华为技术有限公司 用于获取函数调用信息的方法、装置、电子设备和介质

Also Published As

Publication number Publication date
CN102109975B (zh) 2015-03-11

Similar Documents

Publication Publication Date Title
CN102109975A (zh) 确定函数调用关系的方法、装置及系统
US6981248B2 (en) Conditional breakpoint encountered indication
US8261130B2 (en) Program code trace signature
US7454663B2 (en) Method and circuitry for debugging/updating ROM
WO2009087158A4 (en) Compare and branch facility and instruction therefore
US8156486B2 (en) Patching devices and methods thereof for patching firmware functions
CN103019787B (zh) 函数调用关系确定方法、热补丁升级方法及装置
EP1172729A3 (en) Apparatus and method for cataloguing symbolic data for use in performance analysis of computer programs
US20140019741A1 (en) Method and system for booting electronic device from nand flash memory
EP2713519A1 (en) Electronic counter in non-volatile limited endurance memory
US10282436B2 (en) Memory apparatus for in-place regular expression search
CN103577547A (zh) 网页类型识别方法及装置
US20030051119A1 (en) Scheme for implementing breakpoints for on-chip ROM code patching
CN1710547A (zh) 软件测试方法及其系统
CN110502443A (zh) 冗余代码检测方法、检测模块、电子设备及计算机存储介质
CN110580220A (zh) 测量代码段执行时间的方法及终端设备
CN112000628B (zh) 多通道激光雷达数据存储方法、装置及电子设备
CN112416360A (zh) 热补丁的生成方法、装置和服务器
CN103823725A (zh) 除错装置与除错方法
EP1517336A3 (en) Method for facilitating error detection for content addressable memory
CN106649364B (zh) 一种表格目标列定位方法及装置
CN110515655B (zh) 一种数据指令分析方法
CN110489258A (zh) 一种基于xtensa处理器的栈回溯方法及装置
Bohm et al. Compiling ATR probing codes for execution on FPGA hardware
CN114443456A (zh) 调试方法和相关产品

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
TR01 Transfer of patent right
TR01 Transfer of patent right

Effective date of registration: 20170706

Address after: 510640 Guangdong City, Tianhe District Province, No. five, road, public education building, unit 371-1, unit 2401

Patentee after: Guangdong Gaohang Intellectual Property Operation Co., Ltd.

Address before: 518129 Bantian HUAWEI headquarters office building, Longgang District, Guangdong, Shenzhen

Patentee before: Huawei Technologies Co., Ltd.

CB03 Change of inventor or designer information

Inventor after: Pang Shuangying

Inventor before: Li Ning

CB03 Change of inventor or designer information
TR01 Transfer of patent right

Effective date of registration: 20170911

Address after: 056000, Hebei Province, Feixiang City, Handan province old shop Township East Xin Zhai village, No. 014

Patentee after: Pang Shuangying

Address before: 510640 Guangdong City, Tianhe District Province, No. five, road, public education building, unit 371-1, unit 2401

Patentee before: Guangdong Gaohang Intellectual Property Operation Co., Ltd.

TR01 Transfer of patent right
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20150311

Termination date: 20191224

CF01 Termination of patent right due to non-payment of annual fee