本技术涉及计算机,尤其涉及一种栈回溯方法、装置、设备、存储介质和程序产品。
背景技术:
1、在嵌入式底层开发在软件开发、调试及测试过程中,经常会遇到因软件的设计缺陷而出现的各种宕机现象。对于嵌入式mcu软件系统的宕机问题,目前主要是根据cpu核心寄存器的内容,再结合反汇编代码,采用栈回溯的方式检索出函数之间的调用的层次关系,来排查和修复代码的设计缺陷。
2、目前,如何快速、准确地回溯函数的调用关系,已成为函待解决的技术问题。
技术实现思路
1、本技术提供一种栈回溯方法、装置、设备、存储介质和程序产品,提高栈回溯的效率和准确率。本技术的技术方案如下:
2、本技术实施例还提供一种栈回溯方法,包括:
3、从当前函数的当前执行指令地址对所述当前函数的指令文本进行指令回溯,查找所述指令文本中是否包含压栈指令;
4、若是,则将所述当前函数的当前执行指令地址回溯到所述压栈指令的地址,且从所述压栈指令中解析出压栈数量;
5、根据所述压栈数量,确定所述当前函数的上一级函数的返回地址。
6、可选地,所述从所述压栈指令中解析出压栈数量,包括:
7、根据所述压栈指令的语法规则,从压栈指令中解析出寄存器掩码;
8、根据所述寄存器掩码,确定对所述当前函数的栈帧的压栈数量。
9、可选地,所述根据所述寄存器掩码,确定对所述当前函数的栈帧的压栈数量,包括:
10、将所述寄存器掩码从十六进制转换为二进制,得到二进制编码;
11、根据二进制编码,确定所述当前函数的栈帧被压入的寄存器的数量;
12、根据所述前函数的栈帧被压入的寄存器的数量和当前操作系统位数,计算所述当前函数的栈帧的压栈数量。
13、可选地,所述根据所述压栈数量,确定所述当前函数的上一级函数的返回地址,包括:
14、对所述指令文本从所述当前执行指令地址至所述当前函数的开始执行指令地址进行遍历;
15、若遍历到设定指令码,则根据所述设定指令码的数量和所述压栈数量,确定所述当前函数的上一级函数的返回地址;
16、若未遍历到设定指令码,则根据所述压栈数量,确定所述当前函数的上一级函数的返回地址。
17、可选地,所述根据所述设定指令码的数量和所述压栈数量,确定所述当前函数的上一级函数的返回地址,包括:
18、根据所述压栈数量和所述设定指令码的数量,确定所述栈顶指针位移相对值;
19、根据所述栈顶指针位移相对值,对栈顶指针的位置进行更新,得到更新后的栈顶指针的位置;
20、将所述更新后的栈顶指针的位置所指向的地址,作为所述当前函数的上一级函数的返回地址。
21、可选地,所述根据所述压栈数量,确定所述当前函数的上一级函数的返回地址,包括:
22、根据所述压栈数量,对栈顶指针的位置进行更新,得到更新后的栈顶指针的位置;
23、将所述更新后的栈顶指针的位置所指向的地址,作为所述当前函数的上一级函数的返回地址。
24、本技术实施例还提供一种栈回溯装置,包括:
25、回溯模块,从当前函数的当前执行指令地址对所述当前函数的指令文本进行指令回溯,查找所述指令文本中是否包含压栈指令;
26、解析模块,若查找到指令文本中包含压栈指令,则用于将所述当前函数的当前执行指令地址回溯到所述压栈指令的地址,且从所述压栈指令中解析出压栈数量;
27、确定模块,用于根据所述压栈数量,确定所述当前函数的上一级函数的返回地址。
28、可选地,所述解析模块包括解析子模块和确定子模块;
29、所述解析子模块,用于根据所述压栈指令的语法规则,从压栈指令中解析出寄存器掩码;
30、所述确定子模块,用于根据所述寄存器掩码,确定对所述当前函数的栈帧的压栈数量。
31、可选地,所述确定子模块在根据所述寄存器掩码,确定对所述当前函数的栈帧的压栈数量时,用于:
32、将所述寄存器掩码从十六进制转换为二进制,得到二进制编码;
33、根据二进制编码,确定所述当前函数的栈帧被压入的寄存器的数量;
34、根据所述前函数的栈帧被压入的寄存器的数量和当前操作系统位数,计算所述当前函数的栈帧的压栈数量。
35、可选地,所述确定模块包括遍历子模块和地址确定子模块;
36、所述遍历子模块,用于对所述指令文本从所述当前执行指令地址至所述当前函数的开始执行指令地址进行遍历;
37、若遍历到设定指令码,所述地址确定子模块用于根据所述设定指令码的数量和所述压栈数量,确定所述当前函数的上一级函数的返回地址;
38、若未遍历到设定指令码,所述地址确定子模块用于根据所述压栈数量,确定所述当前函数的上一级函数的返回地址。
39、可选地,所述地址确定子模块在根据所述设定指令码的数量和所述压栈数量,确定所述当前函数的上一级函数的返回地址时,用于:
40、根据所述压栈数量和所述设定指令码的数量,确定所述栈顶指针位移相对值;
41、根据所述栈顶指针位移相对值,对栈顶指针的位置进行更新,得到更新后的栈顶指针的位置;
42、将所述更新后的栈顶指针的位置所指向的地址,作为所述当前函数的上一级函数的返回地址。
43、可选地,所述地址确定子模块在根据所述压栈数量,确定所述当前函数的上一级函数的返回地址时,用于:
44、根据所述压栈数量,对栈顶指针的位置进行更新,得到更新后的栈顶指针的位置;
45、将所述更新后的栈顶指针的位置所指向的地址,作为所述当前函数的上一级函数的返回地址。
46、本技术实施例还提供一种电子设备,包括:存储器和处理器;
47、所述存储器,用于存储计算机程序;
48、所述处理器,用于执行所述计算机程序,以实现上述的方法中的各步骤。
49、本技术实施例还提供一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现上述方法中的各步骤。
50、本技术实施例还提供一种计算机程序产品,包括计算机程序/指令,其特征在于,所述计算机程序/指令被处理器执行时实现上述的方法中的各步骤。
51、本技术的实施例提供的技术方案至少带来以下有益效果:
52、在本技术的一些实施例中,从当前函数的当前执行指令地址对当前函数的指令文本进行指令回溯,查找指令文本中是否包含压栈指令;若指令文本中包含压栈指令,则将当前函数的当前执行指令地址回溯到压栈指令的地址,且从压栈指令中解析出压栈数量;基于压栈数量确定当前函数的上一级函数的返回地址,准确地确定出上一级函数的返回地址,较快的回溯函数的调用关系。
53、应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本技术。