GCC gcov 代码覆盖工具的简单使用

gcov 是一个可用于C/C++的代码覆盖工具,是GCC的内建工具。

它的使用很简单,需要在编译和链接时增加-fprofile-arcs -ftest-coverage生成二进制文件。gcov主要使用.gcno和.gcda两个文件,.gcno是由-ftest-coverage产生的,它包含了重建基本块图和相应的块的源码的行号的信息。.gcda是由加了-fprofile-arcs编译参数的编译后的文件运行所产生的,它包含了弧跳变的次数和其他的概要信息。

举个例子:
有一个源文件main.cc:

/// @file main.cc

#include 

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 
        -:    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:}

被标记为#####的代码行就是没有被执行过的,-表示无所谓执行的,其他数字表示执行的次数。

你可能感兴趣的:(Compile,Tools)