CN110489258A - 一种基于xtensa处理器的栈回溯方法及装置 - Google Patents

一种基于xtensa处理器的栈回溯方法及装置 Download PDF

Info

Publication number
CN110489258A
CN110489258A CN201910681672.6A CN201910681672A CN110489258A CN 110489258 A CN110489258 A CN 110489258A CN 201910681672 A CN201910681672 A CN 201910681672A CN 110489258 A CN110489258 A CN 110489258A
Authority
CN
China
Prior art keywords
stack
register
slippage
registers
xtensa
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.)
Withdrawn
Application number
CN201910681672.6A
Other languages
English (en)
Inventor
邓京涛
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Suzhou Wave Intelligent Technology Co Ltd
Original Assignee
Suzhou Wave Intelligent Technology Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Suzhou Wave Intelligent Technology Co Ltd filed Critical Suzhou Wave Intelligent Technology Co Ltd
Priority to CN201910681672.6A priority Critical patent/CN110489258A/zh
Publication of CN110489258A publication Critical patent/CN110489258A/zh
Withdrawn legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/079Root cause analysis, i.e. error or fault diagnosis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/0793Remedial or corrective actions

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Health & Medical Sciences (AREA)
  • Biomedical Technology (AREA)
  • Executing Machine-Instructions (AREA)

Abstract

本发明公开了一种基于xtensa处理器的栈回溯方法,包括以下步骤:异常中断或手动触发时保存ar寄存器值和dram信息;采用滑差间隔为N个的ar窗口寄存器倒序恢复现场;采用xtensa处理器函数调用算法,反向恢复栈调用关系。本发明还提供了一种基于xtensa处理器的栈回溯装置。本发明能够实时地在程序异常后,获得程序异常前的函数调用栈信息及异常信息。能够帮助工程师在产品异常情况下,快速定位程序异常原因,能够快速的得到异常情况下的函数调用栈,能够帮助工程师快速、准确的定位bug原因,极大的提高了解决bug的效率,将损失减小到最小。

Description

