一、gcov简单介绍
Gcov是一个测试C/C++代码覆盖率的工具,伴随GCC发布,配合GCC共同实现对C/C++文件的语句覆盖、功能函数覆盖和分支覆盖测试。
二、gcov统计生成覆盖率流程
图1 gcov覆盖率生成过程
Gcc在编译阶段指定 –ftest-coverage 等覆盖率测试选项后,GCC会:
1、 在输出目标文件中留出一段存储区保存统计数据;
2、 在源代码中每行可执行语句生成的代码之后附加一段更新覆盖率统计结果的代码,也就是插桩(后面详细介绍);
3、 Gcc编译,会生成*.gcno文件,它包含重建基本块图和相应块的源码的行号信息;
4、 在最终可执行文件中,进入main函数之前调用gcov_init内部函数初始化统计数据区,并将gcov_init内部函数注册为exit_handers,用户代码调用exit正常结束时,gcov_exit函数得到调用,并继续调用__gcov_flush输出统计数据到*.gcda文件。
三、原理(插桩)
gcov是使用 基本块BB 和 跳转ARC 计数,结合程序流图来实现代码覆盖率统计的:
图2 程序流图
基本块BB:如果一段程序的第一条语句被执行过一次,这段程序中的每一个都要执行一次,称为基本块。一个BB中的所有语句的执行次数一定是相同的。一般由多个顺序执行语句后边跟一个跳转语句组成。所以一般情况下BB的最后一条语句一定是一个跳转语句,跳转