[发明专利]一种堆栈回溯的方法及装置有效
申请号: | 202110481079.4 | 申请日: | 2021-04-30 |
公开(公告)号: | CN113238883B | 公开(公告)日: | 2022-09-02 |
发明(设计)人: | 石红伟;刘应江 | 申请(专利权)人: | 烽火通信科技股份有限公司 |
主分类号: | G06F11/07 | 分类号: | G06F11/07;G06F11/36 |
代理公司: | 武汉智权专利代理事务所(特殊普通合伙) 42225 | 代理人: | 张凯 |
地址: | 430000 湖北省武*** | 国省代码: | 湖北;42 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 堆栈 回溯 方法 装置 | ||
本发明公开了一种堆栈回溯的方法及装置,涉及嵌入式系统领域,该方法包括以下步骤:记录函数的入栈信息、函数堆栈深度以及函数返回地址;通过栈帧地址确定函数的返回地址和父函数的堆栈地址;当函数的返回地址和父函数的堆栈地址均有效时,直接更新函数的返回地址和父函数的堆栈地址后继续回溯,直至调用栈回溯完成;当函数的返回地址或父函数的堆栈地址无效时,根据函数的入栈信息以及函数堆栈深度,确定并更新函数的返回地址以及父函数的堆栈地址后继续回溯,直至调用栈回溯完成。本发明实施难度小、能够快速完整的回溯出完整的堆栈,有效提高堆栈回溯的效率。
技术领域
本发明涉及嵌入式系统领域,具体涉及一种堆栈回溯的方法及装置。
背景技术
在嵌入式系统中,当一个线程出现异常的时候,或者当一个线程收到一个信号需要分析出该线程的调用轨迹的时候,或者当一个函数需要记录被调用者的调用轨迹的时候,或者当一个线程被跟踪的时候,都需要分析出函数的调用栈。
对于目前的堆栈回溯算法,相关技术中都是按照其中一种栈帧结构设计的,使用栈帧回溯法或者unwind方法进行堆栈回溯。在使用栈帧回溯的时候,如果函数不带栈帧结构,会导致回溯失败;如果使用unwind方法进行堆栈回溯,回溯效率较低,所以现在需要一种快速的堆栈回溯方法,能够在有无栈帧的情况下,快速的回溯出函数堆栈信息。
针对这个问题,目前现有技术采用的是通过FP-4的内存进行判断栈帧格式类型,如果没有栈帧格式,通过指令分析法判断入栈信息,然而指令分析法实施难度大,而且不同的cpu指令差异也大。
发明内容
针对现有技术中存在的缺陷,本发明第一方面提供一种实施难度小、能够快速完整的回溯出完整的堆栈,有效提高堆栈回溯的效率的堆栈回溯的方法。
为达到以上目的,本发明采取的技术方案是:
一种堆栈回溯的方法,该方法包括以下步骤:
记录函数的入栈信息、函数堆栈深度以及函数返回地址;
通过栈帧地址确定函数的返回地址和父函数的堆栈地址;
当函数的返回地址和父函数的堆栈地址均有效时,直接更新函数的返回地址和父函数的堆栈地址后继续回溯,直至调用栈回溯完成;
当函数的返回地址或父函数的堆栈地址无效时,根据函数的入栈信息以及函数堆栈深度,确定并更新函数的返回地址以及父函数的堆栈地址后继续回溯,直至调用栈回溯完成。
一些实施例中,所述当函数的返回地址或父函数的堆栈地址无效时,根据函数的入栈信息以及函数堆栈深度,确定并更新函数的返回地址以及父函数的堆栈地址后继续回溯,直至调用栈回溯完成,包括:
当函数的返回地址或父函数的堆栈地址无效时,跳转到异常指令地址;
获取该函数的入栈信息以及该函数的返回地址相对于栈帧地址的偏移量;
通过函数的返回地址相对于栈帧地址的偏移量,读取函数的返回地址;
根据函数的入栈信息计算函数栈增长的长度,以计算父函数栈帧地址;
更新函数的返回地址以及父函数的堆栈地址,若回溯结束,终止回溯,若回溯未结束,再次通过栈帧地址确定函数的返回地址和父函数的堆栈地址,继续回溯出调用栈信息,直到调用栈回溯完成。
一些实施例中,所述当函数的返回地址或父函数的堆栈地址无效时,跳转到异常指令地址,包括:
使用sigsetjmp函数设置异常指令地址;
当函数的返回地址或父函数的堆栈地址无效时,使用siglongjmp函数跳转到异常指令地址。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于烽火通信科技股份有限公司,未经烽火通信科技股份有限公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/202110481079.4/2.html,转载请声明来源钻瓜专利网。