用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页面如图:


用gcov测试代码覆盖率_第1张图片
QQ截图20150407150551.png

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


用gcov测试代码覆盖率_第2张图片
QQ截图20150407150551.png

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


用gcov测试代码覆盖率_第3张图片
QQ截图20150407150551.png

你可能感兴趣的:(用gcov测试代码覆盖率)