一种非侵入式的C语言代码分支覆盖率测试方法
文献发布时间:2024-01-17 01:18:42
技术领域
本发明涉及C语言测试技术领域,具体涉及一种非侵入式的C语言代码分支覆盖率测试方法。
背景技术
代码分支覆盖率被定义为一种测试技术指标,它表明测试用例是否真正完全覆盖了应用程序代码中的各种可能以及在运行这些测试用例时执行了多少代码。当前使用代码分支覆盖率的度量来防止BUG的遗漏,代码分支覆盖率越高,发生未检测到的错误的概率越低,有助于提高软件的整体质量。
常用的C语言代码分支覆盖率工具是gcc套件中的gcov工具。该工具在gcc编译过程中对输出的目标文件进行以下修改:
(1)在输出目标文件中留出一段存储区保存统计数据;
(2)在源代码中每行可执行语句生成的代码之后附加一段更新覆盖率统计结果的代码;
(3)在最终可执行文件中进入用户代码main函数之前调用gcov_init内部函数初始化统计数据区,并将gcov_exit内部函数注册为exit handlers;
(4)用户代码调用exit正常结束时,gcov_exit函数得到调用,其继续调用__gcov_flush函数输出统计数据到*.gcda文件中。
该工具在编译过程中还会产生.gcno文件,该文件中保存了源代码与目标文件的一些对应关系。
然而,gcov工具存在以下不足:
1、该工具需要对目标文件进行侵入式的修改,无法直接对已经完成测试的程序进行直接投产,需要重新指定编译选项进行重新编译,需要通过一些其他的方式来保证在测试到重新编译的过程中源代码未发生任何改变。
2、对于守护进程一般很少主动退出,被杀死时不会主动调用exit来执行gcov插入的统计代码,所以没有覆盖率生成,需要通过一些方式来让程序退出时主动调用exit的方式来实现,需要对源代码进行修改才能实现。
3、该工具会对每个源代码文件生成.gcno文件,需要将生成的结果文件及源文件复制到实际运行环境才能够运行得到结果。在目前的分布式场景下,实际编译环境与实际运行环境一般不同,并且可能在分布式环境下进行代码分支覆盖率的测试,该工具有很大的不便。
发明内容
针对现有技术的不足,本发明旨在提供一种非侵入式的C语言代码分支覆盖率测试方法。
为了实现上述目的,本发明采用如下技术方案:
一种非侵入式的C语言代码分支覆盖率测试方法,具体过程为:
S1、读取开发人员由源代码编译得到的目标可执行文件的elf头信息,获取目标可执行文件中的dwarf调试信息节的位置;
S2、根据步骤S1读取的dwarf调试信息节的位置,读取dwarf调试信息,从而获取到目标可执行文件涉及的源代码文件路径、地址及源代码行号对应关系;
S3、根据步骤S2读取的源代码文件路径,分析源代码中的分支和循环信息,并对分支和循环的代码块入口的地址信息进行记录;
S4、将读取到的dwarf调试信息、源代码文件路径、分支和循环的代码块入口的地址信息进行保存;
S5、将开发人员由源代码编译得到的目标可执行文件从编译环境发布到运行环境后,使用基于ptrace封装的附加程序附加到可执行程序进行调试模式运行;
S6、测试人员执行测试用例;
S7、基于ptrace封装的附加程序对可执行程序的运行轨迹进行跟踪,获取到已执行的程序地址,结合调试信息及源代码获取到已经执行和未执行的源代码行数及内容,据此计算代码分支覆盖率,并将计算结果进行保存。
进一步地,所述方法还包括:从数据库或文件中读取代码分支覆盖率计算结果以及未覆盖到的代码进行展示。
进一步地,步骤S7中,基于ptrace封装的附加程序将会自动根据步骤S3所获取的分支和循环的代码块入口的地址信息设置断点,并根据实际程序的断点位置,对该断点的代码块标记为已经执行。
进一步地,步骤S4和步骤S7中,保存的方式为数据库或文件。
本发明还提供一种计算机可读存储介质,所述计算机可读存储介质内存储有计算机程序,所述计算机程序被处理器执行时实现上述方法。
本发明还提供一种计算机设备,包括处理器和存储器,所述存储器用于存储计算机程序;所述处理器用于执行所述计算机程序时,实现上述方法。
本发明的有益效果在于:利用本发明,可以直接对目标可执行程序进行附加运行,无需修改目标可执行程序即可实现对代码分支覆盖率的计算,通过附加运行也实现了对于守护进程需要停止以后才可以计算分支覆盖率的不足,达到了实时计算分支覆盖率。另外,在运行环境,本发明无需每次编译完毕后重新部署开发环境的任何内容,即可实现分支覆盖率的计算。
附图说明
图1为本发明实施例方法的实施流程图。
具体实施方式
以下将结合附图对本发明作进一步的描述,需要说明的是,本实施例以本技术方案为前提,给出了详细的实施方式和具体的操作过程,但本发明的保护范围并不限于本实施例。
本实施例提供一种非侵入式的C语言代码分支覆盖率测试方法,如图1所示,具体过程为:
S1、读取开发人员由源代码编译得到的目标可执行文件的elf头信息,获取目标可执行文件中的dwarf调试信息节的位置。
S2、根据步骤S1读取的dwarf调试信息节的位置,读取dwarf调试信息,从而获取到目标可执行文件涉及的源代码文件路径、地址及源代码行号对应关系。
S3、根据步骤S2读取的源代码文件路径,分析源代码中的分支和循环信息,并对分支和循环的代码块入口的地址信息进行记录。
S4、将读取到的dwarf调试信息、源代码文件路径、分支和循环的代码块入口的地址信息进行保存。具体地,采用数据库(db)或文件的方式对数据进行固化,方便存取。
S5、将开发人员由源代码编译得到的目标可执行文件从编译环境发布到运行环境后,使用基于ptrace封装的附加程序附加到可执行程序进行调试模式运行;
S6、测试人员执行测试用例。
S7、基于ptrace封装的附加程序对可执行程序的运行轨迹进行跟踪,获取到已执行的程序地址,结合调试信息及源代码获取到已经执行和未执行的源代码行数及内容,据此计算代码分支覆盖率,并将计算结果保存在db或文件中。
具体地,基于ptrace封装的附加程序将会自动根据步骤S3所获取的分支和循环的代码块入口的地址信息设置断点,并根据实际程序的断点位置,对该断点的代码块标记为已经执行。
在本实施例中,所述方法还包括:从数据库或文件中读取代码分支覆盖率计算结果以及未覆盖到的代码等信息进行展示。
本实施例方法中,通过读取目标可执行文件信息获取源代码文件信息,并使用基于ptrace封装的附加程序对程序运行轨迹进行跟踪,根据目标可执行文件信息及源代码文件信息可以获取到目标可执行文件的所有可能执行路径和总的待执行源代码行数及内容,使用基于ptrace封装的附加程序对程序的运行轨迹跟踪可以获取到已执行的程序地址,结合调试信息及源代码可以获取到已经执行和未执行的源代码行数及内容,据此即可计算代码分支覆盖率。
对于本领域的技术人员来说,可以根据以上的技术方案和构思,给出各种相应的改变和变形,而所有的这些改变和变形,都应该包括在本发明权利要求的保护范围之内。
- 一种用于压力容器的非接触、非侵入式压力测量方法
- 一种非侵入式MC/DC覆盖率统计分析方法
- 一种针对多种处理器架构的非侵入式覆盖率统计方法