gcov 是一个可用于C/C++的代码覆盖工具,是GCC的内建工具。
它的使用很简单,需要在编译和链接时增加-fprofile-arcs -ftest-coverage生成二进制文件。gcov主要使用.gcno和.gcda两个文件,.gcno是由-ftest-coverage产生的,它包含了重建基本块图和相应的块的源码的行号的信息。.gcda是由加了-fprofile-arcs编译参数的编译后的文件运行所产生的,它包含了弧跳变的次数和其他的概要信息。
举个例子:
有一个源文件main.cc:
/// @file main.cc
#include <cstdio>
void test(int num)
{
for(int i = 0; i < num; ++i)
printf("*");
printf("\n");
}
int main()
{
int num ;
scanf("%d", &num);
if (num <= 0) {
printf("num(%d) <= 0\n", num);
}
else for(int i = 1; i <= num; ++i) {
test(i);
}
return 0;
}
编译-fprofile-arcs -ftest-coverage 会产生.gcno文件:
192:test lurongming$ gcc -fprofile-arcs -ftest-coverage main.cc -o main
192:test lurongming$ ls
main main.cc main.gcno
接下来运行可执行文件会产生.gcda文件:
192:test lurongming$ ./main
5
*
**
***
****
*****
192:test lurongming$ ls
main main.cc main.gcda main.gcno
用gcov生成代码覆盖信息,可以看到新增了main.cc.gcov文件:
192:test lurongming$ gcov main.cc
File 'main.cc'
Lines executed:83.33% of 12
main.cc:creating 'main.cc.gcov'
192:test lurongming$ ls
main main.cc main.cc.gcov main.gcda main.gcno
查看main.cc.gcov文件的信息:
192:test lurongming$ cat main.cc.gcov
-: 0:Source:main.cc
-: 0:Graph:main.gcno
-: 0:Data:main.gcda
-: 0:Runs:1
-: 0:Programs:1
-: 1:/// @file main.cc
-: 2:
-: 3:#include <cstdio>
-: 4:
-: 5:void test(int num)
-: 6:{
40: 7: for(int i = 0; i < num; ++i)
15: 8: printf("*");
5: 9: printf("\n");
5: 10:}
-: 11:
-: 12:int main()
-: 13:{
-: 14: int num ;
1: 15: scanf("%d", &num);
-: 16:
1: 17: if (num <= 0) {
#####: 18: printf("num(%d) <= 0\n", num);
#####: 19: }
12: 20: else for(int i = 1; i <= num; ++i) {
5: 21: test(i);
5: 22: }
1: 23: return 0;
-: 24:}
被标记为#####的代码行就是没有被执行过的,-表示无所谓执行的,其他数字表示执行的次数。