系统相关
首页 > 系统相关> > 【Linux下使用gcov统计C++代码覆盖率的总结】包括编译、统计、代码屏蔽等

【Linux下使用gcov统计C++代码覆盖率的总结】包括编译、统计、代码屏蔽等

作者:互联网

Linux下使用gcov统计C++代码覆盖率的总结


在测试或开发的过程中,我们通常需要统计代码的函数覆盖、行覆盖及分支覆盖情况,因此需要借助一些工具来帮助我们统计代码覆盖率,这里我分享了一些在做C++产品的测试工作上,使用GCOV和LCOV工具统计覆盖率的经验,希望与大家一起学习。

代码编译

下载与安装

1、LCOV可以采用html的格式显示GCOV的结果,LCOV的源码下载地址如下:http://ltp.sourceforge.net/coverage/lcov.php,下载文件名如 lcov-1.14.tar
2、用root帐号登录linux,直接tar –xvf lcov-1.14.tar,然后make install,安装到系统的执行目录即可,任何用户登录都可以执行LCOV工具的命令。
3、GCVO无需安装,和GCC、Linux一起发行。

编译与结果生成

要统计代码覆盖率首先要进行特殊编译,将代码编译成经过打桩处理的特殊so库,这样在执行代码的时候,就可以将覆盖率等信息统计进去。
1、编译命令
我们只需要在编译文件中加上,-fprofile-arcs -ftest-coverage 和 -lgcov
a、-ftest-coverage选项会让GCC为每个源文件生成同名的.gcno文件,gcno文件为覆盖率统计的路径弧长文件,gcov程序读取.gcno文件,重组每一个可执行程序的流图。
b、-fprofile-arcs选项会让GCC为每个源文件生成同名的.gcda文件,该文件包含每一个指令分支的执行次数信息
c、-lgcov 为需要链接的动态库
d、执行g++编译命令完成后,可以看到源文件目录下生成了后缀gcno的文件

2、将编译出来的so库替换原库,然后可以去执行程序了
执行程序之后,会发现生成了后缀为.gcda的文件,说明编译成功,gcov已经成功获取了覆盖率信息
3、gcda文件不可读,我们需要lcov工具去将gcda文件可视化
执行命令:
lcov --directory test_code/ --capture --output-file results/test.info --rc lcov_branch_coverage=1
–directory 后面跟的是gcda所在目录路径,如果有多个目录就选则最大的父目录,程序会自动查找
–output-file 是生成的可视化文件目录与名称
–rc lcov_branch_coverage=1 表示开启分支覆盖率的统计
4、将info文件结果生成为html文件
执行命令:
genhtml -branch-coverage test.info

最终生成的html文件如图所示:
生成的html结果文件页面示例

清除命令

如果需要将生成的gcda文件全部清空,可以使用命令
lcov -d ./ -z

文件统计与代码屏蔽

在日常工作中,我们会遇到某些文件已经废弃或者其它原因不需要纳入统计的情况,或者源代码中某些代码我们需要屏蔽,不纳入统计,例如有些宏定义代码,会重复进行统计分支覆盖情况。

去除指定文件的统计

使用命令:–remove
在lcov命令的后面 加上 --remove 后面接info文件的路径 多个文件用空格分开
如:lcov --remove $HOME/test_code/test.info “test/test.cpp test/test2.cpp” --output-file results/test2.info
重新生成一个新的info文件 然后再统计这个新的info文件,生成html文件

屏蔽相关代码的统计

如果需要屏蔽源代码中指定的代码行,则需要修改源代码内容,在源代码内容上加上屏蔽注释,然后重新进行代码编译,这样生成的新库,在执行程序时会自动跳过 打了注释的代码,自然就不会统计进去了
标签说明:
1、多行屏蔽:在需要屏蔽的代码前面加 // LCOV_EXCL_START
在代码后面加 // LCOV_EXCL_STOP
2、单行屏蔽:直接在单行代码后面加注释 // LCOV_EXCL_LINE
3、以上两种是直接将代码去掉不统计,还有一种屏蔽方法是,代码纳入统计,只是代码内的分支不纳入统计,用法类似:
//LCOV_EXCL_BR_START // LCOV_EXCL_BR_STOP
// LCOV_EXCL_BR_LINE

标签:文件,lcov,代码,C++,编译,Linux,LCOV,统计
来源: https://blog.csdn.net/weixin_44073346/article/details/122809778