一种针对多种处理器架构的非侵入式覆盖率统计方法
文献发布时间:2023-06-19 09:58:59
技术领域
本发明涉及嵌入式软件的测试技术,特别涉及一种针对多种处理器架构的非侵入式覆盖率统计方法。
背景技术
随着嵌入式软件在不同领域的广泛应用,嵌入式软件的开发技术越来越多样化。嵌入式软件的安全性和可靠性问题越来越引起用户和开发人员的重视,特别是在可靠性和安全性要求很高的行业。嵌入式软件在特定的硬件环境下才能运行,但是嵌入式软件的测试环境与开发环境并不同于真实的运行环境,这将造成目标机上再充分的测试也不能保证真实运行环境下嵌入式软件的绝对安全。
为了对嵌入式软件的测试提供有力的支撑,通常的虚拟化验证平台都是基于某一种方式的验证手段,并不能满足嵌入式软件对虚拟化验证的需求,缺乏有效的覆盖率统计分析手段。
目前比较流行的测试工具提供的覆盖率统计都是基于源码的,基于目标码的覆盖率信息统计工具很少。为了满足不断涌现的目标码验证的需求,一些公司提出了一些相应的产品,但都有些缺陷,对高安全性、高可靠性的嵌入式系统的目标码验证技术的支持还不够。基于源码的覆盖率统计分析工具大都基于插装算法实现的,有两种比较典型的覆盖率分析方法,一种是依赖于某种特定编译器的覆盖率分析工具,另一种是功能单一的覆盖率分析工具。
发明内容
本发明的目的在于提出一种针对多种处理器架构的非侵入式覆盖率统计方法,用于解决嵌入式软件目标码测试过程中无法难以获取覆盖率信息的问题。
本发明一种针对多种处理器架构的非侵入式覆盖率统计方法,其中,包括:搭建嵌入式软件仿真运行环境;解析多种架构目标文件及调试信息格式,获取处理器对应的调试信息格式,通过解析调试信息格式获取嵌入式软件源码目标码对应关系信息;解析源代码获取源代码的分支信息;获取覆盖率信息,包括:仿真执行开始后,判断当前指令是否是分支指令,若不是,继续执行指令;如果是,以当前地址作为基本块结束地址,并以基本块开始地址和结束地址为索引,更新覆盖率查询表;将覆盖率统计分析结果输出。
根据本发明的针对多种处理器架构的非侵入式覆盖率统计方法的一实施例,其中,定义调试信息格式MidDebugInfo,并将多种调试信息解析后转换为该调试信息格式MidDebugInfo,调试信息包含文件信息、函数信息以及源码目标码对应关系信息,其中文件信息包含文件名、文件路径、文件对应的目标码开始地址和目标码结束地址,函数信息包含函数名、函数开始地址及函数结束地址,源码目标码对应关系信息包含源码行数、及该行源码对应的目标码开始地址和目标结束地址。
根据本发明的针对多种处理器架构的非侵入式覆盖率统计方法的一实施例,其中,搭建嵌入式软件仿真运行环境包括:目标处理器内核指令集仿真、嵌入式系统外设仿真以及仿真过程控制;目标处理器内核指令集仿真采用基于LLVM的动态二进制编译方法实现目标指令在Windows/Intel宿主机架构下的异构执行,实现目标代码脱离原始硬件执行环境;嵌入式系统外设仿真用于实现目标处理器外围设备的仿真,包括RS-422、RS-485串口设备仿真、开关量设备仿真以及存储系统仿真;仿真过程控制采用统一的时钟调度算法实现虚拟环境各组成部分的执行控制与协同运行。
根据本发明的针对多种处理器架构的非侵入式覆盖率统计方法的一实施例,其中,解析多种架构目标文件及调试信息格式包括:建立以文件、函数以及行号信息三级结构信息表;(1)多种处理器目标文件解析,根据目标文件结构,确定调试信息类型并读取调试信息;(2)解析Dwarf1、Dwarf2、Dwarf3、stab、COFF以及OMF51调试信息格式,并将调试信息格式转换为调试信息格式MidDebugInfo;(3)读取调试信息格式MidDebugInfo的调试信息,判断当前调试信息节点类型;(4)判断当前调试信息节点是否是文件开始类型节点,若是创建文件信息记录结构,将文件对应目标码开始地址写入到当前文件信息记录结构中,执行步骤(3),若不是执行步骤(5);(5)判断当前调试信息节点是否是函数开始类型节点,若是创建函数信息记录结构,将函数对应目标码开始地址写入到当前函数信息记录结构中,并将当前函数信息结构插入到当前文件信息记录机构中,执行步骤(3),若不是执行步骤(6);(6)判断当前调试信息节点是否是行号信息类型节点,若是创建行号信息记录结构,并将当前行号信息结构插入到当前函数信息记录机构中,执行步骤(3),若不是执行步骤(7);(7)判断当前调试信息节点是否是函数结束类型节点,若是将函数对应目标码结束地址写入到当前函数信息记录结构中,执行步骤(3),若不是执行步骤(8);(8)判断当前调试信息节点是否是文件结束类型节点,若是将文件对应目标码结束地址写入到当前文件信息记录结构中,执行步骤(9);(9)判断调试信息读取是否结束,若没有结束,执行步骤(3),否则,开始解析源代码获取源代码的分支信息。
根据本发明的针对多种处理器架构的非侵入式覆盖率统计方法的一实施例,其中,解析源代码分支信息包括:获取源代码路径信息;根据三级查询结构表,逐个读入源文件,并对行号信息节点对应的源代码行的分支信息进行判断,获取源代码分支情况。
根据本发明的针对多种处理器架构的非侵入式覆盖率统计方法的一实施例,其中,覆盖率信息输出格式为:基本块开始地址、基本块结束地址、执行次数、分支指令地址以及分支信息。
根据本发明的针对多种处理器架构的非侵入式覆盖率统计方法的一实施例,其中,根据文件、函数、行号信息三级结构信息表,读取记录覆盖率信息的文件,并根据源代码和目标码对应关系及源文件分支信息,生成覆盖率统计分析结果。
根据本发明的针对多种处理器架构的非侵入式覆盖率统计方法的一实施例,其中,覆盖统计结果输出提供指令取指、译码、反汇编以及执行信息解析,生成覆盖统计分析结果。
根据本发明的针对多种处理器架构的非侵入式覆盖率统计方法的一实施例,其中,以目标码基本块为最小统计单元,基本块包含开始地址、结束地址、分支指令地址、执行次数以及分支信息,一个基本块包含一行或多行源码对应的目标码。
根据本发明的针对多种处理器架构的非侵入式覆盖率统计方法的一实施例,其中,获取覆盖率信息包括:(a)运行嵌入式仿真环境并加载目标文件到模拟内存中;(b)仿真执行开始,并将执行开始地址作为第一个基本块的开始地址;(c)读取并翻译指令,执行当前指令并判断当前指令是否为分支指令,若不是分支指令,继续执行步骤(c),若是执行步骤(d);(d)分支指令对应的地址为基本块结束地址,记录当前基本块的开始地址、结束地址及分支指令的分支信息;(e)以基本块的开始地址和结束地址为索引,查询当前基本块在三级覆盖率信息表中的位置,确定基本块对应的行号信息结构,将对应的行号信息结构执行次数加一并更新分支信息;(f)判断是否生成覆盖率,若否,继续执行步骤(c),若是,执行步骤(g);(g)将记录在覆盖率信息查询表中的信息以特定的格式写入到指定路径的文件中,并暂停仿真执行。
本发明的目的是提出一种针对多种处理器架构的非侵入式覆盖率统计方法,通过分析不同处理器架构下目标文件的类型和调试信息格式的类型,将不同类型调试信息格式转换为通用类型调试信息,并根据处理器虚拟化仿真系统获取覆盖率执行信息,最后完成覆盖率统计分析功能,弥补现有覆盖率统计分析工具的不足,满足多种场景下覆盖率统计分析的需求。
附图说明
无
具体实施方式
为使本发明的目的、内容、和优点更加清楚,下面结合实施例,对本发明的具体实施方式作进一步详细描述。
本发明一种针对多种处理器架构的非侵入式覆盖率统计方法,包括:
搭建嵌入式软件仿真运行环境包括:
嵌入式软件仿真运行环境采用虚拟化仿真技术实现目标系统的高精度高性能仿真,提供嵌入式软件的虚拟化运行环境,并记录指令执行过程及分支信息,主要包括:目标处理器内核指令集仿真、嵌入式系统外设仿真以及仿真过程控制。
解析多种架构目标文件及调试信息格式包括:
多种架构目标文件及调试信息格式解析主要解析主流嵌入式处理器所涉及得文件格式和调试信息格式,通过解析文件格式,获取处理器对应的调试信息格式,通过解析调试信息格式获取嵌入式软件源码目标码对应关系信息。
主流嵌入式软件涉及多种调试信息格式,为了便于嵌入式软件覆盖率信息统计输出,定义一种新的调试信息格式(MidDebugInfo),并将多种调试信息解析后转换为该调试信息格式。调试信息主要包含文件信息、函数信息、源码目标码对应关系信息,其中文件信息包含文件名、文件路径、文件对应的目标码开始地址和目标码结束地址,函数信息包含函数名、函数开始地址及函数结束地址,源码目标码对应关系信息包含源码行数、及该行源码对应的目标码开始地址和目标结束地址。为了方便信息的记录和查询,建立以文件、函数、行号信息三级结构信息表,其中文件可包含多个函数,函数包含多个行号信息的三级覆盖率信息表;当需要更新覆盖率信息时,查询基本块(Basic Block)基本块所在的文件,之后查询基本块所在的函数,最后顺序遍历该基本块包含的目标码地址,然后更新该目标码区间的行号信息。
源代码分支信息解析包括:
源代码分支信息主要提供源代码分析信息获取的功能,嵌入式处理器汇编指令集包含多种分支指令,无法通过调试信息格式解析获取源代码的分支信息,通过分析源代码可获取源代码的分支信息。
覆盖率信息获取包括:
程序仿真执行过程中,取指和译码之后,能得到被执行指令的指令码。通过对执行码的判断,能够得到指令码是否是跳转指令以及跳转指令的类型。通过调试信息格式解析及源代码分析信息解析,可以得到指令对应的源码、跳转指令对应的源码以及跳转指令对应的类型。
在覆盖率信息获取过程中,为了减少覆盖率统计对仿真执行的影响,以目标码基本块(Basic Block)为最小统计单元,基本块的包含开始地址、结束地址、分支指令(BranchInstruction)地址、执行次数、分支信息,一个基本块包含一行或多行源码对应的目标码。
仿真执行开始后,判断当前指令是否是分支指令,若不是分支指令,继续执行;如果当前指令是分支指令,当前地址(Current Program Count)作为基本块结束地址,并以基本块开始地址和结束地址为索引,更新覆盖率查询表。
覆盖率统计分析结果输出包括:
覆盖统计结果输出主要提供指令取指、译码、反汇编以及执行信息解析,最终生成覆盖统计分析结果。
对于本发明一种针对多种处理器架构的非侵入式覆盖率统计分析方法的一实施例,其具体步骤为:
搭建嵌入式软件仿真运行环境包括:
嵌入式软件仿真运行环境采用虚拟化仿真技术实现目标系统的高精度高性能仿真,提供嵌入式软件的虚拟化运行环境,并提供指令执行过程及状态的监测手段,是嵌入式软件异常处理测试用例的执行平台,主要包括:目标处理器内核指令集仿真、嵌入式系统外设仿真以及仿真过程控制。
其中,目标处理器内核指令集仿真采用基于LLVM的动态二进制编译方法实现目标指令在Windows/Intel宿主机架构下的异构执行,实现目标代码脱离原始硬件执行环境;嵌入式系统外设仿真用于实现目标处理器外围设备的仿真,包括RS-422、RS-485串口设备仿真、开关量设备仿真、存储系统仿真等,支持数据激励的注入与采集;仿真过程控制采用统一的时钟调度算法实现虚拟环境各组成部分的执行控制与协同运行。
多种架构目标文件及调试信息格式解析包括:
解析主流嵌入式处理器所涉及得文件格式和调试信息格式,通过解析文件格式,获取处理器对应的调试信息格式,通过解析调试信息格式获取嵌入式软件源码目标码对应关系信息。建立以文件、函数、行号信息三级结构信息表,方便信息的记录和查询。
(1)多种处理器目标文件解析,根据目标文件结构,确定调试信息类型并读取调试信息;
(2)解析Dwarf1、Dwarf2、Dwarf3、stab、COFF、OMF51调试信息格式,并将调试信息格式转换为MidDebugInfo;
(3)读取MidDebugInfo调试信息,判断当前调试信息节点类型;
(4)判断当前调试信息节点是否是文件开始类型节点,若是创建文件信息记录结构,将文件对应目标码开始地址写入到当前文件信息记录结构中,执行步骤(3),若不是执行步骤(5);
(5)判断当前调试信息节点是否是函数开始类型节点,若是创建函数信息记录结构,将函数对应目标码开始地址写入到当前函数信息记录结构中,并将当前函数信息结构插入到当前文件信息记录机构中,执行步骤(3),若不是执行步骤(6);
(6)判断当前调试信息节点是否是行号信息类型节点,若是创建行号信息记录结构,并将当前行号信息结构插入到当前函数信息记录机构中,执行步骤(3),若不是执行步骤(7);
(7)判断当前调试信息节点是否是函数结束类型节点,若是将函数对应目标码结束地址写入到当前函数信息记录结构中,执行步骤(3),若不是执行步骤(8);
(8)判断当前调试信息节点是否是文件结束类型节点,若是将文件对应目标码结束地址写入到当前文件信息记录结构中,执行步骤(9);
(9)判断调试信息读取是否结束,若没有结束,执行步骤(3),否则,执行步骤(10);
源代码分支信息解析包括:
源代码分支信息主要提供源代码分析信息获取的功能,嵌入式处理器汇编指令集包含多种分支指令,无法通过调试信息格式解析获取源代码的分支信息,通过分析源代码可获取源代码的分支信息。
(10)获取源代码路径信息;
(11)根据三级查询结构表,逐个读入源文件,并对行号信息节点对应的源代码行的分支信息进行判断,获取源代码分支情况;
覆盖率信息获取包括:
程序仿真执行过程中,取指和译码之后,能得到被执行指令的指令码。通过对执行码的判断,能够得到指令码是否是跳转指令以及跳转指令的类型。通过调试信息格式解析及源代码分析信息解析,可以得到指令对应的源码、跳转指令对应的源码以及跳转指令对应的类型。
(12)嵌入式软件仿真运行环境采用虚拟化仿真技术实现目标系统的高精度高性能仿真,提供嵌入式软件的虚拟化运行环境,通过该环境构建嵌入式软件仿真运行环境;
(13)运行嵌入式仿真环境并加载目标文件到模拟内存中;
(14)仿真执行开始,并将执行开始地址作为第一个基本块的开始地址;
(15)读取指令、翻译指令、执行当前指令并判断当前指令是否为分支指令,若不是分支指令,继续执行步骤(15),若是执行步骤(16);
(16)当前指令对应的地址为基本块结束地址,记录当前基本块的开始地址、结束地址及分支指令的分支信息;
(17)以基本块的开始地址、结束地址为索引,查询当前基本块在三级覆盖率信息表中的位置,确定基本块对应的行号信息结构,将对应的行号信息结构执行次数加一并更新分支信息;
(18)判断是否生成覆盖率,若否,继续执行步骤(15),若是,执行步骤(19);
(19)将记录在覆盖率信息查询表中的信息以特定的格式写入到指定路径的文件中,并暂停仿真执行。覆盖率信息输出格式为:基本块开始地址、基本块结束地址、执行次数、分支指令地址、分支信息,中间以冒号分割;
覆盖率统计分析结果输出包括:
覆盖统计结果输出主要提供指令取指、译码、反汇编以及执行信息解析,最终生成覆盖统计分析结果。
(20)根据文件、函数、行号信息三级结构信息表,读取记录覆盖率信息的文件,并根据源代码和目标码对应关系及源文件分支信息,生成覆盖率统计分析结果。
本发明通过对软件目标文件的调试信息解析实现软件的调试,通过对DWARF信息的解析实现软件语句覆盖率、分支覆盖率统计。通过对故障类型抽象和模拟实现软件的故障注入,通过在模拟执行过程中统计被测程序语句执行的次数以及时钟数目实现软件的性能评估。词法分析过程中只处理虚拟化验证平台需要的信息,减少了词法分析器所消耗的时间。采用并行指令串行化思想解决DSP指令并行问题。覆盖率信息统计过程中只统计跳转指令信息,提高仿真器的执行效率。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变形,这些改进和变形也应视为本发明的保护范围。
- 一种针对多种处理器架构的非侵入式覆盖率统计方法
- 一种针对多种处理器架构的非侵入式覆盖率统计方法