基于C-SKY架构芯片的异常调用栈回溯方法、装置和服务器与流程

未命名 10-18 阅读:120 评论:0

基于c-sky架构芯片的异常调用栈回溯方法、装置和服务器
技术领域
1.本技术涉及计算机技术领域,特别是涉及一种基于c-sky架构芯片的异常调用栈回溯方法、基于c-sky架构芯片的异常调用栈回溯装置、服务器、存储介质和计算机程序产品。


背景技术:

2.调用栈回溯(backtrace)是一种调试技术,通常在程序崩溃或者出现异常情况时,开发人员通过调用栈回溯技术可以得到关于程序崩溃时被调用函数的返回地址,从而通过被调用函数的返回地址快速定位故障所在,从而进行故障修复。
3.在当前的调用栈回溯中,一般是通过确定调用栈中关于被调用函数的访问地址也存在于程序源码库中关于被调用函数的源码文本中,从而确定被调用函数的访问地址即为返回地址。但是目前的方式,容易将访问地址误判为源码文本中的其他地址,导致调用栈回溯精度不高,不利于后续对程序故障的诊断和解决。


技术实现要素:

4.基于此,有必要针对上述技术问题,提供一种基于c-sky架构芯片的异常调用栈回溯方法、基于c-sky架构芯片的异常调用栈回溯装置、服务器、存储介质和计算机程序产品。
5.根据本公开实施例的第一方面,提供一种基于c-sky架构芯片的异常调用栈回溯方法,包括:
6.在芯片运行的过程中出现异常的情况下,获取所述芯片在运行当前调用函数时产生的源码文本和栈帧地址;所述芯片为基于c-sky架构开发的嵌入式芯片,所述栈帧地址为所述芯片应用的调用栈中针对所述当前调用函数的栈帧的访问地址;
7.基于所述栈帧地址对所述源码文本进行文本检测,以在检测到所述栈帧地址存在于所述源码文本中的情况下,获取待识别指令;所述待识别指令为所述源码文本中相对于所述栈帧地址所在位置的前一访问地址对应的应用指令;
8.将所述待识别指令与预设指令进行比对,以在所述待识别指令与预设指令比对相同的情况下,确定所述栈帧地址为所述当前调用函数的函数返回地址,并对所述函数返回地址进行回溯。
9.在一示例性实施例中,所述预设指令为应用于32位相对函数或者16位相对函数的跳转指令;所述将所述待识别指令与预设指令进行比对,以在所述待识别指令与预设指令比对相同的情况下,确定所述栈帧地址为所述当前调用函数的函数返回地址,包括:
10.对所述待识别指令的第一掩码和所述跳转指令的第二掩码进行与运算,以剔除所述待识别指令中的变量数据和所述跳转指令中的变量数据,得到所述待识别指令中的常量数据和所述跳转指令中的常量数据;
11.在比对所述待识别指令中的常量数据和所述跳转指令中的常量数据相同的情况下,将所述第一掩码的逆反值和所述第二指令的逆反值进行与运算,得到运算数值;
12.在所述运算数值非零的情况下,确定所述栈帧地址为所述当前调用函数的函数返回地址。
13.在一示例性实施例中,所述预设指令为应用于32位绝对函数或者16位绝对函数的跳转指令;所述将所述待识别指令与预设指令进行比对,以在所述待识别指令与预设指令比对相同的情况下,确定所述栈帧地址为所述当前调用函数的函数返回地址,包括:
14.对所述待识别指令的掩码和所述跳转指令的掩码进行与运算,以剔除所述待识别指令中的变量数据和所述跳转指令中的变量数据,得到所述待识别指令中的常量数据和所述跳转指令中的常量数据;
15.在比对所述待识别指令中的常量数据和所述跳转指令中的常量数据相同的情况下,确定所述栈帧地址为所述当前调用函数的函数返回地址。
16.在一示例性实施例中,所述在检测到所述栈帧地址存在于所述源码文本中的情况下,获取待识别指令,包括:
17.在所述源码文本中,将所述栈帧地址向前偏移一个地址长度得到所述待识别指令的地址;
18.基于所述待识别指令的地址,获取待识别指令。
19.在一示例性实施例中,在所述调用栈中存储有多个调用函数对应的栈帧,且每个栈帧内存储有对应调用函数的调用栈数据;所述获取所述芯片在运行当前调用函数时产生的源码文本和栈帧地址,包括:
20.获取所述芯片在运行调用函数时产生的源码数据和调用栈数据;
21.基于所述源码数据中针对所述当前调用函数的数据开始地址和数据结束地址,从所述源码数据中提取出针对所述当前调用函数的源码文本;以及
22.基于所述调用栈数据中的栈顶地址、栈底地址、针对所述当前调用函数的栈帧地址和应用程序地址,从所述调用栈数据中提取出针对所述当前调用函数的栈帧地址。
23.在一示例性实施例中,在所述基于所述栈帧地址对所述源码文本进行文本检测之后,还包括:
24.在未检测到所述栈帧地址存在于所述源码文本中的情况下,结束对所述当前调用函数执行的调用栈回溯过程,并对相对于所述当前调用函数的上一调用函数执行所述调用栈回溯。
25.在一示例性实施例中,在所述将所述待识别指令与预设指令进行比对之后,还包括:
26.在所述待识别指令与预设指令比对不相同的情况下,结束对所述当前调用函数执行的调用栈回溯过程,并对相对于所述当前调用函数的上一调用函数执行所述调用栈回溯。
27.根据本公开实施例的第二方面,提供一种基于c-sky架构芯片的异常调用栈回溯装置,包括:
28.数据获取单元,被配置为执行在芯片运行的过程中出现异常的情况下,获取所述芯片在运行当前调用函数时产生的源码文本和栈帧地址;所述芯片为基于c-sky架构开发的嵌入式芯片,所述栈帧地址为所述芯片应用的调用栈中针对所述当前调用函数的栈帧的访问地址;
29.指令获取单元,被配置为执行基于所述栈帧地址对所述源码文本进行文本检测,以在检测到所述栈帧地址存在于所述源码文本中的情况下,获取待识别指令;所述待识别指令为所述源码文本中相对于所述栈帧地址所在位置的前一访问地址对应的应用指令;
30.地址回溯单元,被配置为执行将所述待识别指令与预设指令进行比对,以在所述待识别指令与预设指令比对相同的情况下,确定所述栈帧地址为所述当前调用函数的函数返回地址,并对所述函数返回地址进行回溯。
31.根据本公开实施例的第三方面,提供一种服务器,包括:
32.处理器;
33.用于存储所述处理器的可执行指令的存储器;
34.其中,所述处理器被配置为执行所述可执行指令,以实现如上述任一项所述的基于c-sky架构芯片的异常调用栈回溯方法。
35.根据本公开实施例的第四方面,提供一种计算机可读存储介质,所述计算机可读存储介质中包括计算机程序,当所述计算机程序由服务器的处理器执行时,使得所述服务器能够执行如上述任一项所述的基于c-sky架构芯片的异常调用栈回溯方法。
36.根据本公开实施例的第五方面,提供一种计算机程序产品,所述计算机程序产品中包括程序指令,所述程序指令被服务器的处理器执行时,使得所述服务器能够执行如上述任一项所述的基于c-sky架构芯片的异常调用栈回溯方法。
37.本公开的实施例提供的技术方案至少带来以下有益效果:
38.该方法先通过在芯片运行的过程中出现异常的情况下,获取芯片在运行当前调用函数时产生的源码文本和栈帧地址;芯片为基于c-sky架构开发的嵌入式芯片,栈帧地址为芯片应用的调用栈中针对当前调用函数的栈帧的访问地址;基于栈帧地址对源码文本进行文本检测,以在检测到栈帧地址存在于源码文本中的情况下,获取待识别指令;待识别指令为源码文本中相对于栈帧地址所在位置的前一访问地址对应的应用指令;将待识别指令与预设指令进行比对,以在待识别指令与预设指令比对相同的情况下,确定栈帧地址为当前调用函数的函数返回地址,并对函数返回地址进行回溯。这样,在一方面,利用芯片在运行当前调用函数时产生的源码文本和栈帧地址,来获取相对于栈帧地址所在位置的前一访问地址的待识别指令,并在待识别指令与预设指令比对相同的情况下确定栈帧地址为当前调用函数的函数返回地址,从而优化了函数返回地址实部的流程,降低了人力和物力的消化;在另一方面,在检测到栈帧地址存在于源码文本中的情况下,根据待识别指令与预设指令之间的比对情况,对函数返回地址进行回溯,能够有效避免将函数的访问地址误判为源码文本中的其他地址的情况,进而提升调用栈回溯的准确性,从而便于后续对程序故障的诊断和解决。
39.应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。
附图说明
40.图1是根据一示例性实施例示出的一种基于c-sky架构芯片的异常调用栈回溯方法的应用环境图;
41.图2是根据一示例性实施例示出的一种基于c-sky架构芯片的异常调用栈回溯方
法的流程示意图;
42.图3是根据一示例性实施例示出的一种基于c-sky架构芯片的异常调用栈回溯方法的模块示意图;
43.图4是根据一示例性实施例示出的一种确定函数返回地址步骤的流程示意图;
44.图5是根据一示例性实施例示出的一种基于c-sky架构芯片的异常调用栈回溯装置的框图;
45.图6是根据一示例性实施例示出的一种用于异常调用栈回溯的服务器框图。
具体实施方式
46.为了使本技术的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本技术进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本技术,并不用于限定本技术。
47.本技术中的术语“第一”、“第二”等是用于区别不同对象,而不是用于描述特定顺序。此外,尽管多次采用术语“第一”、“第二”等来描述各种操作(或各种阈值或各种应用或各种指令或各种元件)等,不过这些操作(或阈值或应用或指令或元件)不应受这些术语的限制。这些术语只是用于区分一个操作(或阈值或应用或指令或元件)和另一个操作(或阈值或应用或指令或元件)。
48.本技术实施例提供的基于c-sky架构芯片的异常调用栈回溯方法,可以应用于如图1所示的应用环境中。其中,终端102通过通信网络与服务器104进行通信。数据存储系统可以存储服务器104需要处理的数据。数据存储系统可以集成在服务器104上,也可以放在云上或其他网络服务器上。
49.在一些实施例中,参考图1,服务器104首先在芯片运行的过程中出现异常的情况下,获取芯片在运行当前调用函数时产生的源码文本和栈帧地址;芯片为基于c-sky架构开发的嵌入式芯片,所述栈帧地址为所述芯片应用的调用栈中针对所述当前调用函数的栈帧的访问地址;然后,服务器104基于所述栈帧地址对所述源码文本进行文本检测,以在检测到所述栈帧地址存在于所述源码文本中的情况下,获取待识别指令;待识别指令为所述源码文本中相对于栈帧地址所在位置的前一访问地址对应的应用指令;最后,服务器104将待识别指令与预设指令进行比对,以在待识别指令与预设指令比对相同的情况下,确定所述栈帧地址为所述当前调用函数的函数返回地址,并对所述函数返回地址进行回溯。
50.在一些实施例中,终端102(如移动终端、固定终端)可以以各种形式来实施。其中,终端102可为包括诸如移动电话、智能电话、笔记本电脑、便携式手持式设备、个人数字助理(pda,personal digital assistant)、平板电脑(pad)等等的移动终端,终端102也可以是自动柜员机(automated teller machine,atm)、自动一体机、数字tv、台式计算机、固式计算机等等的固定终端。
51.下面,假设终端102是固定终端。然而,本领域技术人员将理解的是,若有特别用于移动目的的操作或者元件,根据本技术公开的实施方式的构造也能够应用于移动类型的终端102。
52.在一些实施例中,服务器104运行的数据处理组件可以加载正在被执行的可以包括各种附加服务器应用和/或中间层应用中的任何一种,如包括http(超文本传输协议)、
ftp(文件传输协议)、cgi(通用网关界面)、rdbms(关系型数据库管理系统)等。
53.在一些实施例中,服务器104可以用独立的服务器或者是多个服务器组成的服务器集群来实现。服务器104可以适于运行提供前述公开中描述的终端102的一个或多个应用服务或软件组件。
54.在一些实施例中,app或者客户端运行的操作系统可以包括各种版本的microsoftapple和/或linux操作系统、各种商用或类操作系统(包括但不限于各种gnu/linux操作系统、googleos等)和/或移动操作系统,诸如phone、os、os、os操作系统,以及其它在线操作系统或者离线操作系统,在这里不做具体的限制。
55.在一实施例中,在c-sky架构的芯片运行中,若因系统运行出错而产生异常,则在产生异常后会系统自动进入异常处理(exc_handler)的流程;若因系统触发断言而产生异常,则在触发断言后系统会进入断言处理(assert_handler)的流程。其中,在异常处理或断言处理的流程过程中,服务器执行本技术中的调用栈回溯方法,以确定发生异常时正在调用的函数的返回地址,从而利用函数的返回地址对异常进行修复。
56.通常在程序崩溃或者出现异常情况时,开发人员很难立即准确地判断哪些代码导致了问题,调用栈回溯技术可以提供关于程序崩溃或异常的更多上下文信息,通过查看这些信息可以帮助开发人员快速定位问题所在,从而进行修复。在调试阶段,开发人员也经常会利用调用栈回溯来追踪程序执行路径,以便更好地理解代码的行为。
57.在一些实施例中,如图2和图3所示,图2提供了一种基于c-sky架构芯片的异常调用栈回溯方法的流程示意图,图3提供了一种基于c-sky架构芯片的异常调用栈回溯方法的模块示意图,以该方法应用于图1中的服务器104为例进行说明,该方法包括以下步骤:
58.步骤s11,在芯片运行的过程中出现异常的情况下,获取芯片在运行当前调用函数时产生的源码文本和栈帧地址。
59.其中,该芯片为基于c-sky架构开发的嵌入式芯片。在其他实施例中,该芯片也可以为通用类型的芯片或者特用于某些设备、场景的特殊芯片。
60.在一实施例中,栈帧地址为芯片应用的调用栈中针对当前调用函数的栈帧的访问地址。其中,在调用栈中存储有多个调用函数对应的栈帧,且每个栈帧内存储有对应调用函数的栈帧地址和临时变量,这些栈帧地址和临时变量都是栈帧内的调用栈数据。
61.其中,在发生函数调用时,服务器会将部分寄存器压入到调用栈中,比如c-sky架构中的lr寄存器、rx寄存器等,并利用寄存器存储对应每个调用函数对应的调用栈数据,包括将栈帧地址存储为寄存器的值,将调用函数的临时变量存储在不同介质中以区分不同的临时变量。
62.在一实施例中,服务器获取芯片在运行当前调用函数时产生的源码文本和栈帧地址,包括如下步骤:
63.步骤一:获取芯片在运行调用函数时产生的源码数据。
64.其中,源码数据为芯片在运行各个调用函数时产生的各种代码数据,这些代码可以表征被调用函数的地址和各种运行参数。
65.步骤二:基于源码数据中针对当前调用函数的数据开始地址和数据结束地址,从源码数据中提取出针对当前调用函数的源码文本。
66.其中,源码数据为由多个代码段落做成,每个被调用函数所对应的源码文本在源码数据中占据多段连续的代码段落。服务器根据当前调用函数的数据开始地址(即源码数据中属于当前调用函数的第一段位置的代码)和数据结束地址(即源码数据中属于当前调用函数的最后一段位置的代码),从源码数据中提取出针对当前调用函数的源码文本(即源码数据中属于当前调用函数的多段连续的代码段落)。
67.在一实施例中,服务器获取芯片在运行当前调用函数时产生的栈帧地址,包括如下步骤:
68.步骤一:获取芯片在运行调用函数时产生的调用栈数据。
69.其中,调用栈数据为芯片在运行各个调用函数时产生的各种线程数据,这些线程数据可以表征被调用函数的地址和各种运行参数,并且这些线程数据被寄存器所存储,以及该寄存器被服务器压入调用栈中进行堆栈。
70.步骤二:基于调用栈数据中的栈顶地址、栈底地址、针对当前调用函数的栈帧地址和应用程序地址,从调用栈数据中提取出针对当前调用函数的栈帧地址。
71.其中,服务器首先在调用栈数据中找到关于调用栈的栈顶地址、栈底地址;然后再根据栈顶地址和栈底地址,在调用栈数据中找到当前调用函数的在调用栈中的栈帧地址和应用程序地址;最后根据当前调用函数的在调用栈中的栈帧地址和应用程序地址,在当前调用函数的栈帧中找到当前调用函数的栈帧地址。
72.步骤s12:基于栈帧地址对源码文本进行文本检测,以在检测到栈帧地址存在于源码文本中的情况下,获取待识别指令。
73.在一实施例中,服务器在得到关于当前调用函数的源码文本和栈帧地址之后,服务器在源码文本中进行文本检测,以确定在源码文本中是否也记录有关于当前调用函数的栈帧地址。
74.其中,在服务器检测到栈帧地址存在于源码文本中的情况下,服务器从源码文本中获取待识别指令的地址,并根据待识别指令的地址获取待识别指令。其中,待识别指令为源码文本中相对于栈帧地址所在位置的前一访问地址对应的应用指令。
75.具体的,服务器在检测到栈帧地址存在于源码文本中的情况下,获取待识别指令,包括:首先,在源码文本中,将栈帧地址向前偏移一个地址长度得到待识别指令的地址。然后再基于待识别指令的地址,获取待识别指令。
76.在一实施例中,该预设指令为应用于32位相对函数(即bsr32函数)或者16位相对函数的跳转指令(即bsr16函数)。该预设指令为应用于32位绝对函数(即jsr32函数)或者16位绝对函数的跳转指令(即jsr16函数)。
77.在一实施例中,服务器在基于栈帧地址对源码文本进行文本检测之后,还包括:在未检测到栈帧地址存在于源码文本中的情况下,结束对当前调用函数执行的调用栈回溯过程,并对相对于当前调用函数的上一调用函数执行调用栈回溯。
78.具体地,若在源码文本中没有记录有关于当前调用函数的栈帧地址,则服务器结束对当前调用函数执行的调用栈回溯过程,并对相对于当前调用函数的上一调用函数重新开始执行调用栈回溯的步骤。
79.步骤s13:将待识别指令与预设指令进行比对,以在待识别指令与预设指令比对相同的情况下,确定栈帧地址为当前调用函数的函数返回地址,并对函数返回地址进行回溯。
80.其中,若待识别指令与预设指令比对相同,则说明源码数据中记录的相对于栈帧地址向前偏移一个地址长度的指令地址就是对应预设指令的地址,从而可以确定在调用栈中针对当前调用函数的栈帧地址对应所在代码段的上一条数据是跳转指令,进而确定该栈帧地址为当前调用函数的返回地址。
81.在一实施例中,服务器在将待识别指令与预设指令进行比对之后,还包括:在待识别指令与预设指令比对不相同的情况下,结束对当前调用函数执行的调用栈回溯过程,并对相对于当前调用函数的上一调用函数执行调用栈回溯。
82.其中,若待识别指令与预设指令比对不相同,则说明源码数据中记录的相对于栈帧地址向前偏移一个地址长度的指令地址不是对应预设指令的地址,从而可以确定在调用栈中针对当前调用函数的栈帧地址对应所在代码段的上一条数据不是跳转指令,进而确定该栈帧地址不是当前调用函数的返回地址。因此,服务器结束对当前调用函数执行的调用栈回溯过程,并对相对于当前调用函数的上一调用函数重新开始执行调用栈回溯的步骤。
83.以一具体实施例为例说明本技术中的调用栈回溯过程,包括如下步骤:
84.步骤1:在程序的运行出现系统异常或者断言异常时,获取运行程序所对应的线程栈的栈顶(stack_top)地址和栈底(stack_top)地址,以及获取线程栈中对应当前调用函数的栈帧地址(sp)和程序地址(pc);获取运行当前调用函数所对应的代码段(text)的开始地址和结束地址。
85.步骤2:基于代码段(text)的开始地址和结束地址,确定代码段(text);以及,基于栈顶(stack_top)地址、栈底(stack_top)地址、栈帧地址(sp)和程序地址(pc),确定待识别地址。
86.其中,待识别地址为待识别是否为当前调用函数的返回地址。
87.其中,当前调用函数的返回地址是一个整数值。
88.步骤3:确定待识别地址是否也记录在代码段(text)中。
89.步骤4.1:如果待识别地址没有记录代码段(text)中,则确定待识别地址不为待识别是否为当前调用函数的返回地址,结束对当前调用函数执行的调用栈回溯过程,并返回步骤1执行对上一调用函数的调用栈回溯过程。
90.步骤4.2如果待识别地址被记录代码段(text)中,则在代码段(text)中,识别位于待识别地址的上一条指令(pre_ins)是否为跳转指令。
91.其中,跳转指令是一个32位或者16位的整数,包含了指令常量和指令参数。
92.其中,跳转指令为bsr32、bsr16、jsr32、jsr16中的任意一种。
93.其中,识别指令(pre_ins)是否为跳转指令的过程包括步骤:
94.①
、在代码段(text)中,将待识别地址向前偏移一个地址长度得到指令(pre_ins)的地址。
95.②
、基于指令(pre_ins)的地址,获取到指令(pre_ins)。
96.其中,指令(pre_ins)是一个32位的整数,包含了指令常量和指令参数。
97.③
、基于预设的判断条件,将指令(pre_ins)分别与bsr32、bsr16、jsr32、jsr16进行比对,以确定指令(pre_ins)是否为合法的跳转指令。
98.步骤5.1:如果待识别地址的上一条数据不是跳转指令(即指令(pre_ins)不是合法的跳转指令),则确定待识别地址不为当前调用函数的返回地址,结束对当前调用函数执
行的调用栈回溯过程,并返回步骤1执行对上一调用函数的调用栈回溯过程。
99.步骤5.2:如果待识别地址的上一条数据是跳转指令(即指令(pre_ins)是合法的跳转指令),则确定待识别地址为当前调用函数的返回地址,提取并保存当前调用函数的返回地址,并返回步骤1执行对上一调用函数的调用栈回溯过程,直到返回到栈底后停止,或者count等于栈回溯的最大层数(trance_level)时停止回溯。
100.上述的基于c-sky架构芯片的异常调用栈回溯的过程中,服务器首先在芯片运行的过程中出现异常的情况下,获取芯片在运行当前调用函数时产生的源码文本和栈帧地址;芯片为基于c-sky架构开发的嵌入式芯片,栈帧地址为所述芯片应用的调用栈中针对所述当前调用函数的栈帧的访问地址;基于栈帧地址对所述源码文本进行文本检测,以在检测到栈帧地址存在于源码文本中的情况下,获取待识别指令;所述待识别指令为所述源码文本中相对于所述栈帧地址所在位置的前一访问地址对应的应用指令;将待识别指令与预设指令进行比对,以在所述待识别指令与预设指令比对相同的情况下,确定栈帧地址为所述当前调用函数的函数返回地址,并对所述函数返回地址进行回溯。这样,在一方面,利用芯片在运行当前调用函数时产生的源码文本和栈帧地址,来获取相对于栈帧地址所在位置的前一访问地址的待识别指令,并在待识别指令与预设指令比对相同的情况下确定栈帧地址为当前调用函数的函数返回地址,从而优化了函数返回地址实部的流程,降低了人力和物力的消化;在另一方面,在检测到栈帧地址存在于源码文本中的情况下,根据待识别指令与预设指令之间的比对情况,对函数返回地址进行回溯,能够有效避免将函数的访问地址误判为源码文本中的其他地址的情况,进而提升调用栈回溯的准确性,从而便于后续对程序故障的诊断和解决。
101.在一示例性实施例中,参阅图4,图4为本技术中确定函数返回地址一实施例的流程示意图。在步骤s13中,服务器将所述待识别指令与预设指令进行比对,以在所述待识别指令与预设指令比对相同的情况下,确定所述栈帧地址为所述当前调用函数的函数返回地址的过程,可以通过以下方式实现:
102.步骤s131,对待识别指令的第一掩码和跳转指令的第二掩码进行与运算,以剔除待识别指令中的变量数据和跳转指令中的变量数据,得到待识别指令中的常量数据和跳转指令中的常量数据。
103.其中,跳转指令为32位相对函数跳转指令(即bsr32函数)或者16位相对函数跳转指令(即bsr16函数)。
104.步骤s132,在比对待识别指令中的常量数据和跳转指令中的常量数据相同的情况下,将第一掩码的逆反值和第二指令的逆反值进行与运算,得到运算数值。
105.其中,如果比对待识别指令中的常量数据和跳转指令中的常量数据相同,则说明待识别指令即为跳转指令;如果比对待识别指令中的常量数据和跳转指令中的常量数据不相同,则说明待识别指令不为跳转指令。
106.步骤s133,在运算数值非零的情况下,确定栈帧地址为当前调用函数的函数返回地址。
107.其中,如果该运算数值非零,则说明该待识别指令即为合法的跳转指令;如果该运算数值为零,则说明待识别指令为不合法的跳转指令。
108.在另一示例性实施例中,服务器将所述待识别指令与预设指令进行比对,以在所
述待识别指令与预设指令比对相同的情况下,确定所述栈帧地址为所述当前调用函数的函数返回地址的过程,也可以通过以下方式实现:
109.步骤一:对待识别指令的掩码和跳转指令的掩码进行与运算,以剔除待识别指令中的变量数据和跳转指令中的变量数据,得到待识别指令中的常量数据和跳转指令中的常量数据。
110.其中,跳转指令为32位绝对函数跳转指令(即jsr32函数)或者16位绝对函数跳转指令(即jsr16函数)。
111.步骤二:在比对待识别指令中的常量数据和跳转指令中的常量数据相同的情况下,确定栈帧地址为当前调用函数的函数返回地址。
112.其中,如果比对待识别指令中的常量数据和跳转指令中的常量数据相同,则说明待识别指令即为合法的跳转指令;如果比对待识别指令中的常量数据和跳转指令中的常量数据不相同,则说明待识别指令不为跳转指令或者不为合法的跳转指令。
113.这样,在一方面,利用芯片在运行当前调用函数时产生的源码文本和栈帧地址,来获取相对于栈帧地址所在位置的前一访问地址的待识别指令,并在待识别指令与预设指令比对相同的情况下确定栈帧地址为当前调用函数的函数返回地址,从而优化了函数返回地址实部的流程,降低了人力和物力的消化;在另一方面,在检测到栈帧地址存在于源码文本中的情况下,根据待识别指令与预设指令之间的比对情况,对函数返回地址进行回溯,能够有效避免将函数的访问地址误判为源码文本中的其他地址的情况,进而提升调用栈回溯的准确性,从而便于后续对程序故障的诊断和解决。
114.应该理解的是,虽然图2-图4的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,图2-图4中的至少一部分步骤可以包括多个步骤或者多个阶段,这些步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤中的步骤或者阶段的至少一部分轮流或者交替地执行。
115.可以理解的是,本说明书中上述方法的各个实施例之间相同/相似的部分可互相参见,每个实施例重点说明的是与其他实施例的不同之处,相关之处参见其他方法实施例的说明即可。
116.图5是本技术实施例提供的一种基于c-sky架构芯片的异常调用栈回溯装置框图。参照图5,该基于c-sky架构芯片的异常调用栈回溯装置30包括:数据获取单元31、指令获取单元32、地址回溯单元33。
117.其中,数据获取单元31,被配置为执行在芯片运行的过程中出现异常的情况下,获取所述芯片在运行当前调用函数时产生的源码文本和栈帧地址;所述芯片为基于c-sky架构开发的嵌入式芯片,所述栈帧地址为所述芯片应用的调用栈中针对所述当前调用函数的栈帧的访问地址;
118.其中,指令获取单元32,被配置为执行基于所述栈帧地址对所述源码文本进行文本检测,以在检测到所述栈帧地址存在于所述源码文本中的情况下,获取待识别指令;所述待识别指令为所述源码文本中相对于所述栈帧地址所在位置的前一访问地址对应的应用
指令;
119.其中,地址回溯单元33,被配置为执行将所述待识别指令与预设指令进行比对,以在所述待识别指令与预设指令比对相同的情况下,确定所述栈帧地址为所述当前调用函数的函数返回地址,并对所述函数返回地址进行回溯。
120.在一示例性实施例中,所述预设指令为应用于32位相对函数或者16位相对函数的跳转指令;所述将所述待识别指令与预设指令进行比对,以在所述待识别指令与预设指令比对相同的情况下,确定所述栈帧地址为所述当前调用函数的函数返回地址,包括:
121.对所述待识别指令的第一掩码和所述跳转指令的第二掩码进行与运算,以剔除所述待识别指令中的变量数据和所述跳转指令中的变量数据,得到所述待识别指令中的常量数据和所述跳转指令中的常量数据;
122.在比对所述待识别指令中的常量数据和所述跳转指令中的常量数据相同的情况下,将所述第一掩码的逆反值和所述第二指令的逆反值进行与运算,得到运算数值;
123.在所述运算数值非零的情况下,确定所述栈帧地址为所述当前调用函数的函数返回地址。
124.在一示例性实施例中,所述预设指令为应用于32位绝对函数或者16位绝对函数的跳转指令;所述将所述待识别指令与预设指令进行比对,以在所述待识别指令与预设指令比对相同的情况下,确定所述栈帧地址为所述当前调用函数的函数返回地址,包括:
125.对所述待识别指令的掩码和所述跳转指令的掩码进行与运算,以剔除所述待识别指令中的变量数据和所述跳转指令中的变量数据,得到所述待识别指令中的常量数据和所述跳转指令中的常量数据;
126.在比对所述待识别指令中的常量数据和所述跳转指令中的常量数据相同的情况下,确定所述栈帧地址为所述当前调用函数的函数返回地址。
127.在一示例性实施例中,所述在检测到所述栈帧地址存在于所述源码文本中的情况下,获取待识别指令,包括:
128.在所述源码文本中,将所述栈帧地址向前偏移一个地址长度得到所述待识别指令的地址;
129.基于所述待识别指令的地址,获取待识别指令。
130.在一示例性实施例中,在所述调用栈中存储有多个调用函数对应的栈帧,且每个栈帧内存储有对应调用函数的调用栈数据;所述获取所述芯片在运行当前调用函数时产生的源码文本和栈帧地址,包括:
131.获取所述芯片在运行调用函数时产生的源码数据和调用栈数据;
132.基于所述源码数据中针对所述当前调用函数的数据开始地址和数据结束地址,从所述源码数据中提取出针对所述当前调用函数的源码文本;以及
133.基于所述调用栈数据中的栈顶地址、栈底地址、针对所述当前调用函数的栈帧地址和应用程序地址,从所述调用栈数据中提取出针对所述当前调用函数的栈帧地址。
134.在一示例性实施例中,在所述基于所述栈帧地址对所述源码文本进行文本检测之后,还包括:
135.在未检测到所述栈帧地址存在于所述源码文本中的情况下,结束对所述当前调用函数执行的调用栈回溯过程,并对相对于所述当前调用函数的上一调用函数执行所述调用
栈回溯。
136.在一示例性实施例中,在所述将所述待识别指令与预设指令进行比对之后,还包括:
137.在所述待识别指令与预设指令比对不相同的情况下,结束对所述当前调用函数执行的调用栈回溯过程,并对相对于所述当前调用函数的上一调用函数执行所述调用栈回溯。
138.图6是本技术实施例提供的一种服务器40的框图。例如,服务器40可以为一种电子设备、电子组件或者服务器阵列等等。参照图6,服务器40包括处理器41,其进一步处理器41可以为处理器集合,其可以包括一个或多个处理器,以及服务器40包括由存储器42所代表的存储器资源,其中,存储器42上存储有计算机程序,例如应用程序。在存储器42中存储的计算机程序可以包括一个或一个以上的每一个对应于一组可执行指令的模块。此外,处理器41被配置为执行可执行指令时实现如上述的基于c-sky架构芯片的异常调用栈回溯方法。
139.在一些实施例中,服务器40为电子设备,该电子设备中的计算系统可以运行一个或多个操作系统,包括以上讨论的任何操作系统以及任何商用的服务器操作系统。该服务器40还可以运行各种附加服务器应用和/或中间层应用中的任何一种,包括http(超文本传输协议)服务器、ftp(文件传输协议)服务器、cgi(通用网关界面)服务器、超级服务器、数据库服务器等。示例性数据库服务器包括但不限于可从(国际商业机器)等商购获得的数据库服务器。
140.在一些实施例中,处理器41通常控制服务器40的整体操作,诸如与显示、数据处理、数据通信和记录操作相关联的操作。处理器41可以包括一个或多个处理器组件来执行计算机程序,以完成上述的方法的全部或部分步骤。此外,处理器组件可以包括一个或多个模块,便于处理器组件和其他组件之间的交互。例如,处理器组件可以包括多媒体模块,以方便利用多媒体组件控制用户服务器40和处理器41之间的交互。
141.在一些实施例中,处理器41中的处理器组件还可以称为cpu(central processing unit,中央处理单元)。处理器组件可能是一种电子芯片,具有信号的处理能力。处理器还可以是通用处理器、数字信号处理器(digital signal processor,dsp)、专用集成电路(application specific integrated circuit,asic)、专用集成电路(application specific integrated circuit,asic)、现场可编程门阵列(field-programmable gate array,fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器组件等。另外,处理器组件可以由集成电路芯片共同实现。
142.在一些实施例中,存储器42被配置为存储各种类型的数据以支持在服务器40的操作。这些数据的示例包括用于在服务器40上操作的任何应用程序或方法的指令、采集数据、消息、图片、视频等。存储器42可以由任何类型的易失性或非易失性存储设备或者它们的组合实现,如静态随机存取存储器(sram)、电可擦除可编程只读存储器(eeprom)、可擦除可编程只读存储器(eprom)、可编程只读存储器(prom)、只读存储器(rom)、磁存储器、快闪存储器、磁盘、光盘或石墨烯存储器。
143.在一些实施例中,存储器42可以为内存条、tf卡等,可以存储服务器40中的全部信
息,包括输入的原始数据、计算机程序、中间运行结果和最终运行结果都保存在存储器42中。在一些实施例中,它根据处理器指定的位置存入和取出信息。在一些实施例中,有了存储器42,服务器40才有记忆功能,才能保证正常工作。在一些实施例中,服务器40的存储器42按用途可分为主存储器(内存)和辅助存储器(外存),也有分为外部存储器和内部存储器的分类方法。外存通常是磁性介质或光盘等,能长期保存信息。内存指主板上的存储部件,用来存放当前正在执行的数据和程序,但仅用于暂时存放程序和数据,关闭电源或断电,数据会丢失。
144.在一些实施例中,服务器40还可以包括:电源组件43被配置为执行服务器40的电源管理,有线或无线网络接口44被配置为将服务器40连接到网络,和输入输出(i/o)接口45。服务器40可以操作基于存储在存储器42的操作系统,例如windows server,mac os x,unix,linux,freebsd或类似。
145.在一些实施例中,电源组件43为服务器40的各种组件提供电力。电源组件43可以包括电源管理系统,一个或多个电源,及其他与为服务器40生成、管理和分配电力相关联的组件。
146.在一些实施例中,有线或无线网络接口44被配置为便于服务器40和其他设备之间有线或无线方式的通信。服务器40可以接入基于通信标准的无线网络,如wifi,运营商网络(如2g、3g、4g或5g),或它们的组合。
147.在一些实施例中,有线或无线网络接口44经由广播信道接收来自外部广播管理系统的广播信号或广播相关信息。在一个示例性实施例中,有线或无线网络接口44还包括近场通信(nfc)模块,以促进短程通信。例如,在nfc模块可基于射频识别(rfid)技术,红外数据协会(irda)技术,超宽带(uwb)技术,蓝牙(bt)技术和其他技术来实现。
148.在一些实施例中,输入输出(i/o)接口45为处理器41和外围接口模块之间提供接口,上述外围接口模块可以是键盘,点击轮,按钮等。这些按钮可包括但不限于:主页按钮、音量按钮、启动按钮和锁定按钮。
149.本技术实施例提供的一种计算机可读存储介质的框图。该计算机可读存储介质上存储有计算机程序,其中,计算机程序被处理器执行时实现如上述的基于c-sky架构芯片的异常调用栈回溯方法。
150.在本技术各个实施例中的各功能单元集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在计算机可读存储介质中。基于这样的理解,本技术的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机可读存储介质在一个计算机程序中,包括若干指令用以使得一台服务器(可以是个人计算机,系统服务器,或者网络设备等)、电子设备(例如mp3、mp4等,也可以是手机、平板电脑、可穿戴设备等智能终端,也可以是台式电脑等)或者处理器(processor)以执行本技术各个实施方式方法的全部或部分步骤。
151.本技术实施例提供的一种计算机程序产品的框图。该计算机程序产品中包括程序指令,该程序指令可由服务器的处理器执行以实现如上述的基于c-sky架构芯片的异常调用栈回溯方法。
152.本领域内的技术人员应明白,本技术的实施例可提供有基于c-sky架构芯片的异常调用栈回溯方法、基于c-sky架构芯片的异常调用栈回溯装置30、服务器40、计算机可读
存储介质或计算机程序产品。因此,本技术可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本技术可采用在一个或多个其中包含有计算机可用程序代码的计算机程序指令(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。
153.本技术是参照根据本技术实施例中基于c-sky架构芯片的异常调用栈回溯方法、基于c-sky架构芯片的异常调用栈回溯装置30、服务器40、计算机可读存储介质或计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序产品实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序产品到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的程序指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
154.这些计算机程序产品也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机程序产品中的程序指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
155.这些程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的程序指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
156.需要说明的,上述的各种方法、装置、电子设备、计算机可读存储介质、计算机程序产品等根据方法实施例的描述还可以包括其他的实施方式,具体的实现方式可以参照相关方法实施例的描述,在此不作一一赘述。
157.本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本公开的其它实施方案。本公开旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由权利要求指出。
158.应当理解的是,本公开并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本公开的范围仅由所附的权利要求来限制。

技术特征:
1.一种基于c-sky架构芯片的异常调用栈回溯方法,其特征在于,所述方法包括:在芯片运行的过程中出现异常的情况下,获取所述芯片在运行当前调用函数时产生的源码文本和栈帧地址;所述芯片为基于c-sky架构开发的嵌入式芯片,所述栈帧地址为所述芯片应用的调用栈中针对所述当前调用函数的栈帧的访问地址;基于所述栈帧地址对所述源码文本进行文本检测,以在检测到所述栈帧地址存在于所述源码文本中的情况下,获取待识别指令;所述待识别指令为所述源码文本中相对于所述栈帧地址所在位置的前一访问地址对应的应用指令;将所述待识别指令与预设指令进行比对,以在所述待识别指令与预设指令比对相同的情况下,确定所述栈帧地址为所述当前调用函数的函数返回地址,并对所述函数返回地址进行回溯。2.根据权利要求1所述的方法,其特征在于,所述预设指令为应用于32位相对函数或者16位相对函数的跳转指令;所述将所述待识别指令与预设指令进行比对,以在所述待识别指令与预设指令比对相同的情况下,确定所述栈帧地址为所述当前调用函数的函数返回地址,包括:对所述待识别指令的第一掩码和所述跳转指令的第二掩码进行与运算,以剔除所述待识别指令中的变量数据和所述跳转指令中的变量数据,得到所述待识别指令中的常量数据和所述跳转指令中的常量数据;在比对所述待识别指令中的常量数据和所述跳转指令中的常量数据相同的情况下,将所述第一掩码的逆反值和所述第二指令的逆反值进行与运算,得到运算数值;在所述运算数值非零的情况下,确定所述栈帧地址为所述当前调用函数的函数返回地址。3.根据权利要求1所述的方法,其特征在于,所述预设指令为应用于32位绝对函数或者16位绝对函数的跳转指令;所述将所述待识别指令与预设指令进行比对,以在所述待识别指令与预设指令比对相同的情况下,确定所述栈帧地址为所述当前调用函数的函数返回地址,包括:对所述待识别指令的掩码和所述跳转指令的掩码进行与运算,以剔除所述待识别指令中的变量数据和所述跳转指令中的变量数据,得到所述待识别指令中的常量数据和所述跳转指令中的常量数据;在比对所述待识别指令中的常量数据和所述跳转指令中的常量数据相同的情况下,确定所述栈帧地址为所述当前调用函数的函数返回地址。4.根据权利要求1所述的方法,其特征在于,所述在检测到所述栈帧地址存在于所述源码文本中的情况下,获取待识别指令,包括:在所述源码文本中,将所述栈帧地址向前偏移一个地址长度得到所述待识别指令的地址;基于所述待识别指令的地址,获取待识别指令。5.根据权利要求1所述的方法,其特征在于,在所述调用栈中存储有多个调用函数对应的栈帧,且每个栈帧内存储有对应调用函数的调用栈数据;所述获取所述芯片在运行当前调用函数时产生的源码文本和栈帧地址,包括:获取所述芯片在运行调用函数时产生的源码数据和调用栈数据;
基于所述源码数据中针对所述当前调用函数的数据开始地址和数据结束地址,从所述源码数据中提取出针对所述当前调用函数的源码文本;以及基于所述调用栈数据中的栈顶地址、栈底地址、针对所述当前调用函数的栈帧地址和应用程序地址,从所述调用栈数据中提取出针对所述当前调用函数的栈帧地址。6.根据权利要求5所述的方法,其特征在于,在所述基于所述栈帧地址对所述源码文本进行文本检测之后,还包括:在未检测到所述栈帧地址存在于所述源码文本中的情况下,结束对所述当前调用函数执行的调用栈回溯过程,并对相对于所述当前调用函数的上一调用函数执行所述调用栈回溯。7.根据权利要求1所述的方法,其特征在于,在所述将所述待识别指令与预设指令进行比对之后,还包括:在所述待识别指令与预设指令比对不相同的情况下,结束对所述当前调用函数执行的调用栈回溯过程,并对相对于所述当前调用函数的上一调用函数执行所述调用栈回溯。8.一种基于c-sky架构芯片的异常调用栈回溯装置,其特征在于,所述装置包括:数据获取单元,被配置为执行在芯片运行的过程中出现异常的情况下,获取所述芯片在运行当前调用函数时产生的源码文本和栈帧地址;所述芯片为基于c-sky架构开发的嵌入式芯片,所述栈帧地址为所述芯片应用的调用栈中针对所述当前调用函数的栈帧的访问地址;指令获取单元,被配置为执行基于所述栈帧地址对所述源码文本进行文本检测,以在检测到所述栈帧地址存在于所述源码文本中的情况下,获取待识别指令;所述待识别指令为所述源码文本中相对于所述栈帧地址所在位置的前一访问地址对应的应用指令;地址回溯单元,被配置为执行将所述待识别指令与预设指令进行比对,以在所述待识别指令与预设指令比对相同的情况下,确定所述栈帧地址为所述当前调用函数的函数返回地址,并对所述函数返回地址进行回溯。9.一种服务器,其特征在于,包括:处理器;用于存储所述处理器的可执行指令的存储器;其中,所述处理器被配置为执行所述可执行指令,以实现如权利要求1至7中任一项所述的基于c-sky架构芯片的异常调用栈回溯方法。10.一种计算机可读存储介质,所述计算机可读存储介质中包括程序数据,其特征在于,当所述程序数据由服务器的处理器执行时,使得所述服务器能够执行如权利要求1至7中任一项所述的基于c-sky架构芯片的异常调用栈回溯方法。

技术总结
本申请涉及一种基于C-SKY架构芯片的异常调用栈回溯方法、装置、服务器、存储介质和计算机程序产品。所述方法包括:在芯片运行的过程中出现异常的情况下,获取芯片在运行当前调用函数时产生的源码文本和栈帧地址;基于栈帧地址对源码文本进行文本检测,以在检测到栈帧地址存在于源码文本中的情况下,获取待识别指令;其中,待识别指令为源码文本中相对于栈帧地址所在位置的前一访问地址对应的应用指令;将待识别指令与预设指令进行比对,以在待识别指令与预设指令比对相同的情况下,确定栈帧地址为当前调用函数的函数返回地址,并对函数返回地址进行回溯。采用本方法能够避免将函数的访问地址误判为其他地址,提升调用栈回溯的准确性。确性。确性。


技术研发人员:陶伟 董飞龙 姚浩 陈军健 蔡田田 关志华 邓清唐 邝野
受保护的技术使用者:南方电网数字电网研究院有限公司
技术研发日:2023.06.25
技术公布日:2023/10/11
版权声明

本文仅代表作者观点,不代表航空之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

飞行汽车 https://www.autovtol.com/

分享:

扫一扫在手机阅读、分享本文

相关推荐