一种基于xtensa处理器的栈回溯方法及装置
技术领域
本发明涉及嵌入式系统技术领域,尤其是一种基于xtensa处理器的栈回溯方法及装置。
背景技术
产品在实际运行过程中,会存在程序出现异常的可能性。但是往往会缺少一种手段能够获得异常情况下程序的调用栈信息,以及异常原因,使程序bug的定位变的异常艰难。不同处理器的调用栈获取方式和处理器本身的函数调用方式息息相关,基于arm的处理器栈回溯是相对简单的,调用信息是在栈上的,是可寻址的,是空间上的回溯。根据xtensa处理器特性,在程序出现异常后,程序会跳转到异常中断执行,在异常中断中保存所有的ar寄存器,并将128K的DRAM信息保存到DDR。除了在异常情况下(比如除零异常、内存访问异常、指令异常等)进行保存外,还支持在其他情况下的手动触发保存,这需要不仅能获得64个ar寄存器值,还需要保证不能破坏现场(所有ar寄存器值),然而xtensa处理器每次只有16个寄存器可见,并且无法通过寻址的方式找到其他寄存器,必须通过移动窗口,回退到之前的函数调用点的窗口下,需要时间+空间的回溯。要想保存这16个寄存器,必然在保存过程中需要使用其中的2~3个寄存器,这样就破坏了现场。当我们回退到某个窗口下时,就不得不破坏ar寄存器现场去保存调用关系。
发明内容
本发明的目的是提供一种基于xtensa处理器的栈回溯方法及装置,能够快速的得到异常情况下的函数调用栈,能够帮助工程师快速、准确的定位bug原因,极大的提高了解决bug的效率,将损失减小到最小。
为实现上述目的,本发明采用下述技术方案:
本发明第一方面提供了一种基于xtensa处理器的栈回溯方法,包括以下步骤:
异常中断或手动触发时保存ar寄存器值和dram信息;
采用滑差间隔为N个的ar窗口寄存器倒序恢复现场;
采用xtensa处理器函数调用算法,反向恢复栈调用关系。
结合第一方面,在第一方面第一种可能的实现方式中,所述异常包括:内存访问异常、除零异常、非对齐异常、非法指令异常。
结合第一方面,在第一方面第二种可能的实现方式中,所述采用滑差间隔为N个的ar窗口寄存器倒序恢复现场,具体包括:
采用滑差间隔为四个的ar窗口寄存器倒序恢复ar物理寄存器值至DARM;
将DRAM信息保存到DDR。
结合第一方面,在第一方面第三种可能的实现方式中,所述采用滑差间隔为四个的ar窗口寄存器倒序恢复ar物理寄存器值至DARM,具体包括:
使用当前现场的ar4~ar7窗口寄存器保存当前现场的ar0~ar3窗口寄存器值,再向前滑四个寄存器,直到保存到最起始的ar寄存器值为止,所述最起始的ar寄存器为异常中断现场下的ar物理寄存器或手动触发时中断处理函数所在现场下的ar物理寄存器;
保存完成后,向后滑差四个寄存器后,使用之前保存寄存器值来恢复ar0~ar3物理寄存器,直到恢复到最近的ar寄存器值,所述最近的ar寄存器为当前现场的ar0-ar3窗口寄存器对应的ar物理寄存器。
结合第一方面,在第一方面第四种可能的实现方式中,所述采用滑差间隔为四个的ar窗口寄存器倒序恢复ar物理寄存器值至DARM,具体包括:
通过设置寄存器windowbase和windowstart的数值完成窗口寄存器的移动。
结合第一方面,在第一方面第五种可能的实现方式中,所述采用xtensa处理器函数调用算法,反向恢复栈调用关系,具体包括:
从当前函数使用的ar1物理寄存器中获取栈地址,通过栈地址恢复上一级函数的ar0-ar7物理寄存器,上一级函数的a0代表是该函数的返回地址,计算出上一级函数调用地址=a0-3。
本发明第二方面提供一种基于xtensa处理器的栈回溯装置,包括:
异常保存模块,异常中断或手动触发时保存ar寄存器值和dram信息;
现场滑差恢复模块,采用滑差间隔为N个的ar窗口寄存器倒序恢复现场;
调用关系恢复模块,采用xtensa处理器函数调用算法,反向恢复栈调用关系。
本发明第二方面的所述基于xtensa处理器的栈回溯装置能够实现第一方面及第一方面的各实现方式中的方法,并取得相同的效果。
发明内容中提供的效果仅仅是实施例的效果,而不是发明所有的全部效果,上述技术方案中的一个技术方案具有如下优点或有益效果:
本发明在异常中断中保存ar寄存器值和dram信息,并采用了滑差移动保存的算法恢复现场,且利用xtensa处理器函数调用算法,反向恢复栈调用关系,通过这种方式一级一级的递归,找到源头后,递归返回时恢复现场。能够实时地在程序异常后,获得程序异常前的函数调用栈信息及异常信息。能够帮助工程师在产品异常情况下,快速定位程序异常原因,能够快速的得到异常情况下的函数调用栈,能够帮助工程师快速、准确的定位bug原因,极大的提高了解决bug的效率,将损失减小到最小。
附图说明
图1是本发明方法实施例流程图;
图2是本发明装置实施例示意图。
具体实施方式
为能清楚说明本方案的技术特点,下面通过具体实施方式,并结合其附图,对本发明进行详细阐述。下文的公开提供了许多不同的实施例或例子用来实现本发明的不同结构。为了简化本发明的公开,下文中对特定例子的部件和设置进行描述。此外,本发明可以在不同例子中重复参考数字和/或字母。这种重复是为了简化和清楚的目的,其本身不指示所讨论各种实施例和/或设置之间的关系。应当注意,在附图中所图示的部件不一定按比例绘制。本发明省略了对公知组件和处理技术及工艺的描述以避免不必要地限制本发明。
如图1所示,一种基于xtensa处理器的栈回溯方法,包括以下步骤:
S1、异常中断或手动触发时保存ar寄存器值和dram信息。
异常包括:内存访问异常、除零异常、非对齐异常、非法指令异常。
S2、采用滑差间隔为N个的ar窗口寄存器倒序恢复现场。
S3、采用xtensa处理器函数调用算法,反向恢复栈调用关系。
为了说明栈回溯的具体实现,需要先说明下xtensa处理器是如何进行函数调用和相关栈保存的。xtensa处理器有64个ar寄存器,但是每次可见的只有16个,并且总是ar0~15,每一次函数调用都会根据调用方式的不同选择滑动窗口,大小可能是4、8或12,例如,如果采用call8(当然还有可能是call4、call12)的调用方式,如果当前的窗口为ar0~15,则调用函数后会将窗口滑到ar8~23,会将ar8~23作为当前的ar0~15;再说明下ar0~15分别代表的含义,ar0可以简单的认为是函数的返回地址,它等于函数的调用地址(addr_A)加3,我们要得到的地址addr_A=ar0–3;ar1等于函数的栈顶指针;其它的ar2~15可能包含函数的传入参数,及函数执行相关的变量。
函数的调用在C语法层面是不会限制调用深度的,但是xtensa处理器的ar寄存器一共就64个,是如何保证所有的调用关系会被记录的?xtensa处理器在64个寄存器都用尽后,继续循环使用,但是会将被覆盖的ar寄存器值根据特定的规则保存到栈上。在函数调用返回时将其从栈中恢复。
根据xtensa处理器特性,在程序出现异常后,程序会跳转到异常中断执行,在异常中断中保存所有的ar寄存器,并将128K的DRAM信息保存到DDR。除了在异常情况下(比如除零异常、内存访问异常、指令异常等)进行保存外,还支持在其他情况下的手动触发保存,这需要不仅能获得64个ar寄存器值,还需要保证不能破坏现场(所有ar寄存器值)。手动触发保存是在中断中执行的。当收到下发的触发命令后,立即执行相关保存,因命令处理是在中断中执行,所以能够处理栈回溯任务。
步骤S2中,采用滑差间隔为N个的ar窗口寄存器倒序恢复现场,具体包括:
S21、采用滑差间隔为四个的ar窗口寄存器倒序恢复ar物理寄存器值至DARM;
S22、将DRAM信息保存到DDR。
步骤S21中,采用滑差间隔为四个的ar窗口寄存器倒序恢复ar物理寄存器值至DARM,具体包括:
使用当前现场的ar4~ar7窗口寄存器保存当前现场的ar0~ar3窗口寄存器值,再向前滑四个寄存器,直到保存到最起始的ar寄存器值为止,所述最起始的ar寄存器为异常中断现场下的ar物理寄存器或手动触发时中断处理函数所在现场下的ar物理寄存器。
因为每次只保存4个寄存器a0~a3,都会牺牲a4~a7的值,在保存完所有需要保存的值后,除了当前的a0~a3,其它的现场都发生改变,这样需要将之前保存的ar寄存器值逐个恢复。
保存完成后,向后滑差四个寄存器后,使用之前保存寄存器值来恢复ar0~ar3物理寄存器,直到恢复到最近的ar寄存器值,所述最近的ar寄存器为当前现场的ar0-ar3窗口寄存器对应的ar物理寄存器。
举例说明:假设当前现场在ar48-ar63物理寄存器,即与当前现场的ar0-ar15窗口寄存器对应关系为ar48物理寄存器对应ar0窗口寄存器,ar49物理寄存器对应ar1窗口寄存器,ar50物理寄存器对应ar2窗口寄存器,ar51物理寄存器对应ar3窗口寄存器....
ar56-ar59可以破坏,使用ar56-ar59物理寄存器保存ar52-ar55寄存器值;
...
移动窗口至ar40-ar43,使用ar44-ar47保存ar40-ar43寄存器值;
...
移动窗口至ar0-ar3,使用ar4-ar7保存ar0-ar3寄存器值;
移动窗口至ar4-ar7,使用之前保存的ar8-ar11寄存器值恢复ar4-ar7寄存器,使用该方式恢复到ar52-ar55,ar56-ar59可以不用恢复。
具体地,通过设置寄存器windowbase和windowstart的数值完成窗口寄存器的移动。调节窗口需要两个寄存器,分别为:windowbase和windowstart,windowbase:低4位有效,范围为:0~f。windowstart:低16位有效,范围为:0~0xffff。当移动窗口时,例如,windowbase=3,则windowstart|=0x01<<3如果windowbase=0x7,windowstart=0xaa;那么当前的ar寄存器窗口在arphysical寄存器的28~43,如果想移动当前的窗口到24~39,那么需要将windowbase=0x6,windowstart=0x6a;如果想移动当前的窗口到20~35,那么需要将windowbase=0x5,windowstart=0x2a。
步骤S3中,采用xtensa处理器函数调用算法,反向恢复栈调用关系,具体包括:
从当前函数使用的ar1物理寄存器中获取栈地址,通过栈地址恢复上一级函数的ar0-ar7物理寄存器,上一级函数的a0代表是该函数的返回地址,计算出上一级函数调用地址=a0-3。
举例:foo_1()->foo_2()->foo_3()->foo_4(),foo_2()的a0~a3会保存在foo_3()的栈顶指针-16的位置,那它的a4~a7(如果有的话)会保存在foo_3()的栈顶-32的位置。这样我们如果想回溯foo_2()的a0~a7,只需知道要下一级函数foo_3的栈顶地址即可。这个也是在stack上回溯代码的原理。我们通过这种方式一级一级的递归,找到源头后,递归返回时恢复现场。
如图2所示,一种基于xtensa处理器的栈回溯装置,包括:
异常保存模块101,异常中断或手动触发时保存ar寄存器值和dram信息;
现场滑差恢复模块102,采用滑差间隔为N个的ar窗口寄存器倒序恢复现场;
调用关系恢复模块103,采用xtensa处理器函数调用算法,反向恢复栈调用关系。
上述虽然结合附图对本发明的具体实施方式进行了描述,但并非对本发明保护范围的限制,所属领域技术人员应该明白,在本发明的技术方案的基础上,本领域技术人员不需要付出创造性劳动即可做出的各种修改或变形仍在本发明的保护范围以内。

