面向容量受限的程序栈空间深度追溯方法与流程

文档序号:24154170发布日期:2021-03-05 10:20阅读:200来源:国知局
面向容量受限的程序栈空间深度追溯方法与流程

[0001]
本发明涉及一种面向容量受限的程序栈空间深度追溯方法,属于计算机技术领域。


背景技术:

[0002]
对于一些容量受限的精简处理器核心,函数栈空间深度是影响程序性能的关键。由于栈空间是程序运行过程中动态申请使用,其实际大小难以预估。目前计算程序栈空间深度的方法,一般是编译时在每个函数开始插桩记录栈指针的统计函数,程序运行过程中记录下栈指针在函数调用流程中的值的变化,从而通过计算初始栈指针与栈指针值为最小时的差值来获取程序运行过程中的最大栈空间深度。
[0003]
现有的栈空间深度计算方法存在着如下缺陷:一是程序需要重新编译进行插桩,对于遗产代码适应性差,且需要预先运行一遍获取栈空间深度,比较麻烦;二是在容量受限的情况下,经常遇到的情况是栈空间不足,在这种情况下,程序会因为栈空间溢出而无法正常执行,也就无法获取正确的栈空间深度了;三是这种技术只能获取程序运行过程中实际发生的调用关系流程图,而无法获取全部的函数调用关系图,因为有些函数调用可能在实际运行中并没有执行。


技术实现要素:

