栈回溯方法、装置、设备、存储介质和程序产品制造方法及图纸

技术编号:39046088 阅读:10 留言:0更新日期:2023-10-10 11:59
本申请涉及计算机技术领域,尤其涉及一种栈回溯方法、装置、设备、存储介质和程序产品。在本申请的一些实施例中,从当前函数的当前执行指令地址对当前函数的指令文本进行指令回溯,查找指令文本中是否包含压栈指令;若指令文本中包含压栈指令,则将当前函数的当前执行指令地址回溯到压栈指令的地址,且从压栈指令中解析出压栈数量;基于压栈数量确定当前函数的上一级函数的返回地址,准确地确定出上一级函数的返回地址,较快的回溯函数的调用关系。较快的回溯函数的调用关系。较快的回溯函数的调用关系。

【技术实现步骤摘要】
栈回溯方法、装置、设备、存储介质和程序产品


[0001]本申请涉及计算机
,尤其涉及一种栈回溯方法、装置、设备、存储介质和程序产品。

技术介绍

[0002]在嵌入式底层开发在软件开发、调试及测试过程中,经常会遇到因软件的设计缺陷而出现的各种宕机现象。对于嵌入式MCU软件系统的宕机问题,目前主要是根据CPU核心寄存器的内容,再结合反汇编代码,采用栈回溯的方式检索出函数之间的调用的层次关系,来排查和修复代码的设计缺陷。
[0003]目前,如何快速、准确地回溯函数的调用关系,已成为函待解决的技术问题。

技术实现思路

