一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

嵌入式系统的调用栈回溯方法、装置和计算机设备与流程

2021-12-03 23:15:00 来源:中国专利 TAG:
1.本技术涉及计算机
技术领域
:,特别是涉及一种嵌入式系统的调用栈回溯方法、装置和计算机设备。
背景技术
::2.在嵌入式mcu(microcontrollerunit,微控制单元)软件开发、调试及测试过程中,经常会遇到因软件的设计缺陷而出现的各种宕机现象。对于嵌入式mcu软件系统的宕机问题,目前主要是根据cpu(centralprocessingunit,中央处理器)核心寄存器的内容,再结合反汇编代码,来排查和修复代码的设计缺陷。但是,该方式对开发人员有较高要求,需要开发人员对cpu架构、寄存器、运行及异常机制以及程式的编译原理等有较为深入的认知和理解;更重要的是,该方式无法从出现宕机的函数位置处向上回溯和推导出完整的执行调用关系,这样就不能有效和及时地对系统进行问题排查和恢复,对软件开发及测试效率造成了比较大的影响。3.因此,如何快速地回溯函数的调用关系,已经成为亟待解决的问题。技术实现要素:4.基于此,有必要针对上述技术问题,提供一种能够高效、准确地回溯完整的调用关系的嵌入式系统的调用栈回溯方法、装置和计算机设备。5.本技术实施例提供了一种嵌入式系统的调用栈回溯方法,所述方法包括:6.获取程序源代码文件、指定编译命令和宕机异常处理程序;其中,所述指定编译命令用于记录函数栈帧的起始地址;7.基于所述指定编译命令和所述宕机异常处理程序对所述程序源代码文件进行编译链接,生成elf格式的目标文件;8.当系统发生异常时,保存寄存器信息和所述目标文件对应的函数栈帧,并执行所述宕机异常处理程序;其中,所述寄存器信息包括:用于记录当前函数的栈帧的起始地址的fp寄存器,和用于记录调用所述当前函数的上级函数的返回地址的lr寄存器;9.通过所述宕机异常处理程序基于所述fp寄存器和所述lr寄存器对所述函数栈帧进行分析,得到发生异常的目标函数的调用地址表;10.采用预设的地址解析工具,解析出所述调用地址表中的地址在所述目标文件中的调用栈回溯信息。11.在一个实施例中,所述基于所述指定编译命令和所述宕机异常处理程序对所述程序源代码文件进行编译链接,生成elf格式的目标文件,包括:12.采用所述指定编译命令对所述程序源代码文件进行编译,得到编译结果文件;将所述宕机异常处理程序注入所述编译结果文件中,生成elf格式的目标文件。13.在一个实施例中,所述通过所述宕机异常处理程序基于所述fp寄存器和所述lr寄存器对所述函数栈帧进行分析,得到发生异常的目标函数的调用地址表,包括:14.通过所述宕机异常处理程序从所述函数栈帧对应的cpu寄存器中获取所述fp寄存器和所述lr寄存器;根据所述lr寄存器和所述fp寄存器回溯得到发生异常的目标函数的调用地址表。15.在一个实施例中,所述根据所述lr寄存器和所述fp寄存器回溯得到发生异常的目标函数的调用地址表,包括:16.将发生异常的目标函数作为当前函数,重复执行如下回溯推导算法,直至回溯得到所述目标函数的调用地址表:从所述当前函数的栈帧对应的fp寄存器中获取所述当前函数的起始地址;从所述当前函数的栈帧对应的lr寄存器中获取返回地址;根据所述起始地址得到调用所述当前函数的上一级函数,并将所述上一级函数作为新的当前函数;17.当所述新的当前函数的栈帧对应的lr寄存器为空值时,停止所述回溯推导算法,并基于停止所述回溯推导算法时得到的所有的起始地址和返回地址生成调用地址表。18.在一个实施例中,所述寄存器信息还包括:用于记录发生异常处的指令地址的pc寄存器,所述方法还包括:根据所述pc寄存器确定发生异常的目标函数的地址。19.在一个实施例中,所述执行所述宕机异常处理程序,包括:中央处理器cpu通过预设的异常向量函数表进入并执行所述宕机异常处理程序。20.在一个实施例中,所述调用栈回溯信息包括:所述目标函数的函数名、所述目标函数的地址、各级调用者函数的地址、所述目标函数和所述调用者函数各自所属的文件、所述目标函数和所述调用者函数在各自所属文件中的行号;其中,所述调用者函数是与所述目标函数具有调用栈关系的函数。21.本技术实施例提供了一种嵌入式系统的调用栈回溯装置,所述装置包括:22.获取模块,用于获取程序源代码文件、指定编译命令和宕机异常处理程序;其中,所述指定编译命令用于记录函数栈帧的起始地址;23.文件生成模块,用于基于所述指定编译命令和所述宕机异常处理程序对所述程序源代码文件进行编译链接,生成可执行可链接elf格式的目标文件;24.程序执行模块,用于当系统发生异常时,保存寄存器信息和所述目标文件对应的函数栈帧,并执行所述宕机异常处理程序;其中,所述寄存器信息包括:用于记录当前函数的栈帧的起始地址的fp寄存器,和用于记录调用所述当前函数的上级函数的返回地址的lr寄存器;25.异常分析模块,用于通过所述宕机异常处理程序基于所述fp寄存器和所述lr寄存器对所述函数栈帧进行分析,得到发生异常的目标函数的调用地址表;26.解析模块,用于采用预设的地址解析工具,解析出所述调用地址表中的地址在所述目标文件中的调用栈回溯信息。27.本技术实施例提供了一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现本技术任意实施例所提供的嵌入式系统的调用栈回溯方法的步骤。28.本技术实施例提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现本技术任意实施例所提供的嵌入式系统的调用栈回溯方法的步骤。29.本技术实施例所提供的嵌入式系统的调用栈回溯方法、装置和计算机设备,30.首先基于获取的指定编译命令和宕机异常处理程序对程序源代码文件进行编译链接,其中,指定编译命令使生成的目标文件在运行时,能够记录函数栈帧的起始地址,宕机异常处理程序能够在发生系统异常时快速进入调用栈回溯流程,也即:基于fp寄存器和lr寄存器对函数栈帧进行分析,得到发生异常的目标函数的调用地址表;该技术方案利用cpu的fp寄存器和lr寄存器,从函数栈帧中分析得到调用地址表,能够更加高效、准确地回溯调用地址;进一步的,采用预设的地址解析工具,解析出调用地址表中的地址在目标文件中完整的调用栈回溯信息,为mcu软件开发人员提供了问题分析和查找的现场信息,有利于帮助开发者尽快找到并解决问题,提升软件开发及测试效率。附图说明31.图1为一个实施例中嵌入式系统的调用栈回溯方法的流程示意图;32.图2为一个实施例中调用栈回溯方法的应用场景图;33.图3为一个实施例中展示的调用栈回溯信息的示意图;34.图4为一个实施例中嵌入式系统的调用栈回溯装置的结构框图;35.图5为一个实施例中计算机设备的内部结构图。具体实施方式36.为了使本技术的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本技术进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本技术,并不用于限定本技术。37.对于嵌入式mcu软件系统的宕机问题,考虑到目前的异常处理方式无法定位cpu发生宕机的位置,无法准确地回溯出完整的执行调用关系。基于此,本实施例提供一种嵌入式系统的调用栈回溯方法、装置和计算机设备,能够高效、准确地回溯完整的调用关系。为便于理解,以下对本技术实施例进行详细介绍。38.在一个实施例中,如图1所示,提供了一种嵌入式系统的调用栈回溯方法,该方法可应用于系统发生异常宕机时的调用栈回溯的场景,该方法可以由嵌入式系统的调用栈回溯装置来执行,该装置可以采用软件和/或硬件实现,一般可集成在电子设备中。示例性地,用于实现根据本技术实施例的嵌入式系统的调用栈回溯方法,的示例电子设备可以被实现为诸如平板电脑、计算机等智能终端上。如图1所示,本实施例中的方法包括以下步骤:39.步骤s102,获取程序源代码文件、指定编译命令和宕机异常处理程序。其中,指定编译命令可以使用cpu寄存器r11作为帧指针,用于记录函数栈帧的起始地址。40.步骤s104,基于指定编译命令和宕机异常处理程序对程序源代码文件进行编译链接,生成elf(executableandlinkableformat,可执行可链接)格式的目标文件。41.在本实施例中,首先采用指定编译命令对程序源代码文件进行编译,得到编译结果文件。在加入指定编译命令,也即启用fp寄存器记录当前的函数栈帧的起始地址的情况下,程序源代码文件在程序执行过程中,能够通过fp寄存器所限定的栈帧,就可以得到当前函数的栈帧指针,从而得到当前函数的栈帧。上述指定编译命令在实际应用中诸如可以为:armcc编译命令‑‑use_frame_pointer,gcc编译命令‑fno‑omit‑frame‑pointer。42.接下来将宕机异常处理程序注入编译结果文件中,生成elf格式的目标文件。具体可以通过链接库在编译结果文件中链接宕机异常处理程序后输出目标文件。该宕机异常处理程序能够执行栈回溯推导算法,以确定发生异常的目标函数的调用关系。43.步骤s106,当系统发生异常时,保存寄存器信息和目标文件对应的函数栈帧,并执行宕机异常处理程序;其中,寄存器信息包括:用于记录当前函数的栈帧的起始地址的fp寄存器(也即寄存器r11),和用于记录调用当前函数的上级函数的返回地址的lr寄存器(也即寄存器r14)。44.在本实施例中,系统一般是指嵌入式软件系统。在系统的实际运行过程中,当由于软件逻辑的设计缺陷而出现异常宕机时,能够保存寄存器信息和目标文件对应的函数栈帧。其中,函数栈帧用于保存函数调用过程中的各种信息,比如函数的参数、返回地址等;寄存器信息还可以包括:用于记录发生异常处的指令地址的pc寄存器(也即寄存器r15)、用于记录当前函数的栈帧底地址的sp寄存器(也即寄存器r13)等,在此不再一一列举。45.当系统发送异常时,还包括cpu通过预设的异常向量函数表进入并执行宕机异常处理程序,而后执行如下步骤s108。46.步骤s108,通过宕机异常处理程序基于fp寄存器和lr寄存器对函数栈帧进行分析,得到发生异常的目标函数的调用地址表。47.在本实施例中,通过fp寄存器可以找到存储在目标函数栈帧中的lr寄存器的数值(简称lr值),lr值表示目标函数的返回地址;同时也可以找到保存在目标函数栈帧中的上一级函数的fp寄存器的数值(简称fp值),该fp值指向了上一级函数的栈底,如此可以按照同样的方法找出上一级函数栈帧中存储的lr寄存器和lr寄存器各自的数值。基于此,本实施例以fp寄存器为核心,依次确定每个函数栈帧中存储的lr值和lr值,计算出目标函数的返回地址和上一级函数的栈底地址,从而找出每一级函数的调用地址表,由此构成一个完整的调用栈回溯过程。48.步骤s110,采用预设的地址解析工具,解析出调用地址表中的地址在目标文件中的调用栈回溯信息。49.其中,地址解析工具比如可以采用addr2line.exe,利用该地址解析工具addr2line.exe,解析调用地址表中的地址与目标文件的对应关系,得到完整的、准确的调用栈回溯信息,调用栈回溯信息可以包括但不限于:目标函数的函数名、目标函数的地址、各级调用者函数的地址、目标函数和调用者函数各自所属的文件、目标函数和调用者函数在各自所属文件中的行号;其中,调用者函数是与目标函数具有调用栈关系的函数。50.本技术实施例提供的嵌入式系统的调用栈回溯方法,首先基于获取的指定编译命令和宕机异常处理程序对程序源代码文件进行编译链接,其中,指定编译命令使生成的目标文件在运行时,能够记录函数栈帧的起始地址,宕机异常处理程序能够在发生系统异常时快速进入调用栈回溯流程,也即:基于fp寄存器和lr寄存器对函数栈帧进行分析,得到发生异常的目标函数的调用地址表;该技术方案利用cpu的fp寄存器和lr寄存器,从函数栈帧中分析得到调用地址表,能够更加高效、准确且完整地回溯调用地址;进一步的,采用预设的地址解析工具,解析出调用地址表中的地址在目标文件中的调用栈回溯信息,为mcu软件开发人员提供了问题分析和查找的现场信息,有利于帮助开发者尽快找到并解决问题,提升软件开发及测试效率。51.本技术实施例提供另一种嵌入式系统的调用栈回溯方法,该方法包括:52.步骤一,基于预先获取的指定编译命令和宕机异常处理程序对程序源代码文件进行编译链接,生成elf格式的目标文件。53.步骤二,当系统发生异常时,保存寄存器信息和目标文件对应的函数栈帧,并执行宕机异常处理程序;该寄存器信息至少包括:pc寄存器、fp寄存器和lr寄存器。54.步骤三,通过宕机异常处理程序从函数栈帧对应的cpu寄存器中获取上述pc寄存器、fp寄存器和lr寄存器。55.步骤四,根据pc寄存器确定发生异常的目标函数的地址。56.步骤五,根据lr寄存器和fp寄存器回溯得到发生异常的目标函数的调用地址表。本实施例的具体实现方式可参照如下所示。57.将发生异常的目标函数作为当前函数,重复执行如下(1)‑(3)所示的回溯推导算法,直至回溯得到目标函数的调用地址表:58.(1)从当前函数的栈帧对应的fp寄存器中获取当前函数的起始地址。可以理解,当首次执行回溯推导算法时,当前函数为发生异常的目标函数。59.(2)从当前函数的栈帧对应的lr寄存器中获取返回地址。60.(3)根据起始地址得到调用当前函数的上一级函数,并将上一级函数作为新的当前函数。61.重复执行上述步骤(1)‑(3),直至当新的当前函数的栈帧对应的lr寄存器为空值时,表示当前函数不存在上级函数,在此情况下,可以停止回溯推导算法,并基于停止回溯推导算法时得到的所有的起始地址和返回地址生成调用地址表。调用地址表能够记录目标函数相关的函数栈调用关系以及函数栈调用关系中所涉及到的每级函数的起始地址和返回地址,当然,还可以进一步记录每级函数的函数名、函数的栈帧底地址等信息。62.步骤六,采用预设的地址解析工具,解析出调用地址表中的地址在目标文件中的调用栈回溯信息。63.为了更好地理解上述步骤五和步骤六,如图2所示,在此提供一种系统异常宕机的应用场景的示例。在本示例中,假设当cpu执行到函数func3()的第97行时,发生crash宕机异常;在此情况下,cpu硬件将自动压栈r0‑r3、r12、r14、r15等寄存器。寄存器r15所记录的pc值能够指向出现宕机异常处的指令地址,根据该地址可以确定发生异常的目标函数,也即图2中的函数func3()。64.异常压栈中的lr值指向函数func3()的调用者函数的返回地址,也就是func2()中的第59行处指令地址,由于arm架构的子程序呼叫指令(bl或blx)为4字节,因此lr值减4即得到调用处的指令地址:函数func2()的第58行。65.根据cpu寄存器的fp值可以定位到函数func3()的栈帧起始地址,而后读取到上级调用者函数func2()的栈帧起始位置。通过此处函数栈帧的lr值,即可得到调用函数func2()的调用者函数func1()的返回地址,也即func1()函数的19行,此lr值减去4即可得到调用处的指令地址:函数func1()的第18行。66.通过函数栈帧中的lr值得到上级调用者函数的返回地址,通过fp值得到上级调用者函数的栈帧位置,由此能够形成自下向上的链式结构,由该链式结构记录完整的调用栈关系,通过对链式结构的遍历回溯,即可推导出一组完整的调用地址表。67.通过上述一组调用地址表,利用上位机工具addr2line,再结合elf格式的目标文件,最终解析输出如图3所示的完整的调用栈回溯信息。68.综上,本技术实施例提供的嵌入式系统的调用栈回溯方法,利用pc值定位发生宕机的目标函数的地址,以及利用fp值和lr值回溯目标函数对应的调用地址表,能够高效、准确的实现宕机定位和回溯出调用地址表;进一步结合地址解析工具解析出完整的调用栈回溯信息,从而能够为mcu软件开发人员提供问题分析和查找的现场信息,有利于帮助开发者尽快找到并解决问题,提升软件开发及测试效率。69.应该理解的是,虽然图1的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,图1中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。70.在一个实施例中,如图4所示,提供了一种嵌入式系统的调用栈回溯装置,包括:获取模块402、文件生成模块404、程序执行模块406、异常分析模块408和解析模块410,其中:71.获取模块402,用于获取程序源代码文件、指定编译命令和宕机异常处理程序;其中,指定编译命令用于记录函数栈帧的起始地址;72.文件生成模块404,用于基于指定编译命令和宕机异常处理程序对程序源代码文件进行编译链接,生成可执行可链接elf格式的目标文件;73.程序执行模块406,用于当系统发生异常时,保存寄存器信息和目标文件对应的函数栈帧,并执行宕机异常处理程序;其中,寄存器信息包括:用于记录当前函数的栈帧的起始地址的fp寄存器,和用于记录调用当前函数的上级函数的返回地址的lr寄存器;74.异常分析模块408,用于通过宕机异常处理程序基于fp寄存器和lr寄存器对函数栈帧进行分析,得到发生异常的目标函数的调用地址表;75.解析模块410,用于采用预设的地址解析工具,解析出调用地址表中的地址在目标文件中的调用栈回溯信息。76.在一种实施例中,上述文件生成模块404具体用于:77.采用指定编译命令对程序源代码文件进行编译,得到编译结果文件;将宕机异常处理程序注入编译结果文件中,生成elf格式的目标文件。78.在一种实施例中,上述异常分析模块408包括:79.获取单元,用于通过宕机异常处理程序从函数栈帧对应的cpu寄存器中获取fp寄存器和lr寄存器;80.分析单元,用于根据lr寄存器和fp寄存器回溯得到发生异常的目标函数的调用地址表。81.在一种实施例中,上述分析单元具体用于:82.将发生异常的目标函数作为当前函数,重复执行如下回溯推导算法,直至回溯得到目标函数的调用地址表:从当前函数的栈帧对应的fp寄存器中获取当前函数的起始地址;从当前函数的栈帧对应的lr寄存器中获取返回地址;根据起始地址得到调用当前函数的上一级函数,并将上一级函数作为新的当前函数;83.当新的当前函数的栈帧对应的lr寄存器为空值时,停止回溯推导算法,并基于停止回溯推导算法时得到的所有的起始地址和返回地址生成调用地址表。84.在一种实施例中,上述寄存器信息还包括:用于记录发生异常处的指令地址的pc寄存器,上述异常分析模块408还包括地址确定单元,该地址确定单元用于:根据pc寄存器确定发生异常的目标函数的地址。85.在一种实施例中,上述程序执行模块406具体用于:cpu通过预设的异常向量函数表进入并执行宕机异常处理程序。86.在一种实施例中,上述调用栈回溯信息包括:目标函数的函数名、目标函数的地址、各级调用者函数的地址、目标函数和调用者函数各自所属的文件、目标函数和调用者函数在各自所属文件中的行号;其中,调用者函数是与目标函数具有调用栈关系的函数。87.本技术实施例所提供的嵌入式系统的调用栈回溯装置,首先基于获取的指定编译命令和宕机异常处理程序对程序源代码文件进行编译链接,其中,指定编译命令使生成的目标文件在运行时,能够记录函数栈帧的起始地址,宕机异常处理程序能够在发生系统异常时快速进入调用栈回溯流程,也即:基于fp寄存器和lr寄存器对函数栈帧进行分析,得到发生异常的目标函数的调用地址表;该技术方案利用cpu的fp寄存器和lr寄存器,从函数栈帧中分析得到调用地址表,能够更加高效、准确地回溯调用地址;进一步的,采用预设的地址解析工具,解析出调用地址表中的地址在目标文件中完整的调用栈回溯信息,为mcu软件开发人员提供了问题分析和查找的现场信息,有利于帮助开发者尽快找到并解决问题,提升软件开发及测试效率。88.关于种嵌入式系统的调用栈回溯装置的具体限定可以参见上文中对于种嵌入式系统的调用栈回溯方法的限定,在此不再赘述。上述种嵌入式系统的调用栈回溯装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。89.在一个实施例中,提供了一种计算机设备,该计算机设备可以是终端,其内部结构图可以如图5所示。该计算机设备包括通过系统总线连接的处理器、存储器、通信接口、显示屏和输入装置。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统和计算机程序。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的通信接口用于与外部的终端进行有线或无线方式的通信,无线方式可通过wifi、运营商网络、近场通信(nfc)或其他技术实现。该计算机程序被处理器执行时以实现一种嵌入式系统的调用栈回溯方法。该计算机设备的显示屏可以是液晶显示屏或者电子墨水显示屏,该计算机设备的输入装置可以是显示屏上覆盖的触摸层,也可以是计算机设备外壳上设置的按键、轨迹球或触控板,还可以是外接的键盘、触控板或鼠标等。90.本领域技术人员可以理解,图5中示出的结构,仅仅是与本技术方案相关的部分结构的框图,并不构成对本技术方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。91.在一个实施例中,本技术提供的嵌入式系统的调用栈回溯装置可以实现为一种计算机程序的形式,计算机程序可在如图5所示的计算机设备上运行。计算机设备的存储器中可存储组成该嵌入式系统的调用栈回溯装置的各个程序模块,比如,图4所示的获取模块402、文件生成模块404、程序执行模块406、异常分析模块408和解析模块410。各个程序模块构成的计算机程序使得处理器执行本说明书中描述的本技术各个实施例的嵌入式系统的调用栈回溯方法中的步骤。92.本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本技术所提供的各实施例中所使用的对存储器、数据库或其它介质的任何引用,均可包括非易失性和易失性存储器中的至少一种。非易失性存储器可包括只读存储器(read‑onlymemory,rom)、磁带、软盘、闪存或光存储器等。易失性存储器可包括随机存取存储器(randomaccessmemory,ram)或者外部高速缓冲存储器。作为说明而非局限,ram以多种形式可得,比如静态随机存取存储器(staticrandomaccessmemory,sram)和动态随机存取存储器(dynamicrandomaccessmemory,dram)等。93.以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。94.以上所述实施例仅表达了本技术的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本技术构思的前提下,还可以做出若干变形和改进,这些都属于本技术的保护范围。因此,本技术专利的保护范围应以所附权利要求为准。当前第1页12当前第1页12
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献