[0004]
本发明的目的是提供一种面向容量受限的程序栈空间深度追溯方法,该面向容量受限的程序栈空间深度追溯方法通过静态分析的方法获取栈空间信息,无需重新编译,无需运行插桩,对于程序分析、错误定位以及程序优化有着很好的指导作用。
[0005]
为达到上述目的,本发明采用的技术方案是:一种面向容量受限的程序栈空间深度追溯方法,包括以下步骤:s1、链接器获取所有的函数符号信息,建立相应的函数信息数据结构,各个函数之间通过链表形成函数调用关系流程图;s2、将函数的名称、pc值范围、自身栈空间深度信息安装到s1中建立的函数信息结构中,其中自身栈空间深度通过解析函数对应的eh_frame段,根据各个函数的pc值范围做检索,定位到对应的fde记录(frame description entry)从而获取各个函数本身所占用的栈空间大小;s3、遍历程序所有的重定位信息,根据重定位信息来确定函数调用关系,根据分析结果更新各个函数信息的链表指针,同时更新函数调用关系流程图,每个函数链接的其他函数即为该函数的调用者,对于函数链表指针指向自己的递归函数,不列入分析范围;s4、对建立的函数调用关系图做深度优先遍历,通过累加计算获取根节点函数的栈空间深度。
[0006]
上述技术方案中进一步改进的方案如下:1. 上述方案中,还可以对所有根节点栈空间深度做排序后输出,在链接器的map文件
中输出每个函数调用的其他函数,用于辅助用户分析程序的信息。
[0007]
由于上述技术方案的运用,本发明与现有技术相比具有下列优点:本发明面向容量受限的程序栈空间深度追溯方法,其通过重定位信息建立函数调用关系图,通过对eh_frame段的解析获取各个函数自身的栈深度,结合函数调用关系图,计算图中根节点函数的最大栈空间深度,充分利用了链接分析信息,比直接分析汇编代码更为准确有效,通过静态分析的方法获取栈空间信息,无需重新编译,无需运行插桩,对于程序分析、错误定位以及程序优化有着很好的指导作用。
附图说明
[0008]
附图1为本发明面向容量受限的程序栈空间深度追溯方法流程示意图;附图2为本发明面向容量受限的程序栈空间深度追溯方法流程图。
具体实施方式
[0009]
实施例:一种面向容量受限的程序栈空间深度追溯方法,包括以下步骤:s1、链接器获取所有的函数符号信息,建立相应的函数信息数据结构,各个函数之间通过链表形成函数调用关系流程图;s2、将函数的名称、pc值范围、自身栈空间深度信息安装到s1中建立的函数信息结构中,其中自身栈空间深度通过解析函数对应的eh_frame段,根据各个函数的pc值范围做检索,定位到对应的fde记录(frame description entry)从而获取各个函数本身所占用的栈空间大小;s3、遍历程序所有的重定位信息,根据重定位信息来确定函数调用关系,根据分析结果更新各个函数信息的链表指针,同时更新函数调用关系流程图,每个函数链接的其他函数即为该函数的调用者,对于函数链表指针指向自己的递归函数,不列入分析范围;s4、对建立的函数调用关系图做深度优先遍历,通过累加计算获取根节点函数的栈空间深度。
[0010]
还可以对所有根节点栈空间深度做排序后输出,在链接器的map文件中输出每个函数调用的其他函数,用于辅助用户分析程序的信息。
[0011]
实施例进一步解释如下:本发明提出一个静态链接分析技术,通过链接器对程序的重定位信息分析结果,获取所有的函数信息,并建立函数调用关系流程图,通过对程序eh_frame段的解析,获取各个函数在编译时确定的栈深度,最终通过对函数调用关系图的遍历,计算得到各个图中根节点函数的最大栈空间深度。
[0012]
实现方案如下:一、在链接器中建立函数信息的数据结构,各个函数之间通过链表形成函数调用关系流程图;二、在链接器进行最终链接之前,获取所有函数符号,并将函数的名称、pc值范围、自身栈空间深度等信息安装到对应的函数信息结构中,其中自身栈空间深度通过解析函数对应的eh_frame段里的fde(frame description entry)获得;三、遍历程序所有的重定位信息,根据重定位信息来确定函数调用关系,一般而言,重
定位类型为r_alpha_lituse重定位所在的函数为调用者,紧接着r_alpha_lituse之前的重定位r_alpha_literal所在函数为被调用者,根据分析结果更新各个函数信息的链表指针,每个函数链接的其他函数即为他的调用者,对于函数链表指针指向自己的递归函数,不列入分析范围;四、对建立的函数调用关系图做深度优先遍历,通过累加计算获取根节点函数的栈空间深度,对所有根节点栈空间深度做排序后输出,在链接器的map文件中输出每个函数调用的其他函数。
[0013]
链接器在进行最后的链接步骤时,获取所有的函数符号信息,并建立相对应的函数信息数据结构,解析eh_frame段,根据各个函数的pc值范围做检索,定位到对应的fde记录从而获取各个函数本身所占用的栈空间大小,并将其填入相应的函数信息数据结构。
[0014]
解析重定位信息,根据重定位类型建立函数调用关系图,如函数2中发现了r_alpha_lituse的重定位类型,说明函数2调用了其它函数,在该重定位信息之前的一个r_alpha_litral重定位信息对应的就是被调用函数1,所以函数2的函数信息结构的链接指针指向函数1,说明函数2调用了函数1。
[0015]
深度优先检索函数调用关系图,累加各个被调用函数的栈空间深度,从而获得根节点栈空间深度。
[0016]
最后,根据上文描述,将相应信息输出到屏幕以及链接器自动生成的map文件里。
[0017]
采用上述面向容量受限的程序栈空间深度追溯方法时,其通过重定位信息建立函数调用关系图,通过对eh_frame段的解析获取各个函数自身的栈深度,结合函数调用关系图,计算图中根节点函数的最大栈空间深度,充分利用了链接分析信息,比直接分析汇编代码更为准确有效,通过静态分析的方法获取栈空间信息,无需重新编译,无需运行插桩,对于程序分析、错误定位以及程序优化有着很好的指导作用。
[0018]
为了便于更好的理解本发明,下面将对本文中使用的术语进行简要的解释:栈空间:程序运行过程中以函数为单位的私有空间。
[0019]
上述实施例只为说明本发明的技术构思及特点,其目的在于让熟悉此项技术的人士能够了解本发明的内容并据以实施,并不能以此限制本发明的保护范围。凡根据本发明精神实质所作的等效变化或修饰,都应涵盖在本发明的保护范围之内。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1