技术领域
本发明属于嵌入式技术领域,具体涉及一种针对嵌入式软件架构的软件栈消耗分析方法及分析装置。
背景技术
随着卫星导航领域技术的快速发展和卫星导航领域技术应用场景的越来越广泛,卫星导航系统软件的可靠性逐渐引起了广泛关注。卫星导航系统软件属于计算机软件,其可靠性直接影响应用软件及系统的稳定性及可靠性;进行计算机软件可靠性测试的主要目的就是对计算机软件的某种功能或者整体运行过程进行测试,然后评估计算机软件的可靠性是否能够满足计算机用户的使用需求。可以说,计算机软件的可靠性测试就是对计算机软件中存在的bug进行及时的发现,尽早解决,从而提高计算机软件的经济效益和使用效益。
软件栈消耗是计算机软件可靠性测试的重要组成部分。现有的软件栈消耗的分析方法主要是有以下两类:一是根据操作系统的类型,了解该操作系统设计之初每一个线程在创建时分配了多大的栈,然后再根据创建的线程数量,得出系统栈的消耗;二是软件开发者自己根据源代码进行分析,并计算出系统软件栈的消耗量。
然而,对于稳定要求高、迭代快、高度商业化的系统软件开发来说,现有的栈消耗消耗分析方法存在一定的缺陷:方法一虽然计算简单快捷,但是误差较大,因为计算出来的消耗量仅仅是预分配的消耗量,实际软件运行过程中大概率是不会达到这个计算值,此种方法只是粗略估计;而且还可能造成软件栈的浪费。方法二虽然计算出的栈消耗量比较精确,但是耗时太长,效率低,完全依赖于软件开发者,难度太大,通用性不强。
发明内容
本发明的目的之一在于提供一种可靠性高、精确性好且通用性强的针对嵌入式软件架构的软件栈消耗分析方法。
本发明的目的之二在于提供一种包括了所述针对嵌入式软件架构的软件栈消耗分析方法的分析装置。
本发明提供的这种针对嵌入式软件架构的软件栈消耗分析方法,包括软件栈消耗分析过程和数据输出过程;软件栈消耗分析过程用于分析系统软件的函数调用关系结构、分析系统软件的每个函数的栈消耗量、记录函数的调用关系和函数对应的栈消耗量,并最终得到分析数据;数据输出过程用于根据件栈消耗分析过程得到的分析数据进行输出和分析。
所述的软件栈消耗分析过程,具体包括如下步骤:
S1.解析传入的参数;
S2.根据系统软件的源代码格式,获取对应的汇编代码;
S3.打开指定的文件,搜索指定的入口函数,并从入口函数开始分析;
S4.进入函数内部,分析函数内的指令类型;
S5.根据获取的指令类型,计算该函数栈的消耗量;
S6.根据函数内部的调用指令,记录函数调用深度并继续统计;
S7.处理分析得到最终的分析数据。
步骤S2所述的根据系统软件的源代码格式,获取对应的汇编代码,具体为若获取的系统软件的源代码为汇编代码,则直接进行后续的分析过程;若获取的系统软件的源代码为非汇编代码,则调用编译器将源代码汇编为汇编代码,再进行后续的分析过程。
步骤S4所述的进入函数内部,分析函数内的指令类型,具体为从入口函数进入,逐个搜索每个函数;每个函数均有一个func_table结构体用于存储该函数的信息;所述信息包括该函数的名称name、栈消耗量func_stack、调用深度func_length和调用该函数时系统软件栈的消耗量sys_stack;分析完一个函数后,将该函数的信息存入func_table类型的节点中;每一个函数的信息均为一个节点;按照函数的调用顺序,将每一个函数的信息节点连接起来组成一个链表,该链表存储了系统软件的所有函数的信息。
步骤S5所述的根据获取的指令类型,计算该函数栈的消耗量,具体为获取到函数名后,首先在func_table链表中进行搜索和匹配,判断是否之前分析过该函数:若已经分析过该函数,则直接将该函数的信息复制到当前的节点中,然后修正该节点的函数调用深度func_length;若在func_table中没有搜索到该函数,则开始分析该函数的软件栈消耗量:开始搜索匹配栈操作指令和跳转指令,并当匹配到栈操作指令时,按着汇编语言的语法格式,继续向后搜索关键字;根据分析到的指令,计算各个指令的栈消耗量,并存储到该函数对应的节点中,更新系统软件栈的消耗量sys_stack;系统软件栈的消耗量(sys_stack)=调用该函数之前系统软件栈消耗量sys_stack_prev+该函数的栈消耗func_stack;同时,比较系统软件栈的消耗量sys_stack和系统软件栈的最大消耗量sys_stack_max的值,并将较大者作为最终的函数栈的消耗量。
步骤S6所述的根据函数内部的调用指令,记录函数调用深度并继续统计,具体为若搜索到跳转指令,则跳转到该函数中分析该函数栈消耗,此时函数调用深度加1,再更新函数的信息到该函数节点;若搜索到弹栈指令,则认定该函数分析完毕,返回到函数被调用处。
所述的数据输出过程,具体包括树状格式输出和table格式输出;树状格式输出用于直接显示嵌入式软件架构的软件栈消耗;table格式输出则根据软件栈消耗分析过程输出的链表,重新将链表连接,展示每一个函数的每一项信息,并根据每个函数的栈消耗量,比较系统软件的栈最大消耗量与系统分配软件的栈大小,从而给出最终的分析建议。
所述的树状格式输出用于直接显示嵌入式软件架构的软件栈消耗,具体为针对软件栈消耗分析过程输出的链表,链表中节点的连接顺序就是函数的调用顺序;找到链表头,链表头存储的是入口函数的信息和输出函数的名称;名称前的空格的数量等于函数的调用深度,函数名称的后面为该函数的栈的消耗量和此时系统软件的栈的消耗量;从而,展示出每个函数的栈消耗量和调用到该函数时的系统软件栈消耗量。
所述的table格式输出则根据软件栈消耗分析过程输出的链表,重新将链表连接,展示每一个函数的每一项信息,并根据每个函数的栈消耗量,比较系统软件的栈最大消耗量与系统分配软件的栈大小,从而给出最终的分析建议,具体为根据软件栈消耗分析过程输出的链表,将链表重新链接,链接的规则为按照每个函数的栈消耗量以降序进行链接,将每个节点的信息按照table格式逐项输出,从而展示每个函数的每一项信息;然后,得到系统软件的栈最大消耗量sys_stack_max,并与系统分配软件的栈sys_stack进行比较:若系统软件的栈最大消耗量sys_stack_max≤系统分配软件的栈sys_stack,则认定该系统软件的栈分配没有风险,否则认定该系统软件的栈分配存在风险。
本发明还公开了一种分析装置,该分析装置包括了所述针对嵌入式软件架构的软件栈消耗分析方法,并采用所述针对嵌入式软件架构的软件栈消耗分析方法,对嵌入式软件进行软件栈消耗分析。
本发明提供的这种针对嵌入式软件架构的软件栈消耗分析方法及分析装置,通过创新软件栈消耗分析过程,保证了软件栈消耗分析过程的可靠性和精确性,而且适用于任何嵌入式软件架构,通用性好。
附图说明
图1为本发明方法的方法流程示意图。
具体实施方式
如图1所示为本发明方法的方法流程示意图:本发明提供的这种针对嵌入式软件架构的软件栈消耗分析方法,包括软件栈消耗分析过程和数据输出过程;软件栈消耗分析过程用于分析系统软件的函数调用关系结构、分析系统软件的每个函数的栈消耗量、记录函数的调用关系和函数对应的栈消耗量,并最终得到分析数据;数据输出过程用于根据件栈消耗分析过程得到的分析数据进行输出和分析。
具体实施时,软件栈消耗分析过程包括如下步骤:
S1.解析传入的参数;
S2.根据系统软件的源代码格式,获取对应的汇编代码;具体为若获取的系统软件的源代码为汇编代码,则直接进行后续的分析过程;若获取的系统软件的源代码为非汇编代码,则调用编译器将源代码汇编为汇编代码,再进行后续的分析过程;
S3.打开指定的文件,搜索指定的入口函数,并从入口函数开始分析;
S4.进入函数内部,分析函数内的指令类型;具体为从入口函数进入,逐个搜索每个函数;每个函数均有一个func_table结构体用于存储该函数的信息;所述信息包括该函数的名称name、栈消耗量func_stack、调用深度func_length和调用该函数时系统软件栈的消耗量sys_stack;分析完一个函数后,将该函数的信息存入func_table类型的节点中;每一个函数的信息均为一个节点;按照函数的调用顺序,将每一个函数的信息节点连接起来组成一个链表,该链表存储了系统软件的所有函数的信息;
S5.根据获取的指令类型,计算该函数栈的消耗量;具体为获取到函数名后,首先在func_table链表中进行搜索和匹配,判断是否之前分析过该函数:若已经分析过该函数,则直接将该函数的信息复制到当前的节点中,然后修正该节点的函数调用深度func_length;若在func_table中没有搜索到该函数,则开始分析该函数的软件栈消耗量:开始搜索匹配栈操作指令(包括push,pop,stmfd,sub,str,add等)和跳转指令(包括b,bl,blx,bx等),并当匹配到栈操作指令时,按着汇编语言的语法格式,继续向后搜索关键字;
以32位ARM为例:若为push指令,则后面会跟着几个寄存器,例如:push{r4,r5,r6},搜索到该指令将3个寄存器入栈,那么该条指令会带来栈的消耗量为4*3=12个字节(32位ARM中每个寄存器占用4个字节);
根据分析到的指令,计算各个指令的栈消耗量,并存储到该函数对应的节点中,更新系统软件栈的消耗量sys_stack;系统软件栈的消耗量(sys_stack)=调用该函数之前系统软件栈消耗量sys_stack_prev+该函数的栈消耗func_stack;同时,比较系统软件栈的消耗量sys_stack和系统软件栈的最大消耗量sys_stack_max的值,并将较大者作为最终的函数栈的消耗量;
S6.根据函数内部的调用指令,记录函数调用深度并继续统计;具体为若搜索到跳转指令(比如bl),则跳转到该函数中分析该函数栈消耗,此时函数调用深度加1,再更新函数的信息到该函数节点;若搜索到弹栈指令(比如pop),则认定该函数分析完毕,返回到函数被调用处;
S7.处理分析得到最终的分析数据;分析完每个函数的栈消耗后,将信息存储到该函数的节点中,同时更新系统软件栈的最大消耗量(sys_stack_max);当所有的函数分析完成后,所有函数的信息都被放在func_table的链表中。
数据输出过程具体包括树状格式输出和table格式输出;树状格式输出用于直接显示嵌入式软件架构的软件栈消耗;table格式输出则根据软件栈消耗分析过程输出的链表,重新将链表连接,展示每一个函数的每一项信息,并根据每个函数的栈消耗量,比较系统软件的栈最大消耗量与系统分配软件的栈大小,从而给出最终的分析建议。
树状格式输出用于直接显示嵌入式软件架构的软件栈消耗,具体为针对软件栈消耗分析过程输出的链表,链表中节点的连接顺序就是函数的调用顺序;找到链表头,链表头存储的是入口函数的信息和输出函数的名称;名称前的空格的数量等于函数的调用深度,函数名称的后面为该函数的栈的消耗量和此时系统软件的栈的消耗量;从而,展示出每个函数的栈消耗量和调用到该函数时的系统软件栈消耗量。
以下为测试样例树状输出格式:
table格式输出则根据软件栈消耗分析过程输出的链表,重新将链表连接,展示每一个函数的每一项信息,并根据每个函数的栈消耗量,比较系统软件的栈最大消耗量与系统分配软件的栈大小,从而给出最终的分析建议,具体为根据软件栈消耗分析过程输出的链表,将链表重新链接,链接的规则为按照每个函数的栈消耗量以降序进行链接,将每个节点的信息按照table格式逐项输出,从而展示每个函数的每一项信息;然后,得到系统软件的栈最大消耗量sys_stack_max,并与系统分配软件的栈sys_stack进行比较:若系统软件的栈最大消耗量sys_stack_max≤系统分配软件的栈sys_stack,则认定该系统软件的栈分配没有风险,否则认定该系统软件的栈分配存在风险。
以下为测试样例的table输出格式:
本发明方法能够分析出嵌入式平台软件栈的总消耗量、软件中各个函数的栈消耗量的统计,并按消耗量将函数排名输出、整个软件运行过程中栈消耗的最大量,有效的解决了软件运行过程中因为栈消耗不明确导致的栈空间污染问题,在软件的设计及debug过程中起到了关键作用;能够为系统软件的设计提供数据支持,提升了操作系统的设计,保证了操作系统及软件设计的健壮性,能够输出系统软件软件栈的消耗,提高了操作系统和软件的设计效率。
机译: 计算机实现的软件架构分析方法及其设备
机译: 消耗电力分析装置,消耗电力的分析方法以及存储在其中的非暂态计算机可读记录介质消耗电力分析程序
机译: 软件分析装置,软件分析方法和软件分析程序