Claims (7)

1.一种基于xtensa处理器的栈回溯方法,其特征是,包括以下步骤:
异常中断或手动触发时保存ar寄存器值和dram信息;
采用滑差间隔为N个的ar窗口寄存器倒序恢复现场;
采用xtensa处理器函数调用算法,反向恢复栈调用关系。
2.如权利要求1所述的基于xtensa处理器的栈回溯方法,其特征是,所述异常包括:内存访问异常、除零异常、非对齐异常、非法指令异常。
3.如权利要求1所述的基于xtensa处理器的栈回溯方法,其特征是,所述采用滑差间隔为N个的ar窗口寄存器倒序恢复现场,具体包括:
采用滑差间隔为四个的ar窗口寄存器倒序恢复ar物理寄存器值至DARM;
将DRAM信息保存到DDR。
4.如权利要求3所述的基于xtensa处理器的栈回溯方法,其特征是,所述采用滑差间隔为四个的ar窗口寄存器倒序恢复ar物理寄存器值至DARM,具体包括:
使用当前现场的ar4~ar7窗口寄存器保存当前现场的ar0~ar3窗口寄存器值,再向前滑四个寄存器,直到保存到最起始的ar寄存器值为止,所述最起始的ar寄存器为异常中断现场下的ar物理寄存器或手动触发时中断处理函数所在现场下的ar物理寄存器;
保存完成后,向后滑差四个寄存器后,使用之前保存寄存器值来恢复ar0~ar3物理寄存器,直到恢复到最近的ar寄存器值,所述最近的ar寄存器为当前现场的ar0-ar3窗口寄存器对应的ar物理寄存器。
5.如权利要求4所述的基于xtensa处理器的栈回溯方法,其特征是,所述采用滑差间隔为四个的ar窗口寄存器倒序恢复ar物理寄存器值至DARM,具体包括:
通过设置寄存器windowbase和windowstart的数值完成窗口寄存器的移动。
6.如权利要求5所述的基于xtensa处理器的栈回溯方法,其特征是,所述采用xtensa处理器函数调用算法,反向恢复栈调用关系,具体包括:
从当前函数使用的ar1物理寄存器中获取栈地址,通过栈地址恢复上一级函数的ar0-ar7物理寄存器,上一级函数的a0代表是该函数的返回地址,计算出上一级函数调用地址=a0-3。
7.一种基于xtensa处理器的栈回溯装置,其特征是,包括:
异常保存模块,异常中断或手动触发时保存ar寄存器值和dram信息;
现场滑差恢复模块,采用滑差间隔为N个的ar窗口寄存器倒序恢复现场;
调用关系恢复模块,采用xtensa处理器函数调用算法,反向恢复栈调用关系。
CN201910681672.6A 2019-07-26 2019-07-26 一种基于xtensa处理器的栈回溯方法及装置 Withdrawn CN110489258A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910681672.6A CN110489258A (zh) 2019-07-26 2019-07-26 一种基于xtensa处理器的栈回溯方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910681672.6A CN110489258A (zh) 2019-07-26 2019-07-26 一种基于xtensa处理器的栈回溯方法及装置

