[发明专利]一种堆栈回溯的方法及装置有效
申请号: | 202110481079.4 | 申请日: | 2021-04-30 |
公开(公告)号: | CN113238883B | 公开(公告)日: | 2022-09-02 |
发明(设计)人: | 石红伟;刘应江 | 申请(专利权)人: | 烽火通信科技股份有限公司 |
主分类号: | G06F11/07 | 分类号: | G06F11/07;G06F11/36 |
代理公司: | 武汉智权专利代理事务所(特殊普通合伙) 42225 | 代理人: | 张凯 |
地址: | 430000 湖北省武*** | 国省代码: | 湖北;42 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 堆栈 回溯 方法 装置 | ||
1.一种堆栈回溯的方法,其特征在于,该方法包括以下步骤:
记录函数的入栈信息、函数堆栈深度以及函数返回地址;
通过栈帧地址确定函数的返回地址和父函数的堆栈地址;
当函数的返回地址和父函数的堆栈地址均有效时,直接更新函数的返回地址和父函数的堆栈地址后继续回溯,直至调用栈回溯完成;
当函数的返回地址或父函数的堆栈地址无效时,根据函数的入栈信息以及函数堆栈深度,确定并更新函数的返回地址以及父函数的堆栈地址后继续回溯,直至调用栈回溯完成;
其中,所述当函数的返回地址或父函数的堆栈地址无效时,根据函数的入栈信息以及函数堆栈深度,确定并更新函数的返回地址以及父函数的堆栈地址后继续回溯,直至调用栈回溯完成,包括:
当函数的返回地址或父函数的堆栈地址无效时,跳转到异常指令地址;
获取该函数的入栈信息以及该函数的返回地址相对于栈帧地址的偏移量;
通过函数的返回地址相对于栈帧地址的偏移量,读取函数的返回地址;
根据函数的入栈信息计算函数栈增长的长度,以计算父函数栈帧地址;
更新函数的返回地址以及父函数的堆栈地址,若回溯结束,终止回溯,若回溯未结束,再次通过栈帧地址确定函数的返回地址和父函数的堆栈地址,继续回溯出调用栈信息,直到调用栈回溯完成。
2.如权利要求1所述的一种堆栈回溯的方法,其特征在于,所述当函数的返回地址或父函数的堆栈地址无效时,跳转到异常指令地址,包括:
使用sigsetjmp函数设置异常指令地址;
当函数的返回地址或父函数的堆栈地址无效时,使用siglongjmp函数跳转到异常指令地址。
3.如权利要求1所述的一种堆栈回溯的方法,其特征在于,当栈基址为0或者回溯到所设置的需回溯的调用栈的最大层次时,判定回溯结束。
4.如权利要求1所述的一种堆栈回溯的方法,其特征在于,所述通过栈帧地址确定函数的返回地址和父函数的堆栈地址,包括:
以当前栈帧+4的位置确定函数的返回地址;
根据当前栈帧的内容确定父函数的堆栈地址。
5.如权利要求1所述的一种堆栈回溯的方法,其特征在于,所述记录函数的入栈信息、函数堆栈深度以及函数返回地址,包括:
读取ELF文件信息,记录函数的开始地址和结束地址、函数中操作栈的指令地址和该指令操作的栈长度,以及该函数累计操作的栈长度和函数返回地址,以生成函数入栈出栈操作的信息表。
6.如权利要求5所述的一种堆栈回溯的方法,其特征在于,所述函数入栈出栈操作的信息表按照函数指令地址从小到大的顺序创建。
7.一种堆栈回溯的装置,其特征在于,包括:
记录模块,其用于记录函数的入栈信息、函数堆栈深度以及函数返回地址;
寻址模块,其用于通过栈帧地址确定函数的返回地址和父函数的堆栈地址;
回溯模块,其用于,
当函数的返回地址和父函数的堆栈地址均有效时,直接更新函数的返回地址和父函数的堆栈地址后继续回溯,直至调用栈回溯完成;
当函数的返回地址或父函数的堆栈地址无效时,根据函数的入栈信息以及函数堆栈深度,确定并更新函数的返回地址以及父函数的堆栈地址后继续回溯,直至调用栈回溯完成;
其中,所述回溯模块执行:当函数的返回地址或父函数的堆栈地址无效时,根据函数的入栈信息以及函数堆栈深度,确定并更新函数的返回地址以及父函数的堆栈地址后继续回溯,直至调用栈回溯完成,包括:
当函数的返回地址或父函数的堆栈地址无效时,跳转到异常指令地址;
获取该函数的入栈信息以及该函数的返回地址相对于栈帧地址的偏移量;
通过函数的返回地址相对于栈帧地址的偏移量,读取函数的返回地址;
根据函数的入栈信息计算函数栈增长的长度,以计算父函数栈帧地址;
更新函数的返回地址以及父函数的堆栈地址,若回溯结束,终止回溯,若回溯未结束,再次通过栈帧地址确定函数的返回地址和父函数的堆栈地址,继续回溯出调用栈信息,直到调用栈回溯完成。
8.如权利要求7所述的一种堆栈回溯的装置,其特征在于,所述记录模块执行:记录函数的入栈信息、函数堆栈深度以及函数返回地址,包括:
读取ELF文件信息,记录函数的开始地址和结束地址、函数中操作栈的指令地址和该指令操作的栈长度,以及该函数累计操作的栈长度和函数返回地址,以生成函数入栈出栈操作的信息表。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于烽火通信科技股份有限公司,未经烽火通信科技股份有限公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/202110481079.4/1.html,转载请声明来源钻瓜专利网。