http://blog.csdn.net/livelylittlefish/article/details/6321861
Content
1. gcov是什么?
2. gcov能做什么?
3.如何使用gcov?
3.1使用gcov的3个阶段
(1)编译
(2)收集信息
(3)报告
3.2 gcov的选项
(1) -a, –all-blocks
(2) -b, –branch-probabilities
(3) -c, –branch-counts
4.小结
1. gcov是什么?
Gcov is GCC Coverage是一个测试代码覆盖率的工具是一个命令行方式的控制台程序伴随GCC发布,配合GCC共同实现对C/C++文件的语句覆盖和分支覆盖测试;与程序概要分析工具(profiling tool,例如gprof)一起工作,可以估计程序中哪一段代码最耗时;
注:程序概要分析工具是分析代码性能的工具。
2. gcov能做什么?
gcov可以统计
每一行代码的执行频率实际上哪些代码确实被执行了每一段代码(div code)的耗时(执行时间)
因此,gcov可以帮你优化代码,当然这个优化动作还是应该有开发者完成。
3.如何使用gcov?
笔者也以gcov的manual页自带的例子为例,代码(没有做任何改动)如下。
filename: test.c
3.1使用gcov的3个阶段
(1)编译
# gcc -fprofile-arcs-ftest-coverage-o test test.c
# ls
testtest.ctest.gcno
-fprofile-arcs-ftest-coverage告诉编译器生成gcov需要的额外信息,并在目标文件中插入gcov需要的extra profiling information。因此,该命令在生成可执行文件test的同时生成test.gcno文件(gcov note文件)。
(2)收集信息
# ./test
Success
# ls
testtest.ctest.gcdatest.gcno
执行该程序,生成test.gcda文件(gcov data文件)。
(3)报告
# gcov test.c
File ‘test.c’
Lines executed:87.50% of 8
test.c:creating ‘test.c.gcov’
# ls
testtest.ctest.c.gcovtest.gcdatest.gcno
生成test.c.gcov文件,该文件记录了每行代码被执行的次数。
test.c.gcov文件内容如下,蓝色表示笔者添加的注释。
-:0:Source:test.c
-:0:Graph:test.gcno
-:0:Data:test.gcda
-:0:Runs:1
-:0:Programs:1
-:1:#include//前面的数字表明该clause被执行的次数,下同
-:2:
-:3:int main (void)
1:4:{
-:5:int i, total;
-:6:
1:7:total = 0;
-:8:
11:9:for (i = 0; i < 10; i++)//前面的数字11表明该clause被执行11次
10:10:total += i;
-:11:
1:12:if (total != 45)
#####:13:printf ("Failure/n");
-:14:else
1:15:printf ("Success/n");
1:16:return 0;
-:17:}
-:18:
至此,小结一下:
1) vi: generate test.c
2) gcc compile: generate test and test.gcno
3) run test: generate test.gcda
4) gcov test.c: generate test.c.gcov
5) check test.c.gcov for readable report
3.2 gcov的选项
gcov的选项不多,也好理解,此处选3个典型的选项并结合例子加以说明。
(1)-a,–all-blocks
在.gcov文件中输出每个基本快(basic block)的执行次数。如果没有-a选项,则输出’main’函数这个block的执行次数,如上所示。使用该选项可以
Write individual execution counts for every basic block.Normally gcov outputs execution counts onlyfor the main blocks of a line.With this option you can determine if blocks within a single line arenot being executed.
# gcov -a test.c
File’test.c’
Lines executed:87.50% of 8
test.c:creating ‘test.c.gcov’
Test.c.gcov文件内容。
-:0:Source:test.c
-:0:Graph:test.gcno
-:0:Data:test.gcda
-:0:Runs:1
-:0:Programs:1
-:1:#include
-:2:
-:3:int main (void)
1:4:{
-:5:int i, total;
-:6:
1:7:total = 0;
-:8:
11:9:for (i = 0; i < 10; i++)
1:9-block0
10:9-block1
11:9-block2
10:10:total += i;
-:11:
1:12:if (total != 45)
1:12-block0
#####:13:printf ("Failure/n");
$$$$$:13-block0
-:14:else
1:15:printf ("Success/n");
1:15-block0
1:16:return 0;
1:16-block0
-:17:}
-:18:
(2)-b,–branch-probabilities
在.gcov文件中输出每个分支的执行频率,并有分支统计信息。
# gcov -b test.c
File ‘test.c’
Lines executed:87.50% of 8
Branches executed:100.00% of 4
Taken at least once:75.00% of 4
Calls executed:50.00% of 2
test.c:creating ‘test.c.gcov’
-:0:Source:test.c
-:0:Graph:test.gcno
-:0:Data:test.gcda
-:0:Runs:1
-:0:Programs:1
-:1:#include
-:2:
-:3:int main (void)
function main called 1 returned 100% blocks executed 86%
1:4:{
-:5:int i, total;
-:6:
1:7:total = 0;
-:8:
11:9:for (i = 0; i < 10; i++)
branch0 taken 91%
branch1 taken 9% (fallthrough)
10:10:total += i;
-:11:
1:12:if (total != 45)
branch0 taken 0% (fallthrough)
branch1 taken 100%
#####:13:printf ("Failure/n");
call0 never executed
-:14:else
1:15:printf ("Success/n");
call0 returned 100%
1:16:return 0;
-:17:}
-:18:
(3)-c,–branch-counts
在.gcov文件中输出每个分支的执行次数。
# gcov -c test.c
File ‘test.c’
Lines executed:87.50% of 8
test.c:creating ‘test.c.gcov’
-c是默认选项,其结果与"gcov test.c"执行结果相同。
其他选项,请读者参考相关文档。
4.小结
本文简单介绍了Linux平台GCC自带的代码覆盖率测试工具GCOV的基本情况是使用方法。详细研究需要参考官方文档或者一些研究者的论文。
Reference
Gcov的manual页
http://gcc.gnu.org/onlinedocs/gcc/Gcov.html
http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html
http://dev.firnow.com/course/6_system/linux/Linuxjs/20071129/88999.html
人性最可怜的就是:我们总是梦想着天边的一座奇妙的玫瑰园,