CN112445482A - 面向容量受限的程序栈空间深度追溯方法 - Google Patents
面向容量受限的程序栈空间深度追溯方法 Download PDFInfo
- Publication number
- CN112445482A CN112445482A CN201910794946.2A CN201910794946A CN112445482A CN 112445482 A CN112445482 A CN 112445482A CN 201910794946 A CN201910794946 A CN 201910794946A CN 112445482 A CN112445482 A CN 112445482A
- Authority
- CN
- China
- Prior art keywords
- function
- information
- stack space
- program
- depth
- 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
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开一种面向容量受限的程序栈空间深度追溯方法,包括以下步骤:S1、在链接器中建立函数信息的数据结构,形成函数调用关系流程图;S2、获取所有的函数符号信息,建立相应的函数信息数据结构,并将函数的名称、PC值范围、自身栈空间深度信息安装到对应的函数信息结构中;S3、遍历程序所有的重定位信息,根据重定位信息来确定函数调用关系,根据分析结果更新各个函数信息的链表指针;S4、对建立的函数调用关系图做深度优先遍历,通过累加计算获取根节点函数的栈空间深度,对所有根节点栈空间深度做排序后输出。本发明通过静态分析的方法获取栈空间信息,无需重新编译,无需运行插桩,对于程序分析、错误定位以及程序优化有着很好的指导作用。
Description
技术领域
本发明涉及一种面向容量受限的程序栈空间深度追溯方法,属于计算机技术领域。
背景技术
对于一些容量受限的精简处理器核心,函数栈空间深度是影响程序性能的关键。由于栈空间是程序运行过程中动态申请使用,其实际大小难以预估。目前计算程序栈空间深度的方法,一般是编译时在每个函数开始插桩记录栈指针的统计函数,程序运行过程中记录下栈指针在函数调用流程中的值的变化,从而通过计算初始栈指针与栈指针值为最小时的差值来获取程序运行过程中的最大栈空间深度。
现有的栈空间深度计算方法存在着如下缺陷:一是程序需要重新编译进行插桩,对于遗产代码适应性差,且需要预先运行一遍获取栈空间深度,比较麻烦;二是在容量受限的情况下,经常遇到的情况是栈空间不足,在这种情况下,程序会因为栈空间溢出而无法正常执行,也就无法获取正确的栈空间深度了;三是这种技术只能获取程序运行过程中实际发生的调用关系流程图,而无法获取全部的函数调用关系图,因为有些函数调用可能在实际运行中并没有执行。
发明内容
本发明的目的是提供一种面向容量受限的程序栈空间深度追溯方法,该面向容量受限的程序栈空间深度追溯方法通过静态分析的方法获取栈空间信息,无需重新编译,无需运行插桩,对于程序分析、错误定位以及程序优化有着很好的指导作用。
为达到上述目的,本发明采用的技术方案是:一种面向容量受限的程序栈空间深度追溯方法,包括以下步骤:
S1、链接器获取所有的函数符号信息,建立相应的函数信息数据结构,各个函数之间通过链表形成函数调用关系流程图;
S2、将函数的名称、PC值范围、自身栈空间深度信息安装到S1中建立的函数信息结构中,其中自身栈空间深度通过解析函数对应的eh_frame段,根据各个函数的PC值范围做检索,定位到对应的FDE记录(Frame Description Entry)从而获取各个函数本身所占用的栈空间大小;
S3、遍历程序所有的重定位信息,根据重定位信息来确定函数调用关系,根据分析结果更新各个函数信息的链表指针,同时更新函数调用关系流程图,每个函数链接的其他函数即为该函数的调用者,对于函数链表指针指向自己的递归函数,不列入分析范围;
S4、对建立的函数调用关系图做深度优先遍历,通过累加计算获取根节点函数的栈空间深度。
上述技术方案中进一步改进的方案如下:
1. 上述方案中,还可以对所有根节点栈空间深度做排序后输出,在链接器的map文件中输出每个函数调用的其他函数,用于辅助用户分析程序的信息。
由于上述技术方案的运用,本发明与现有技术相比具有下列优点:
本发明面向容量受限的程序栈空间深度追溯方法,其通过重定位信息建立函数调用关系图,通过对eh_frame段的解析获取各个函数自身的栈深度,结合函数调用关系图,计算图中根节点函数的最大栈空间深度,充分利用了链接分析信息,比直接分析汇编代码更为准确有效,通过静态分析的方法获取栈空间信息,无需重新编译,无需运行插桩,对于程序分析、错误定位以及程序优化有着很好的指导作用。
附图说明
附图1为本发明面向容量受限的程序栈空间深度追溯方法流程示意图;
附图2为本发明面向容量受限的程序栈空间深度追溯方法流程图。
具体实施方式
实施例:一种面向容量受限的程序栈空间深度追溯方法,包括以下步骤:
S1、链接器获取所有的函数符号信息,建立相应的函数信息数据结构,各个函数之间通过链表形成函数调用关系流程图;
S2、将函数的名称、PC值范围、自身栈空间深度信息安装到S1中建立的函数信息结构中,其中自身栈空间深度通过解析函数对应的eh_frame段,根据各个函数的PC值范围做检索,定位到对应的FDE记录(Frame Description Entry)从而获取各个函数本身所占用的栈空间大小;
S3、遍历程序所有的重定位信息,根据重定位信息来确定函数调用关系,根据分析结果更新各个函数信息的链表指针,同时更新函数调用关系流程图,每个函数链接的其他函数即为该函数的调用者,对于函数链表指针指向自己的递归函数,不列入分析范围;
S4、对建立的函数调用关系图做深度优先遍历,通过累加计算获取根节点函数的栈空间深度。
还可以对所有根节点栈空间深度做排序后输出,在链接器的map文件中输出每个函数调用的其他函数,用于辅助用户分析程序的信息。
实施例进一步解释如下:
本发明提出一个静态链接分析技术,通过链接器对程序的重定位信息分析结果,获取所有的函数信息,并建立函数调用关系流程图,通过对程序eh_frame段的解析,获取各个函数在编译时确定的栈深度,最终通过对函数调用关系图的遍历,计算得到各个图中根节点函数的最大栈空间深度。
实现方案如下:
一、在链接器中建立函数信息的数据结构,各个函数之间通过链表形成函数调用关系流程图;
二、在链接器进行最终链接之前,获取所有函数符号,并将函数的名称、PC值范围、自身栈空间深度等信息安装到对应的函数信息结构中,其中自身栈空间深度通过解析函数对应的eh_frame段里的FDE(Frame Description Entry)获得;
三、遍历程序所有的重定位信息,根据重定位信息来确定函数调用关系,一般而言,重定位类型为R_ALPHA_LITUSE重定位所在的函数为调用者,紧接着R_ALPHA_LITUSE之前的重定位R_ALPHA_LITERAL所在函数为被调用者,根据分析结果更新各个函数信息的链表指针,每个函数链接的其他函数即为他的调用者,对于函数链表指针指向自己的递归函数,不列入分析范围;
四、对建立的函数调用关系图做深度优先遍历,通过累加计算获取根节点函数的栈空间深度,对所有根节点栈空间深度做排序后输出,在链接器的map文件中输出每个函数调用的其他函数。
链接器在进行最后的链接步骤时,获取所有的函数符号信息,并建立相对应的函数信息数据结构,解析eh_frame段,根据各个函数的PC值范围做检索,定位到对应的FDE记录从而获取各个函数本身所占用的栈空间大小,并将其填入相应的函数信息数据结构。
解析重定位信息,根据重定位类型建立函数调用关系图,如函数2中发现了R_ALPHA_LITUSE的重定位类型,说明函数2调用了其它函数,在该重定位信息之前的一个R_ALPHA_LITRAL重定位信息对应的就是被调用函数1,所以函数2的函数信息结构的链接指针指向函数1,说明函数2调用了函数1。
深度优先检索函数调用关系图,累加各个被调用函数的栈空间深度,从而获得根节点栈空间深度。
最后,根据上文描述,将相应信息输出到屏幕以及链接器自动生成的MAP文件里。
采用上述面向容量受限的程序栈空间深度追溯方法时,其通过重定位信息建立函数调用关系图,通过对eh_frame段的解析获取各个函数自身的栈深度,结合函数调用关系图,计算图中根节点函数的最大栈空间深度,充分利用了链接分析信息,比直接分析汇编代码更为准确有效,通过静态分析的方法获取栈空间信息,无需重新编译,无需运行插桩,对于程序分析、错误定位以及程序优化有着很好的指导作用。
为了便于更好的理解本发明,下面将对本文中使用的术语进行简要的解释:
栈空间:程序运行过程中以函数为单位的私有空间。
上述实施例只为说明本发明的技术构思及特点,其目的在于让熟悉此项技术的人士能够了解本发明的内容并据以实施,并不能以此限制本发明的保护范围。凡根据本发明精神实质所作的等效变化或修饰,都应涵盖在本发明的保护范围之内。
Claims (2)
1.一种面向容量受限的程序栈空间深度追溯方法,其特征在于:包括以下步骤:
S1、链接器获取所有的函数符号信息,建立相应的函数信息数据结构,各个函数之间通过链表形成函数调用关系流程图;
S2、将函数的名称、PC值范围、自身栈空间深度信息安装到S1中建立的函数信息结构中,其中自身栈空间深度通过解析函数对应的eh_frame段,根据各个函数的PC值范围做检索,定位到对应的FDE记录(Frame Description Entry)从而获取各个函数本身所占用的栈空间大小;
S3、遍历程序所有的重定位信息,根据重定位信息来确定函数调用关系,根据分析结果更新各个函数信息的链表指针,同时更新函数调用关系流程图,每个函数链接的其他函数即为该函数的调用者,对于函数链表指针指向自己的递归函数,不列入分析范围;
S4、对建立的函数调用关系图做深度优先遍历,通过累加计算获取根节点函数的栈空间深度。
2.根据权利要求1所述的面向容量受限的程序栈空间深度追溯方法,其特征在于:还可以对所有根节点栈空间深度做排序后输出,在链接器的map文件中输出每个函数调用的其他函数,用于辅助用户分析程序的信息。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910794946.2A CN112445482B (zh) | 2019-08-27 | 2019-08-27 | 面向容量受限的程序栈空间深度追溯方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910794946.2A CN112445482B (zh) | 2019-08-27 | 2019-08-27 | 面向容量受限的程序栈空间深度追溯方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112445482A true CN112445482A (zh) | 2021-03-05 |
CN112445482B CN112445482B (zh) | 2022-11-15 |
Family
ID=74741629
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910794946.2A Active CN112445482B (zh) | 2019-08-27 | 2019-08-27 | 面向容量受限的程序栈空间深度追溯方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112445482B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113312054A (zh) * | 2021-05-27 | 2021-08-27 | 长沙海格北斗信息技术有限公司 | 针对嵌入式软件架构的软件栈消耗分析方法及分析装置 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102012833A (zh) * | 2010-11-09 | 2011-04-13 | 北京神舟航天软件技术有限公司 | 基于编译过程中间结果的静态堆栈检测方法 |
CN103678137A (zh) * | 2013-12-30 | 2014-03-26 | 北京控制工程研究所 | 一种基于list文件任务最大堆栈深度的检测方法 |
-
2019
- 2019-08-27 CN CN201910794946.2A patent/CN112445482B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102012833A (zh) * | 2010-11-09 | 2011-04-13 | 北京神舟航天软件技术有限公司 | 基于编译过程中间结果的静态堆栈检测方法 |
CN103678137A (zh) * | 2013-12-30 | 2014-03-26 | 北京控制工程研究所 | 一种基于list文件任务最大堆栈深度的检测方法 |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113312054A (zh) * | 2021-05-27 | 2021-08-27 | 长沙海格北斗信息技术有限公司 | 针对嵌入式软件架构的软件栈消耗分析方法及分析装置 |
Also Published As
Publication number | Publication date |
---|---|
CN112445482B (zh) | 2022-11-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US5828883A (en) | Call path refinement profiles | |
CN110502227B (zh) | 代码补全的方法及装置、存储介质、电子设备 | |
CN108459967B (zh) | 基于用户接口状态流图的Web应用测试用例生成方法 | |
US9367428B2 (en) | Transparent performance inference of whole software layers and context-sensitive performance debugging | |
CN106649771A (zh) | 数据库的数据模型更新方法和系统 | |
CN112199274B (zh) | 基于V8引擎的JavaScript动态污点跟踪方法及电子装置 | |
CN107193742B (zh) | 一种基于状态的路径敏感的符号化函数摘要算法 | |
CN103186523A (zh) | 电子设备及其自然语言分析方法 | |
CN103713998A (zh) | 一种可扩展的在线静态代码缺陷分析方法 | |
CN115576974B (zh) | 数据处理方法、装置、设备和介质 | |
CN111897553A (zh) | 一种项目系统搭建方法、装置、设备及可读存储介质 | |
CN112445482B (zh) | 面向容量受限的程序栈空间深度追溯方法 | |
CN109271322B (zh) | 一种软件测试范围确定方法、软件测试方法和装置 | |
CN109344408A (zh) | 一种译文检测方法、装置及电子设备 | |
CN115905031A (zh) | 一种基于精准质量保障系统的测试用例推荐方法 | |
CN114185791A (zh) | 一种数据映射文件的测试方法、装置、设备及存储介质 | |
CN106919403B (zh) | 云环境下基于Java字节码的多粒度代码克隆检测方法 | |
CN112925552A (zh) | 代码处理方法、装置、设备及存储介质 | |
CN107729015A (zh) | 一种确定工程代码中的无用函数的方法和装置 | |
CN114816532B (zh) | 一种提高risc-v二进制代码密度的寄存器分配方法 | |
CN114115900B (zh) | 一种脚本编译方法、装置及电子设备 | |
CN113688031B (zh) | 一种基于字节码增强技术的测试定位方法 | |
CN113190235A (zh) | 一种代码的分析方法、装置、电子终端及存储介质 | |
CN107885649A (zh) | Ios应用程序的性能测试方法和装置 | |
CN105354144A (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 |