Publications (1)

Publication Number Publication Date
CN110489258A true CN110489258A (zh) 2019-11-22

Family

ID=68547688

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910681672.6A Withdrawn CN110489258A (zh) 2019-07-26 2019-07-26 一种基于xtensa处理器的栈回溯方法及装置

Country Status (1)

Country Link
CN (1) CN110489258A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112732481A (zh) * 2020-12-31 2021-04-30 南方电网科学研究院有限责任公司 一种处理器的异常修复方法及装置

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112732481A (zh) * 2020-12-31 2021-04-30 南方电网科学研究院有限责任公司 一种处理器的异常修复方法及装置
CN112732481B (zh) * 2020-12-31 2023-10-10 南方电网科学研究院有限责任公司 一种处理器的异常修复方法及装置

Similar Documents

Publication Publication Date Title
CN101937372B (zh) 异常处理的方法及装置
EP3451156B1 (en) Apparatus and method for executing vector circular shift operation
CN106802785B (zh) 一种栈解析方法和装置
CN104580451A (zh) 实现多平台间账号同步的方法和系统、及电子设备
CN111161169B (zh) 基于霍夫变换的绝对相位噪声去除方法、装置和存储介质
CN103870767A (zh) 基于ebp构造的栈栈帧内容保护方法
US20160225119A1 (en) Systems and methods for calculating a feature descriptor
CN104572845A (zh) 文件分发方法、装置、设备及系统
CN103577546A (zh) 一种数据备份的方法、设备及分布式集群文件系统
CN111881012A (zh) 一种日志记录方法、装置、设备及存储介质
CN110489258A (zh) 一种基于xtensa处理器的栈回溯方法及装置
CN103309741B (zh) 调用插件功能的方法和装置
CN107085516A (zh) 一种修改配置的方法及装置
CN114297630A (zh) 恶意数据的检测方法、装置、存储介质及处理器
CN107239298A (zh) 应用程序调试方法及装置
CN108241543A (zh) 业务操作断点执行的方法、业务服务器及系统
CN111708576A (zh) 跨操作系统的设备网卡适配和管理方法、装置及系统
CN105335940A (zh) 一种实现图像的滤镜效果的方法、装置及服务器
CN103514402A (zh) 入侵检测方法及装置
CN103106221A (zh) 一种网页链接库的更新方法及系统
CN108959070A (zh) 一种基于代码对象的Python钩子函数方法和装置
CN104572482A (zh) 一种过程变量的存储方法及装置
WO2008026957A1 (en) A split stage call sequence restoration method
US9256626B2 (en) Maintaining multiple copy versions of component values in a system
US20160328311A1 (en) Operating a trace procedure for a computer program

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
WW01 Invention patent application withdrawn after publication

Application publication date: 20191122

WW01 Invention patent application withdrawn after publication