堆栈回溯方法技术

技术编号:39515097 阅读:8 留言:0更新日期:2023-11-25 18:52
本申请提供的堆栈回溯方法

【技术实现步骤摘要】
堆栈回溯方法、装置、电子设备及存储介质


[0001]本申请属于计算机
,特别是涉及一种堆栈回溯方法

装置

电子设备及存储介质


技术介绍

[0002]相关技术中对于崩溃程序的信息一般是使用堆栈的方式来进行信息回溯的,例如,回溯时将客户端以非易失性资源的集合的形式内置在程序中,当程序崩溃时,即可通过客户端将程序的运行信息转存到记录文件中,以确定计算机为什么运行停止,然后读取由编辑器生成的调试信息,从而在进行堆栈回溯时可从运行信息中提取到程序崩溃前最后访问的当前栈帧的地址

[0003]但是,由于回溯时往往通过获取保存在栈帧上
fp
寄存器的信息,再进行一系列的固定深度算法来查找下一栈帧的地址,而
fp
寄存器本质上仍然是通用寄存器,在程序产生异常时其运行可能也会受到影响,且异常处理执行代码多为汇编器直接编辑生成,没有创建为调用帧格式,因此某些情况下并不准确,从而导致无法准确地回溯调用链中的堆栈


技术实现思路

[0004]有鉴于此,本申请实施例提出一种堆栈回溯方法

装置

电子设备及存储介质,用于尽可能解决相关技术中由于使用栈帧上
fp
寄存器和
sp
寄存器中可能由于程序崩溃导致不正确的帧信息进行堆栈回溯,影响堆栈回溯准确性的问题

[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]利用所述调用者栈帧作为新的当前栈帧本文档来自技高网...

【技术保护点】

【技术特征摘要】
1.
一种堆栈回溯方法,其特征在于,所述方法包括:实时记录程序所访问栈帧的地址,在检测到所述程序崩溃时,实时获取所述程序崩溃前最后访问的当前栈帧的对应地址;从所述地址相对应的寄存器中提取所述当前栈帧的目标堆栈调用规则;所述目标堆栈调用规则用于表示寄存器状态和栈帧的符号之间的关系;所述目标堆栈调用规则用于表示寄存器状态和栈帧的符号之间的关系;对所述目标堆栈调用规则中所述当前栈帧的符号进行赋值,得到所述当前栈帧的栈顶地址和返回地址;将所述栈顶地址作为调用者栈帧的当前地址,以及将所述返回地址作为所述调用者栈帧的返回地址来进行构造,得到所述调用者栈帧;根据所述调用者栈帧构建堆栈,得到所述调用者堆栈
。2.
根据权利要求1所述的方法,其特征在于,所述从所述地址相对应的寄存器中提取所述当前栈帧的目标堆栈调用规则;所述目标堆栈调用规则用于表示寄存器状态和栈帧的符号之间的关系,包括:从所述地址相对应的寄存器中提取符号文件

调试信息

所述当前栈帧和所述调用者栈帧的寄存器状态;在所述调试信息中查询与所述当前栈帧和所述调用者栈帧的寄存器状态相对应的所述目标堆栈调用规则
。3.
根据权利要求2所述的方法,其特征在于,所述对所述目标堆栈调用规则中所述当前栈帧的符号进行赋值,得到所述当前栈帧的栈顶地址和返回地址,包括:根据所述符号文件中的符号对应的变量信息对所述目标堆栈调用规则中栈帧的符号进行赋值,计算所述当前栈帧对应寄存器的取值,得到所述目标堆栈调用规则中所述当前栈帧的栈顶地址和返回地址
。4.
根据权利要求3所述的方法,其特征在于,所述方法还包括:将既定的链接库中的符号文件

所述符号文件中符号取值分别进行汇总
。5.
根据权利要求2所述的方法,其特征在于,所述在所述调试信息中查询与所述当前栈帧和所述调用者栈帧的寄存器状态相对应的目标堆栈调用规则,包括:在所述调试信息中分别提取与所...

【专利技术属性】
技术研发人员:张卿
申请(专利权)人:龙芯中科西安科技有限公司
类型:发明
国别省市:

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

1