ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

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

2022-02-07 17:04:33  阅读:226  来源: 互联网

标签:文件 lcov 代码 C++ 编译 Linux LCOV 统计


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有