[发明专利]一种堆栈回溯的方法及装置有效
申请号: | 201710398429.4 | 申请日: | 2017-05-31 |
公开(公告)号: | CN108984328B | 公开(公告)日: | 2021-08-17 |
发明(设计)人: | 杨洲;唐玉科 | 申请(专利权)人: | 中兴通讯股份有限公司 |
主分类号: | G06F11/07 | 分类号: | G06F11/07;G06F11/36 |
代理公司: | 深圳市力道知识产权代理事务所(普通合伙) 44507 | 代理人: | 张传义 |
地址: | 518057 广东省深*** | 国省代码: | 广东;44 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 堆栈 回溯 方法 装置 | ||
本文公布了一种一种堆栈回溯的方法及装置,包括:获取当前FP‑4位置处的内存值;根据所述内存值确定当前函数使用的栈帧结构类型;根据所述栈帧结构类型,获取返回地址和父函数帧指针FP;其中,所述当前FP‑4为当前函数FP的值往低地址方向移动4个字节处的内存地址。本申请能够自动识别ARM体系程序栈帧结构并根据不同的结构进行处理,使得栈帧回溯法能够正确回溯出不同栈帧结构程序的堆栈,大大增强了栈帧回溯法的正确性和实用性。
技术领域
本发明涉及嵌入式系统领域,具体涉及一种堆栈回溯的方法及装置。
背景技术
目前堆栈回溯有三种方法,分别为栈帧回溯法、指令分析法、unwinder回溯法。其中栈帧回溯法直接从当前函数堆栈中固定位置读取返回地址和父函数的帧指针(FP,FramePointer),图1给出了栈帧回溯结构示意图,这种回溯方法最简单、最高效,使用非常广泛。该算法与函数栈帧结构紧密相关,而进阶精简指令集机器(ARM,Advanced RISC Machine)体系应用程序二进制接口(ABI)规定了三种典型栈帧结构。
相关技术中针对ARM体系的栈帧回溯算法,都是按照其中一种栈帧结构设计的,不能够对其他栈帧结构进行处理,导致回溯时一旦遇到采用其他栈帧结构的函数,回溯将完全失败。而随着编译器的发展,其他类型的栈帧结构使用越来越多,因此,相关技术中针对ARM体系的栈帧回溯算法将越来越不能满足需要,迫切需要一种能够自动识别三种不同栈帧结构并进行相应处理的算法。
发明内容
为了解决上述技术问题,本发明实施例提供了一种堆栈回溯的方法及装置,能够正确回溯出不同栈帧结构程序的堆栈。
为了达到本发明目的,本发明提供了一种
一种堆栈回溯的方法,包括:
获取当前FP-4位置处的内存值;
根据所述内存值确定当前函数使用的栈帧结构类型;
根据所述栈帧结构类型,获取返回地址和父函数帧指针FP;
其中,所述当前FP-4为当前函数FP的值往低地址方向移动4个字节处的内存地址。
其中,所述根据当前FP-4位置处的内存值,确定当前函数使用的栈帧结构类型,包括:在所述内存值在程序代码段范围内时,确定当前函数使用第一栈帧结构;在所述内存值在当前线程堆栈范围内时,确定当前函数使用第二栈帧结构;在所述内存值既不在程序代码段范围内、也不在当前线程堆栈范围内时,确定当前函数使用第三栈帧结构。
其中,根据所述栈帧结构类型,获取返回地址和父函数帧指针FP,包括:在所述栈帧结构类型为第一栈帧结构的情况下,从FP-4对应的内存处读取返回地址,从FP-12对应的内存处读取父函数的FP;对于第二栈帧结构,从FP对应的内存处读取返回地址,从FP-4对应的内存处读取父函数的FP;对于第三栈帧结构,获取当前函数堆栈大小SIZE,从FP+SIZE处读取父函数的FP,从FP+SIZE+4处读取返回地址。
其中,所述获取本函数堆栈大小SIZE,包括:从当前PC往低地址方向进行指令分析,查找扩展堆栈的指令;在查找到扩展堆栈的指令的情况下,本函数堆栈大小SIZE为所述指令中的立即数;如果没有查找到扩展堆栈的指令,则本函数堆栈大小SIZE为0。
一种堆栈回溯的装置,包括:
获取模块,用于获取当前FP-4位置处的内存值;
确定模块,用于根据当前FP-4位置处的内存值,确定当前函数使用的栈帧结构类型;
返回模块,用于根据所述栈帧结构类型,获取返回地址和父函数帧指针FP;
其中,所述当前FP-4为当前函数FP的值往低地址方向移动4个字节处的内存地址。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于中兴通讯股份有限公司,未经中兴通讯股份有限公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201710398429.4/2.html,转载请声明来源钻瓜专利网。
- 上一篇:报文转发方法、多核CPU及网络设备
- 下一篇:延迟错误处理