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是什么?
-
伴随GCC发布,配合GCC共同实现对C/C++文件的语句覆盖和分支覆盖测试;
-
与程序概要分析工具(profiling tool,例如gprof)一起工作,可以估计程序中哪一段代码最耗时;
注:程序概要分析工具是分析代码性能的工具。
2. gcov能做什么?
gcov可以统计
-
每一段代码(section code)的耗时(执行时间)
因此,gcov可以帮你优化代码,当然这个优化动作还是应该有开发者完成。
3. 如何使用gcov?
笔者也以gcov的manual页自带的例子为例,代码(没有做任何改动)如下。
filename: test.c
3.1 使用gcov的3个阶段
(1) 编译
# gcc -fprofile-arcs -ftest-coverage -o test test.c
# ls
test test.c test.gcno
-fprofile-arcs -ftest-coverage告诉编译器生成gcov需要的额外信息,并在目标文件中插入gcov需要的extra profiling information。因此,该命令在生成可执行文件test的同时生成test.gcno文件(gcov note文件)。
(2) 收集信息
# ./test
Success
# ls
test test.c test.gcda test.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
test test.c test.c.gcov test.gcda test.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:
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 only for the main blocks of a line. With this option you can determine if blocks within a single line are not 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-block 0
10: 9-block 1
11: 9-block 2
10: 10: total += i;
-: 11:
1: 12: if (total != 45)
1: 12-block 0
#####: 13: printf ("Failure/n");
$$$$$: 13-block 0
-: 14: else
1: 15: printf ("Success/n");
1: 15-block 0
1: 16: return 0;
1: 16-block 0
-: 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++)
branch 0 taken 91%
branch 1 taken 9% (fallthrough)
10: 10: total += i;
-: 11:
1: 12: if (total != 45)
branch 0 taken 0% (fallthrough)
branch 1 taken 100%
#####: 13: printf ("Failure/n");
call 0 never executed
-: 14: else
1: 15: printf ("Success/n");
call 0 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
分享到:
相关推荐
采用覆盖率驱动的验证方式可以量化验证进度,保证验证的完备性。本文主要介绍了openharmony代码和分支覆盖率测试中所使用的工具(即gcov及lcov)的简介、工作原理及使用方法。
使用gcov完成代码覆盖率的测试.Gcov作为gnu/gcc工作组件之一,是一款的免费的代码覆盖率测试工具,而且可以结合lcov生成美观的html的测试报表。本文介绍一些gcov的使用方法,基本原理,一些实际中可能会遇到的问题...
希望能对通过gcc覆盖率测试工具GCOV进行覆盖率测试相关工作的同行有些许的帮助。 其中,gcov的输入是一个.c文件,前提是已经编译生成了.gcno文件并运行可执行程序生成.gcda文件;gcov根据.c文件相应的.gcda文件和....
希望能对通过gcc覆盖率测试工具GCOV进行覆盖率测试相关工作的同行有些许的帮助。 gcov的输入是一个.c文件,前提是已经编译生成了.gcno文件并运行可执行程序生成.gcda文件;gcov根据.c文件相应的.gcda文件和.gcno文件...
gcov命令是一款测试程序的代码覆盖率的工具。 gcov可以统计每一行代码的执行频率,实际上哪些代码确实被执行了,每一段代码的执行时间。 gcov只在使用GCC编译的代码上工作。它与任何其他概要或测试覆盖机制不兼容。...
轻量级覆盖率测试工具GCOV在使用上具有操作复杂繁琐的弊端.本文所述的设计基于GCOV覆盖率测试的原理,依据shell脚本批处理的特点将各部分操作封装为脚本工具;通过Expect脚本工具对上一操作是否成功进行断言,实现各...
afl-cov, 使用afl模糊测试案例生成gcov的代码覆盖率结果 AFL Fuzzing Fuzzing Fuzzing Fuzzing简介afl-cov 使用 AFL fuzzer afl-fuzz 生成的测试用例文件为目标二进制文件生成gcov代码覆盖率结果。 为了确定AFL的新...
lcov for linux gcovlcov for linux gcovlcov for linux gcovlcov for linux gcovlcov for linux gcovlcov for linux gcov
详细描述如何使用gcov工具来进行内核的代码覆盖率测试。包括linux-2.4内核和linux-2.6内核。极度推荐!
• 是一个测试代码覆盖率的工具 • 是一个命令行方式的控制台程序 • 伴随GCC发布,配合GCC共同实现对C/C++文件的语句覆盖和分支覆盖测试; • 与程序概要分析工具(profiling tool,例如gprof)一起工作,可以估计...
希望能对通过gcc覆盖率测试工具GCOV进行覆盖率测试相关工作的同行有些许的帮助。 gcov-dump是一个dump程序,输入是一个gcov的文件,或者.gcda,即gcov的data文件;或者.gcno,即gcov的note文件。
Gcovr 提供一个工具用来管理 GNU gcov 工具病生成概要代码覆盖率结果。其灵感来自于 Python 的 coverage.py 包。 标签:Gcovr
在 Mac OS 上使用 Qt 5 和 GCOV 的代码覆盖率 这是如何在 Mac OS 上使用 Qt 5 和 GCOV 生成代码覆盖率的示例。 您可以在上阅读整个教程。
gcov theory, usage, realization process
使用gcc/gcov生成代码覆盖率报告-源码
下文所述的GCC命令行选项用于检测代码,以进行代码覆盖率分析。 这些描述直接来自gcc命令行选项文档。 -fprofile-arcs添加代码,以便检测程序流args。 在执行期间,程序记录每个分支和调用执行了多少次,以及执行或...
分析代码覆盖率就是为了 本文主要结合gdb和gcov开源工具,在linux环境下进行白盒测试。 白盒测试的主要目的有两点,一点是验证软件需要是否在代码中被覆盖,二是进行代码覆盖率分析,尽可能多的覆盖所有软件代码...
左挑右选最后看中了基于GCOV的LCOV作为NGINX测试的覆盖率统计工具。选择LCOV的原因很简单:一是适合GCOV是GCC配套的测试覆盖率工具;二是NGINX是纯C的程序,GCOV对纯C代码的覆盖率展现更加精确;三是LCOV作为GCOV的...
工具 gcovtools提供了各种工具和实用程序来处理从发出的覆盖率数据。快速开始首先,除非您还没有这样做,否则请使用clang --coverage编译您的项目并使用llvm-cov消化输出(有关示例,请参见src目录)。 您应该最终...
lcov是建立在gcov之上的一个可以生成html代码覆盖率报告的工具,最近公司开始尝试引入代码覆盖来提高产品质量,lcov很好地满足了我们的需求,虽然lcov本身支持生成代码覆盖率的diff报告,但是跟我们的需求不太符合。...