[0004]本申请提供一种栈回溯方法、装置、设备、存储介质和程序产品,提高栈回溯的效率和准确率。本申请的技术方案如下:
[0005]本申请实施例还提供一种栈回溯方法,包括:
[0006]从当前函数的当前执行指令地址对所述当前函数的指令文本进行指令回溯,查找所述指令文本中是否包含压栈指令;
[0007]若是,则将所述当前函数的当前执行指令地址回溯到所述压栈指令的地址,且从所述压栈指令中解析出压栈数量;
[0008]根据所述压栈数量,确定所述当前函数的上一级函数的返回地址。
[0009]可选地,所述从所述压栈指令中解析出压栈数量,包括:
[0010]根据所述压栈指令的语法规则,从压栈指令中解析出寄存器掩码;
[0011]根据所述寄存器掩码,确定对所述当前函数的栈帧的压栈数量。
[0012]可选地,所述根据所述寄存器掩码,确定对所述当前函数的栈帧的压栈数量,包括:
[0013]将所述寄存器掩码从十六进制转换为二进制,得到二进制编码;
[0014]根据二进制编码,确定所述当前函数的栈帧被压入的寄存器的数量;
[0015]根据所述前函数的栈帧被压入的寄存器的数量和当前操作系统位数,计算所述当前函数的栈帧的压栈数量。
[0016]可选地,所述根据所述压栈数量,确定所述当前函数的上一级函数的返回地址,包括:
[0017]对所述指令文本从所述当前执行指令地址至所述当前函数的开始执行指令地址进行遍历;
[0018]若遍历到设定指令码,则根据所述设定指令码的数量和所述压栈数量,确定所述当前函数的上一级函数的返回地址;
[0019]若未遍历到设定指令码,则根据所述压栈数量,确定所述当前函数的上一级函数
的返回地址。
[0020]可选地,所述根据所述设定指令码的数量和所述压栈数量,确定所述当前函数的上一级函数的返回地址,包括:
[0021]根据所述压栈数量和所述设定指令码的数量,确定所述栈顶指针位移相对值;
[0022]根据所述栈顶指针位移相对值,对栈顶指针的位置进行更新,得到更新后的栈顶指针的位置;
[0023]将所述更新后的栈顶指针的位置所指向的地址,作为所述当前函数的上一级函数的返回地址。
[0024]可选地,所述根据所述压栈数量,确定所述当前函数的上一级函数的返回地址,包括:
[0025]根据所述压栈数量,对栈顶指针的位置进行更新,得到更新后的栈顶指针的位置;
[0026]将所述更新后的栈顶指针的位置所指向的地址,作为所述当前函数的上一级函数的返回地址。
[0027]本申请实施例还提供一种栈回溯装置,包括:
[0028]回溯模块,从当前函数的当前执行指令地址对所述当前函数的指令文本进行指令回溯,查找所述指令文本中是否包含压栈指令;
[0029]解析模块,若查找到指令文本中包含压栈指令,则用于将所述当前函数的当前执行指令地址回溯到所述压栈指令的地址,且从所述压栈指令中解析出压栈数量;
[0030]确定模块,用于根据所述压栈数量,确定所述当前函数的上一级函数的返回地址。
[0031]可选地,所述解析模块包括解析子模块和确定子模块;
[0032]所述解析子模块,用于根据所述压栈指令的语法规则,从压栈指令中解析出寄存器掩码;
[0033]所述确定子模块,用于根据所述寄存器掩码,确定对所述当前函数的栈帧的压栈数量。
[0034]可选地,所述确定子模块在根据所述寄存器掩码,确定对所述当前函数的栈帧的压栈数量时,用于:
[0035]将所述寄存器掩码从十六进制转换为二进制,得到二进制编码;
[0036]根据二进制编码,确定所述当前函数的栈帧被压入的寄存器的数量;
[0037]根据所述前函数的栈帧被压入的寄存器的数量和当前操作系统位数,计算所述当前函数的栈帧的压栈数量。
[0038]可选地,所述确定模块包括遍历子模块和地址确定子模块;
[0039]所述遍历子模块,用于对所述指令文本从所述当前执行指令地址至所述当前函数的开始执行指令地址进行遍历;
[0040]若遍历到设定指令码,所述地址确定子模块用于根据所述设定指令码的数量和所述压栈数量,确定所述当前函数的上一级函数的返回地址;
[0041]若未遍历到设定指令码,所述地址确定子模块用于根据所述压栈数量,确定所述当前函数的上一级函数的返回地址。
[0042]可选地,所述地址确定子模块在根据所述设定指令码的数量和所述压栈数量,确定所述当前函数的上一级函数的返回地址时,用于:
[0043]根据所述压栈数量和所述设定指令码的数量,确定所述栈顶指针位移相对值;
[0044]根据所述栈顶指针位移相对值,对栈顶指针的位置进行更新,得到更新后的栈顶指针的位置;
[0045]将所述更新后的栈顶指针的位置所指向的地址,作为所述当前函数的上一级函数的返回地址。
[0046]可选地,所述地址确定子模块在根据所述压栈数量,确定所述当前函数的上一级函数的返回地址时,用于:
[0047]根据所述压栈数量,对栈顶指针的位置进行更新,得到更新后的栈顶指针的位置;
[0048]将所述更新后的栈顶指针的位置所指向的地址,作为所述当前函数的上一级函数的返回地址。
[0049]本申请实施例还提供一种电子设备,包括:存储器和处理器;
[0050]所述存储器,用于存储计算机程序;
[0051]所述处理器,用于执行所述计算机程序,以实现上述的方法中的各步骤。
[0052]本申请实施例还提供一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现上述方法中的各步骤。
[0053]本申请实施例还提供一种计算机程序产品,包括计算机程序/指令,其特征在于,所述计算机程序/指令被处理器执行时实现上述的方法中的各步骤。
[0054]本申请的实施例提供的技术方案至少带来以下有益效果:
[0055]在本申请的一些实施例中,从当前函数的当前执行指令地址对当前函数的指令文本进行指令回溯,查找指令文本中是否包含压栈指令;若指令文本中包含压栈指令,则将当前函数的当前执行指令地址回溯到压栈指令的地址,且从压栈指令中解析出压栈数量本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种栈回溯方法,其特征在于,包括:从当前函数的当前执行指令地址对所述当前函数的指令文本进行指令回溯,查找所述指令文本中是否包含压栈指令;若是,则将所述当前函数的当前执行指令地址回溯到所述压栈指令的地址,且从所述压栈指令中解析出压栈数量;根据所述压栈数量,确定所述当前函数的上一级函数的返回地址。2.根据权利要求1所述的方法,其特征在于,所述从所述压栈指令中解析出压栈数量,包括:根据所述压栈指令的语法规则,从压栈指令中解析出寄存器掩码;根据所述寄存器掩码,确定对所述当前函数的栈帧的压栈数量。3.根据权利要求2所述的方法,其特征在于,所述根据所述寄存器掩码,确定对所述当前函数的栈帧的压栈数量,包括:将所述寄存器掩码从十六进制转换为二进制,得到二进制编码;根据二进制编码,确定所述当前函数的栈帧被压入的寄存器的数量;根据所述前函数的栈帧被压入的寄存器的数量和当前操作系统位数,计算所述当前函数的栈帧的压栈数量。4.根据权利要求1所述的方法,其特征在于,所述根据所述压栈数量,确定所述当前函数的上一级函数的返回地址,包括:对所述指令文本从所述当前执行指令地址至所述当前函数的开始执行指令地址进行遍历;若遍历到设定指令码,则根据所述设定指令码的数量和所述压栈数量,确定所述当前函数的上一级函数的返回地址;若未遍历到设定指令码,则根据所述压栈数量,确定所述当前函数的上一级函数的返回地址。5.根据权利要求4所述的方法,其特征在于,所述根据所述设定指令码的数量和所述压栈数量,确定所述当前函数的上一级函数的返回地址,包括:根据所述压栈数量和所述设定指令码的数量,确定所述栈顶指针位移相对值;根据所述栈顶指针位移相对值,对栈顶指针的位置进行更新,得到更新后的栈顶指针的位置;将所述更新后的栈顶指针的位置所指向的地址,作为所述当前函数的上一级函数的返回地址。6.根据权利要求4所述的方法,其特征在于,所述根据所述压栈数量,确定所述当前函数的上一级函数的返回地址,包括:根据所述压栈数量,对栈顶指针的位置进行更新,得到更新后的栈顶指针的位置;将所述更新后的栈顶指针的位置所指向的地址,作为所述当前函数的上一级函数的返回地址。7.一种栈回溯装置,其特征在于,包括:回溯模块,从当前函数的当前执行指令地址对所述当前函数的指令文本进行指令回溯,查找所述指令文本中是否包含压栈指令;
解析模块,若查找到指令文本中包含压栈指令,则用于将所述当前函数的当前执行指令地址回溯到所述压栈指令的地址,且从所述压栈指令中解析出压栈数量;确定模块,用于根据所述压栈数量,确定所述当前函数的上一级函数的返回地址。8.根据权利要求7所述的栈回...

【专利技术属性】
技术研发人员:安超
申请(专利权)人:北京小米移动软件有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1