用gcov测试代码覆盖率
gcov是什么?Gcov is GCC Coverage,是一个测试代码覆盖率的工具,是一个命令行方式的控制台程序,伴随GCC发布,配合GCC共同实现对C/C++文件的语句覆盖和分支覆盖测试;
与程序概要分析工具(profiling tool,例如gprof)一起工作,可以估计程序中哪一段代码最耗时;
注:程序概要分析工具是分析代码性能的工具。
gcov能做什么?gcov可以统计每一行代码的执行频率,实际上哪些代码确实被执行了,每一段代码(section code)的耗时(执行时间),因此,gcov可以帮你优化代码,当然这个优化动作还是应该有开发者完成。
gcov的使用比较麻烦,首先需要修改编译选项,加入-fprofile-arcs -ftest-coverage,或者简单点直接用--coverage,等同于前者。另外编译过程中的链接库需要加上-lgcov。
在编译之后,除了生成可执行文件外,还会生成gcov需要的额外信息,文件后缀为.gcno。
如果程序是cli命令行,执行一次得出结果立马退出结束了,那么会直接生成后缀为.gcda的gcov data文件。
如果程序是守护进程,需要常驻后台不能退出,则需要通过信号处理机制来dump出gcov需要的data文件,因此在处理信号的代码中加入如下几行:
[c++]
extern "C" void __gcov_flush();
switch (signo) {
...
case SIGINT:
// flush out gcov stats data
__gcov_flush();
这样就会dump出data文件了。
之后对每个.gcno文件生成.gcov文件,比如gcno文件名是recserver-main.gcno,那么执行gcov recserver-main,就会生成一堆.gcov文件,打开每个gcov文件,第一列,每个数字,就是所在行的执行次数。
为了方便阅读,我们还有工具把这些文件转换成可读性更强的web,这个工具叫做lcov,下载lcov安装完成后运行:
lcov -b ./ -d ./ --gcov-tool /usr/bin/gcov -c -o output.info
这样就会生成一个output.info文件。
lcov参数的含义大家自己去查就好了。
然后我们用genhtml命令就可以生成可以阅读的web页面了:
genhtml -o gcovdir/ output.info
-o选项把生成的web页面指定到gcovdir目录
生成的web页面如图:

左边每个链接都可以点进去:

会看到代码和旁边的运行次数。
