CN115756647A - 一种基于申威bios的栈回溯方法、装置及存储介质 - Google Patents
一种基于申威bios的栈回溯方法、装置及存储介质 Download PDFInfo
- Publication number
- CN115756647A CN115756647A CN202211463133.3A CN202211463133A CN115756647A CN 115756647 A CN115756647 A CN 115756647A CN 202211463133 A CN202211463133 A CN 202211463133A CN 115756647 A CN115756647 A CN 115756647A
- Authority
- CN
- China
- Prior art keywords
- loading
- module
- stack
- return address
- calling
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种基于申威BIOS的栈回溯方法、装置及存储介质,包括:获取当前系统内所有加载模块的加载信息;通过指令扫描的方式提取返回地址和帧指针;对各所述返回地址和帧指针进行正确性检测;将检测结果为正确的返回地址作为调用函数函数地址,并将帧指针作为调用函数栈指针继续回溯,直至得到调用路径上所有返回地址时回溯结束;根据各所述加载信息对调用路径上所有返回地址进行解析,得到调用路径上各返回地址所在加载模块的名称和模块内偏移;运用本地分析工具解析调用路径上各返回地址所在加载模块的名称和模块内偏移,获得完整的栈回溯信息。本发明完全基于UEFI框架提供的官方接口实现,具有低耦合度、高模块化和较好的可移植性等优点。
Description
技术领域
本发明涉及嵌入式系统技术领域,特别涉及一种基于申威BIOS的栈回溯方法、装置及存储介质。
背景技术
申威BIOS(Basic Input Output System,即基本输入输出系统)是面对申威处理器平台、基于UEFI(Unified Extensible Firmware Interface,即统一可拓展接口)框架实现的系统固件,用于加电自检、联系操作系统与提供连接操作系统与硬件的接口;申威BIOS面对的申威处理器平台采用自主指令集,是我国具有完全知识产权的处理器系列,但是,目前尚未开发有适用于申威BIOS的栈回溯方法。
目前,应用于申威其他软件的栈回溯方法主要是基于栈框结构,通过解析当前函数的栈框,查找并回溯出调用当前函数的上一层函数,通过对函数层层回溯得到函数调用的层次关系;但这种方法需要使用额外的空间存放函数与返回地址的映射结构,适用于保存在磁盘、执行文件本身可携带较多数据的软件或内核。作为一种系统固件,申威BIOS需要被烧录于空间较小的Flash Memory(闪存),为了尽可能加载更多驱动,提供更多服务,在生成执行文件时UEFI框架删除了函数名与函数在模块内相对偏移的映射表,这导致申威BIOS若使用目前现有的栈回溯方法,获取到的返回地址无法找到对应的函数名称,调试效果大打折扣。并且,为保证系统固件的可拓展性和良好的集成特性,申威BIOS的UEFI框架以模块作为单元组成,每个需要的功能被分为众多的子功能,以模块的形式单独实现;由于模块彼此之间相互独立,且加载地址不固定,使用上述现有的栈回溯方法获取到的全局地址无法像其他申威软件一样在编译环境下直接找到对应函数,调试价值进一步降低。
此外,基于其他处理器的栈回溯方法主要是通过保留ar寄存器和DRAM信息,在发生异常时通过滑差间隔倒叙恢复现场并调用算法反向恢复栈调用关系,这种方法与申威处理器的函数调用设计相悖,无法使用这种方式进行申威BIOS的栈回溯。因此,亟需一种新的能够根据申威BIOS内UEFI框架的架构特点进行栈回溯的方法。
发明内容
本发明的目的在于克服现有技术中的不足,提供一种基于申威BIOS的栈回溯方法、装置及存储介质,能够完全基于UEFI框架提供的官方接口实现,同时具备低耦合度、高模块化和较好的可移植性等技术效果。
为达到上述目的,本发明是采用下述技术方案实现的:
第一方面,本发明提供一种基于申威BIOS的栈回溯方法,所述方法包括:
获取当前系统内所有加载模块的加载信息,并记录栈指针和调用各加载模块的加载地址;
利用申威架构中栈帧结构回溯调用函数,通过指令扫描的方式提取返回地址和帧指针;
对所提取的各所述返回地址和帧指针进行正确性检测;
将检测结果为正确的返回地址作为调用函数的函数地址,并将帧指针作为调用函数栈指针继续回溯,直至得到调用路径上所有返回地址时回溯结束;
根据各所述加载信息对调用路径上所有返回地址进行解析,得到调用路径上各返回地址所在加载模块的名称和模块内偏移;
运用本地分析工具解析调用路径上各返回地址所在加载模块的名称和模块内偏移,获得完整的栈回溯信息。
结合第一方面,优选地,所述获取当前系统内所有加载模块的加载信息的步骤包括:
利用UEFI框架提供的查找协议接口遍历并读取各加载模块对应的映像协议中存放的内容;所述映像协议中存放的内容包括加载地址、文件大小和模块名称。
结合第一方面,优选地,所述通过指令扫描的方式提取返回地址和帧指针的步骤包括:
基于申威处理器定长指令的规整编码格式,使用当前函数的指令地址向上扫描之前执行过的指令,找到调用函数在做调用准备时存放帧指针和返回地址的指令;
利用申威架构规约的指令编码计算所存放的帧指针和返回地址在栈上的偏移;
使用栈上的偏移与当前栈指针提取出帧指针和返回地址,回溯到调用函数的栈空间。
结合第一方面,优选地,对所提取的各所述返回地址和帧指针进行正确性检测的步骤包括:
对返回地址的提取次数进行检测,若检测到多次,则判定为栈帧有误,退出服务;
对所提取的栈指针范围进行检测,若检测到所提取的栈指针超出设定范围,则判定为提取失败或已经到栈顶,退出服务;
对所提取的返回地址范围进行检测,若检测到当前所提取的返回地址的上一条PC存储指令不属于函数调用,则判定当前所提取的返回地址解析错误,服务退出;
若检测到返回地址的提取次数仅为一次、所提取的栈指针范围在设定范围内、且当前所提取的返回地址的上一条PC存储指令属于函数调用,则判定当前所提取的返回地址和帧指针的检测结果为正确。
结合第一方面,优选地,根据各所述加载信息对调用路径上所有返回地址进行解析的步骤包括:
历遍各所述加载模块的加载信息,比较调用路径上当前返回地址的PC存储指令是否落在其中一个加载模块的加载空间内;
若落在其中一个加载模块的加载空间内,则根据该加载模块的加载信息获得所述调用路径上当前返回地址的所在加载模块的模块名称和模块内偏移,所述模块内偏移的取值为当前返回地址与该模块加载位置的差值;
若不落在任一一个加载模块的加载空间内,则判定当前返回地址的PC存储指令错误,输出报错信息并停止解析。
结合第一方面,优选地,所述本地分析工具为PYTHON脚本语言,用于实现本地解析栈回溯信息。
结合第一方面,优选地,所述运用本地分析工具解析调用路径上各返回地址所在加载模块的名称和模块内偏移的步骤包括:
运用PYTHON脚本语言根据输入的栈回溯信息解析函数的调用顺序、调用函数返回地址、调用函数所在模块名称与调用函数在模块内偏移;
根据调用函数所在模块名称拼写出当前调用函数所在模块在打包加载前生成的二进制文件;
调用编译器提供的工具集中的符号解析指令获取相应模块内所有函数的相对偏移;
通过比较所述调用函数返回地址与各函数相对偏移计算出该调用函数返回地址位于哪个函数内,获取相应的函数名称,并将函数名称打印在输入信息之后,完成完整的栈回溯信息获取。
第二方面,本发明提供一种基于申威BIOS的栈回溯装置,所述装置包括:
获取模块,用于获取当前系统内所有加载模块的加载信息,并记录栈指针和调用各加载模块的加载地址;
提取模块,用于利用申威架构中栈帧结构回溯调用函数,通过指令扫描的方式提取返回地址和帧指针;
检测模块,用于对所提取的各所述返回地址和帧指针进行正确性检测;
回溯模块,用于将检测结果为正确的返回地址作为调用函数的函数地址,并将帧指针作为调用函数栈指针继续回溯,直至得到调用路径上所有返回地址时回溯结束;
解析模块,用于根据各所述加载信息对调用路径上所有返回地址进行解析,得到调用路径上各返回地址所在加载模块的名称和模块内偏移;
获得模块,用于运用本地分析工具解析调用路径上各返回地址所在加载模块的名称和模块内偏移,获得完整的栈回溯信息。
第三方面,本发明提供一种基于申威BIOS的栈回溯装置,包括处理器及存储介质;
所述存储介质用于存储指令;
所述处理器用于根据所述指令进行操作以执行第一方面任一项所述的基于申威BIOS的栈回溯方法的步骤。
第四方面,本发明提供一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时,实现如第一方面任一项所述的基于申威BIOS的栈回溯方法的步骤。
与现有技术相比,本发明所达到的有益效果:
一、在申威BIOS运行的任意位置插入本发明方法构成的栈回溯链接库,能够获取正确、完整、全面的函数调用信息,且本发明完全基于UEFI框架提供的官方接口实现,没有破坏原有的框架代码或者大幅度增加输出文件体积,具有低耦合度、高模块化和较好的可移植性的技术效果;
二、在使用者的方面,本发明具有较好的信息监测与容错能力,实施难度小,使用方法简便,输出清晰易懂,对于未知调用关系的常见异常或断言,本发明能够快速正确地定位错误发生实际现场位置,大大减少了追踪代码的时间,节省时间精力;
三、在功能开发时,本发明可以清晰地说明同一函数被不同函数调用的流程,便于调试和理解代码。
附图说明
图1是本发明实施例提供的一种基于申威BIOS的栈回溯方法的流程图;
图2本发明实施例提供的在BIOS打印信息中获取到的栈回溯信息打印;
图3本发明实施例提供的经过本地解析工具解析后获取的栈回溯完整信息;
图4是本发明实施例提供的一种基于申威BIOS的栈回溯装置的结构原理框图。
具体实施方式
下面通过附图以及具体实施例对本发明技术方案做详细的说明,应当理解本申请实施例以及实施例中的具体特征是对本申请技术方案的详细的说明,而不是对本申请技术方案的限定,在不冲突的情况下,本申请实施例以及实施例中的技术特征可以相互组合。
本文中术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中字符"/",一般表示前后关联对象是一种“或”的关系。
实施例一:
如图1所示,本实施例介绍一种基于申威BIOS的栈回溯方法,所述方法包括如下步骤:
步骤1:获取当前系统内所有加载模块的加载信息,并记录栈指针和调用各加载模块的加载地址;
步骤2:利用申威架构中栈帧结构回溯调用函数,通过指令扫描的方式提取返回地址和帧指针;
步骤3:对所提取的各所述返回地址和帧指针进行正确性检测;
步骤4:将检测结果为正确的返回地址作为调用函数的函数地址,并将帧指针作为调用函数栈指针继续回溯,直至得到调用路径上所有返回地址时回溯结束;
步骤5:根据各所述加载信息对调用路径上所有返回地址进行解析,得到调用路径上各返回地址所在加载模块的名称和模块内偏移;
步骤6:运用本地分析工具解析调用路径上各返回地址所在加载模块的名称和模块内偏移,获得完整的栈回溯信息。
本实施例结合申威BIOS的架构对的其栈回溯方法的各个步骤做详细介绍,具体如下。
本发明实施例提供的步骤1中所获取的加载信息包括加载位置、文件大小及模块名称,其获取的具体步骤说明如下:
基于UEFI框架的设计,派遣器在加载各个模块的二进制文件时会生成与各所述模块对应的映像协议,映像协议中包括其相应模块的基础信息和对外提供的服务接口,使用UEFI框架提供的查找协议接口可以查找协议并获取协议中存放的内容;
在接收到使用栈回溯链接库的指令后,UEFI调用链接库初始化函数;在链接库初始化函数中本发明实施例使用UEFI框架提供的查找协议接口获取当前系统内所有映像协议实例;遍历协议实例,并用提供的打开协议接口打开实例,根据协议结构读取出实例中保存的当前模块加载位置与模块文件大小,并利用协议访问派遣器加载模块时的私有结构,从私有结构中获取当前模块二进制的读取指针,使用指针扫描文件,得到当前模块的名称;获取完当前模块的加载位置、大小和模块名称后,将上述加载信息存入全局变量,打开下一个映像协议实例继续获取下一个加载模块的加载信息,遍历结束后,全局变量内存有系统当前加载的全部模块的加载信息。
需要说明的是,基于申威的底层架构设计和在编译BIOS时指定的特定编译选项,在调用函数时,栈指针向下拓展出新函数需要的空间,并将帧指针(即为调用函数的栈指针)与其对应函数的返回地址(即为调用函数在调用后的下一条指令地址)存在在被调用函数的栈上,可以通过被调用函数的栈指针访问指定偏移获取;因此,本发明实施例提供的步骤2中使用扫描指令的方式提取栈上存放帧指针与返回地址的偏移,具体步骤包括:
步骤2.1:基于申威处理器定长指令的规整编码格式(即同一个函数内指令与指令之间地址相连且指令长度相同的性质),使用当前函数的指令地址向上扫描之前执行过的指令,找到调用函数在做调用准备时存放帧指针和返回地址的指令;
步骤2.3:利用申威架构规约的指令编码计算所存放的帧指针和返回地址在栈上的偏移;
步骤2.4:使用栈上的偏移与当前栈指针提取出帧指针和返回地址,回溯到调用函数的栈空间。
作为本发明的一种实施例,在进行栈回溯服务时,本发明通过步骤3的正确性检测,防止出现编译选项修改、帧指针被意外破坏等特殊情况时显示错误的栈回溯信息;对所提取的各所述返回地址和帧指针进行正确性检测的步骤包括:
步骤3.1:对返回地址的提取次数进行检测,若检测到多次,则判定为栈帧有误,退出服务;
步骤3.2:对所提取的栈指针范围进行检测,若检测到所提取的栈指针超出设定范围,则判定为提取失败或已经到栈顶,退出服务;
步骤3.3:对所提取的返回地址范围进行检测,若检测到当前所提取的返回地址的上一条PC存储指令不属于函数调用,则判定当前所提取的返回地址解析错误,服务退出;
基于步骤3.1至3.3的检测,若检测到返回地址的提取次数仅为一次、所提取的栈指针范围在设定范围内、且当前所提取的返回地址的上一条PC存储指令属于函数调用,则判定当前所提取的返回地址和帧指针的检测结果为正确。
进一步的,基于CPU指令流特性,提取到的函数返回地址是系统视角的全局偏移,在获取到正确的函数返回地址信息流后,本实施例步骤4中使用步骤1中获取的已加载模块信息表对返回地址进行解析;其中,根据各所述加载信息对调用路径上所有返回地址进行解析的具体步骤包括:
步骤4.1:历遍各所述加载模块的加载信息,比较调用路径上当前返回地址的PC存储指令是否落在其中一个加载模块的加载空间内;
步骤4.2:若落在其中一个加载模块的加载空间内,则根据该加载模块的加载信息获得所述调用路径上当前返回地址的所在加载模块的模块名称和模块内偏移,所述模块内偏移的取值为当前返回地址与该模块加载位置的差值;
步骤4.3:若不落在任一一个加载模块的加载空间内,则判定当前返回地址的PC存储指令错误,输出报错信息并停止解析。
需要进一步说明的是,在获取到栈回溯信息后,本实施例使用本发明在BIOS代码本地实现的工具进行函数名的解析;虽然UEFI框架在打包执行文件时删除了记录函数在模块内偏移的映射表,但在代码本地可以通过编译器提供的工具集的特定指令(Linux平台nm指令)解析所有模块在打包前生成的二进制文件,获取所有函数在函数所在模块内的相对偏移。其中,步骤6中所述运用本地分析工具解析调用路径上各返回地址所在加载模块的名称和模块内偏移的具体步骤包括:
步骤6.1:运用PYTHON脚本语言根据输入的栈回溯信息解析函数的调用顺序、调用函数返回地址、调用函数所在模块名称与调用函数在模块内偏移;
步骤6.2:根据调用函数所在模块名称拼写出当前调用函数所在模块在打包加载前生成的二进制文件;
步骤6.3:调用编译器提供的工具集中的符号解析指令获取相应模块内所有函数的相对偏移;
步骤6.4:通过比较所述调用函数返回地址与各函数相对偏移计算出该调用函数返回地址位于哪个函数内,获取相应的函数名称,并将函数名称打印在输入信息之后,完成完整的栈回溯信息获取。
参照图2和图3为本实施例在申威BIOS的任一一处插入本发明方法构成的栈回溯链接库进行信息回溯的一种情况;图2为本实施例步骤5中在BIOS打印信息中获取到的栈回溯信息,参数从左到右的含义为调用顺序、调用函数的返回地址(PC)、调用函数所在模块(Module)、调用函数所在模块内偏移(offset);其中缺少的#3、#4行是UEFI框架函数。如图3本实施例步骤6中经过本地解析工具解析后获取到的栈回溯完整信息的打印情况,参数从左到右的含义为调用顺序、调用函数的返回地址(PC)、调用函数所在模块(Module)、调用函数所在模块内偏移(offset)、调用函数函数名(Function nanme);其中缺少的#3、#4行是UEFI框架函数。试验结果表明,本发明具有较好的信息监测与容错能力,实施难度小,使用方法简便,输出清晰易懂,对于未知调用关系的常见异常或断言,本发明能够快速正确地定位错误发生实际现场位置,大大减少了追踪代码的时间,节省时间精力;且本发明完全基于UEFI框架提供的官方接口实现,没有破坏原有的框架代码或者大幅度增加输出文件体积,具有低耦合度、高模块化和较好的可移植性的技术效果,适合推广使用。
实施例二:
如图4所示,本发明实施例提供了一种基于申威BIOS的栈回溯装置,可以用于实施实施例一所述的方法,具体包括:
获取模块,用于获取当前系统内所有加载模块的加载信息,并记录栈指针和调用各加载模块的加载地址;
提取模块,用于利用申威架构中栈帧结构回溯调用函数,通过指令扫描的方式提取返回地址和帧指针;
检测模块,用于对所提取的各所述返回地址和帧指针进行正确性检测;
回溯模块,用于将检测结果为正确的返回地址作为调用函数的函数地址,并将帧指针作为调用函数栈指针继续回溯,直至得到调用路径上所有返回地址时回溯结束;
解析模块,用于根据各所述加载信息对调用路径上所有返回地址进行解析,得到调用路径上各返回地址所在加载模块的名称和模块内偏移;
获得模块,用于运用本地分析工具解析调用路径上各返回地址所在加载模块的名称和模块内偏移,获得完整的栈回溯信息。
本发明实施例提供的基于申威BIOS的栈回溯装置与实施例一提供的基于申威BIOS的栈回溯方法基于相同的技术构思,能够产生如实施例一所述的有益效果,在本实施例中未详尽描述的内容可以参见实施例一。
实施例三:
本发明实施例提供了一种基于申威BIOS的栈回溯装置,包括处理器及存储介质;
所述存储介质用于存储指令;
处理器用于根据指令进行操作以执行根据实施例一中任一项方法的步骤。
实施例四:
本发明实施例提供了一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时,实现如实现实施例一中任一项方法的步骤。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变形,这些改进和变形也应视为本发明的保护范围。
Claims (10)
1.一种基于申威BIOS的栈回溯方法,其特征在于,所述方法包括:
获取当前系统内所有加载模块的加载信息,并记录栈指针和调用各加载模块的加载地址;
利用申威架构中栈帧结构回溯调用函数,通过指令扫描的方式提取返回地址和帧指针;
对所提取的各所述返回地址和帧指针进行正确性检测;
将检测结果为正确的返回地址作为调用函数的函数地址,并将帧指针作为调用函数栈指针继续回溯,直至得到调用路径上所有返回地址时回溯结束;
根据各所述加载信息对调用路径上所有返回地址进行解析,得到调用路径上各返回地址所在加载模块的名称和模块内偏移;
运用本地分析工具解析调用路径上各返回地址所在加载模块的名称和模块内偏移,获得完整的栈回溯信息。
2.根据权利要求1所述的基于申威BIOS的栈回溯方法,其特征在于,所述获取当前系统内所有加载模块的加载信息的步骤包括:
利用UEFI框架提供的查找协议接口遍历并读取各加载模块对应的映像协议中存放的内容;所述映像协议中存放的内容包括加载地址、文件大小和模块名称。
3.根据权利要求1所述的基于申威BIOS的栈回溯方法,其特征在于,所述通过指令扫描的方式提取返回地址和帧指针的步骤包括:
基于申威处理器定长指令的规整编码格式,使用当前函数的指令地址向上扫描之前执行过的指令,找到调用函数在做调用准备时存放帧指针和返回地址的指令;
利用申威架构规约的指令编码计算所存放的帧指针和返回地址在栈上的偏移;
使用栈上的偏移与当前栈指针提取出帧指针和返回地址,回溯到调用函数的栈空间。
4.根据权利要求1至3任一所述的基于申威BIOS的栈回溯方法,其特征在于,对所提取的各所述返回地址和帧指针进行正确性检测的步骤包括:
对返回地址的提取次数进行检测,若检测到多次,则判定为栈帧有误,退出服务;
对所提取的栈指针范围进行检测,若检测到所提取的栈指针超出设定范围,则判定为提取失败或已经到栈顶,退出服务;
对所提取的返回地址范围进行检测,若检测到当前所提取的返回地址的上一条PC存储指令不属于函数调用,则判定当前所提取的返回地址解析错误,服务退出;
若检测到返回地址的提取次数仅为一次、所提取的栈指针范围在设定范围内、且当前所提取的返回地址的上一条PC存储指令属于函数调用,则判定当前所提取的返回地址和帧指针的检测结果为正确。
5.根据权利要求4所述的基于申威BIOS的栈回溯方法,其特征在于,根据各所述加载信息对调用路径上所有返回地址进行解析的步骤包括:
历遍各所述加载模块的加载信息,比较调用路径上当前返回地址的PC存储指令是否落在其中一个加载模块的加载空间内;
若落在其中一个加载模块的加载空间内,则根据该加载模块的加载信息获得所述调用路径上当前返回地址的所在加载模块的模块名称和模块内偏移,所述模块内偏移的取值为当前返回地址与该模块加载位置的差值;
若不落在任一一个加载模块的加载空间内,则判定当前返回地址的PC存储指令错误,输出报错信息并停止解析。
6.根据权利要求1或5所述的基于申威BIOS的栈回溯方法,其特征在于,所述本地分析工具为PYTHON脚本语言,用于实现本地解析栈回溯信息。
7.根据权利要求6所述的基于申威BIOS的栈回溯方法,其特征在于,所述运用本地分析工具解析调用路径上各返回地址所在加载模块的名称和模块内偏移的步骤包括:
运用PYTHON脚本语言根据输入的栈回溯信息解析函数的调用顺序、调用函数返回地址、调用函数所在模块名称与调用函数在模块内偏移;
根据调用函数所在模块名称拼写出当前调用函数所在模块在打包加载前生成的二进制文件;
调用编译器提供的工具集中的符号解析指令获取相应模块内所有函数的相对偏移;
通过比较所述调用函数返回地址与各函数相对偏移计算出该调用函数返回地址位于哪个函数内,获取相应的函数名称,并将函数名称打印在输入信息之后,完成完整的栈回溯信息获取。
8.一种基于申威BIOS的栈回溯装置,其特征在于,所述装置包括:
获取模块,用于获取当前系统内所有加载模块的加载信息,并记录栈指针和调用各加载模块的加载地址;
提取模块,用于利用申威架构中栈帧结构回溯调用函数,通过指令扫描的方式提取返回地址和帧指针;
检测模块,用于对所提取的各所述返回地址和帧指针进行正确性检测;
回溯模块,用于将检测结果为正确的返回地址作为调用函数的函数地址,并将帧指针作为调用函数栈指针继续回溯,直至得到调用路径上所有返回地址时回溯结束;
解析模块,用于根据各所述加载信息对调用路径上所有返回地址进行解析,得到调用路径上各返回地址所在加载模块的名称和模块内偏移;
获得模块,用于运用本地分析工具解析调用路径上各返回地址所在加载模块的名称和模块内偏移,获得完整的栈回溯信息。
9.一种基于申威BIOS的栈回溯装置,其特征在于,包括处理器及存储介质;
所述存储介质用于存储指令;
所述处理器用于根据所述指令进行操作以执行根据权利要求1至7任一项所述的基于申威BIOS的栈回溯方法的步骤。
10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该计算机程序被处理器执行时,实现如权利要求1至7任一项所述的基于申威BIOS的栈回溯方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211463133.3A CN115756647A (zh) | 2022-11-22 | 2022-11-22 | 一种基于申威bios的栈回溯方法、装置及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211463133.3A CN115756647A (zh) | 2022-11-22 | 2022-11-22 | 一种基于申威bios的栈回溯方法、装置及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115756647A true CN115756647A (zh) | 2023-03-07 |
Family
ID=85334809
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211463133.3A Pending CN115756647A (zh) | 2022-11-22 | 2022-11-22 | 一种基于申威bios的栈回溯方法、装置及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115756647A (zh) |
-
2022
- 2022-11-22 CN CN202211463133.3A patent/CN115756647A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110347598B (zh) | 一种测试脚本生成方法、装置、服务器及存储介质 | |
US10713437B2 (en) | Method and apparatus for identifying questionable line break characters in an application | |
CN110990411B (zh) | 数据结构的生成方法及装置、调用方法及装置 | |
CN112100072A (zh) | 应用程序代码的静态检测方法、装置、设备及介质 | |
CN112925524A (zh) | 一种检测驱动程序中不安全直接存储器访问的方法及装置 | |
CN112905378A (zh) | 崩溃信息解析方法、装置、电子设备和可读存储介质 | |
CN111352631B (zh) | 一种接口兼容性检测方法及装置 | |
CN115756647A (zh) | 一种基于申威bios的栈回溯方法、装置及存储介质 | |
CN117113338A (zh) | 一种检测vpp内存泄露的系统、方法、存储介质及设备 | |
CN115756935A (zh) | 嵌入式软件系统的异常故障定位方法、装置及设备 | |
CN115033489A (zh) | 代码资源检测方法、装置、电子设备及存储介质 | |
CN113742252B (zh) | 一种检测内存乱序的方法及装置 | |
US9495278B2 (en) | Dynamic discovery of data segments within instrumented code | |
CN112069006B (zh) | 一种检测分析gpu速率状态的方法、装置及计算机可读介质 | |
CN112148581A (zh) | 代码规范检查方法、装置、系统及存储介质 | |
CN114237773A (zh) | 适用于pon嵌入式arm架构的程序异常定位方法及装置 | |
US11853151B1 (en) | Task abnormality detection system and embedded device detection method | |
CN112527660B (zh) | 代码的静态检测方法和装置 | |
CN114265779A (zh) | 定位程序宕机位置的方法、装置、电子设备、存储介质 | |
CN115795488B (zh) | 代码检测系统及代码检测方法 | |
US20230236868A1 (en) | Register Caching for Efficient Virtual Machine Introspection | |
Sato et al. | Comparing Execution Traces of Jupyter Notebook for Checking Correctness of Refactoring | |
CN106502755B (zh) | 一种检查Linux内核模块未知符号的方法及装置 | |
CN117667711A (zh) | 一种产线bug检测方法、装置、系统和存储介质 | |
JP2795332B2 (ja) | ループ処理誤り検出装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |