文档章节

c++代码覆盖率工具使用

o
 osc_wws45aot
发布于 2019/08/21 11:14
字数 1580
阅读 21
收藏 0

钉钉、微博极速扩容黑科技,点击观看阿里云弹性计算年度发布会!>>>

<div class="post"> <div class="postTitle"> <h1> <a id="cb_post_title_url" class="postTitle2" href="https://www.cnblogs.com/bugutian/p/5929530.html">代码覆盖工具(gcov、lcov)的使用</a> </h1> </div>

<div id="cnblogs_post_body" class="blogpost-body "> <h2>一、安装</h2> <p>gcov:是随gcc一起发布的,并不需要独立安装;<br>lcov:其他博客说是随ltp发布的,结果下载下ltp之后编译了10多分钟,最后也没见lcov,最后到sourceforge下载了lcov单独的代码:</p> <div class="cnblogs_code"> <pre><span style="color: #0000ff;">wget</span> http:<span style="color: #008000;">//</span><span style="color: #008000;">ncu.dl.sourceforge.net/project/ltp/Coverage Analysis/LCOV-1.12/lcov-1.12.tar.gz</span> <span style="color: #0000ff;">tar</span> -zxvf lcov-<span style="color: #800080;">1.12</span>.<span style="color: #0000ff;">tar</span><span style="color: #000000;">.gz </span><span style="color: #0000ff;">make</span> <span style="color: #0000ff;">make</span> <span style="color: #0000ff;">install</span></pre> </div> <h2>二、使用</h2> <p>以hello.c为例</p> <div class="cnblogs_code" onclick="cnblogs_code_show('670a7778-bfd2-48f7-ad50-568a912a481e')"><img id="code_img_closed_670a7778-bfd2-48f7-ad50-568a912a481e" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" style="display: block;"><img id="code_img_opened_670a7778-bfd2-48f7-ad50-568a912a481e" class="code_img_opened" style="display: none;" onclick="cnblogs_code_hide('670a7778-bfd2-48f7-ad50-568a912a481e',event)" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt=""> <div id="cnblogs_code_open_670a7778-bfd2-48f7-ad50-568a912a481e" class="cnblogs_code_hide" style="display: none;"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <pre>#include&lt;stdio.h&gt;

<span style="color: #0000ff;">int</span> main(<span style="color: #0000ff;">int</span> argc,<span style="color: #0000ff;">char</span>*<span style="color: #000000;"> argv[]) { </span><span style="color: #0000ff;">if</span>(argc><span style="color: #800080;">1</span><span style="color: #000000;">) printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">AAAA\n</span><span style="color: #800000;">"</span><span style="color: #000000;">); </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">BBB\n</span><span style="color: #800000;">"</span><span style="color: #000000;">); </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">; }</span></pre>

<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div> <span class="cnblogs_code_collapse" style="display: inline;">View Code</span></div> <p><strong>#&nbsp;gcc -fprofile-arcs -ftest-coverage hello.c -o hello &nbsp;</strong> &nbsp; &nbsp; (编译时候加两个参数:-fprofile-arcs -ftest-coverage,&nbsp;此时会生成:hello.gcno)</p> <p><strong>#&nbsp;./hello &nbsp;</strong>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (此时会生成:&nbsp;hello.gcda,&nbsp;hello.gcno和hello.gcda是gcov引用的关键文件)</p> <p><strong>#&nbsp;gcov hello.c &nbsp;</strong>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(gcov根据上面的文件生成了:hello.c.gcov,就是代码覆盖信息,但看起来并不直观)</p> <div class="cnblogs_code" onclick="cnblogs_code_show('8143d9d8-be10-4a55-93a8-02db02f7580c')"><img id="code_img_closed_8143d9d8-be10-4a55-93a8-02db02f7580c" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" style="display: none;"><img id="code_img_opened_8143d9d8-be10-4a55-93a8-02db02f7580c" class="code_img_opened" style="" onclick="cnblogs_code_hide('8143d9d8-be10-4a55-93a8-02db02f7580c',event)" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt=""> <div id="cnblogs_code_open_8143d9d8-be10-4a55-93a8-02db02f7580c" class="cnblogs_code_hide" style="display: block;"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <pre>[root@localhost gcov2]# <span style="color: #0000ff;">cat</span><span style="color: #000000;"> hello.c.gcov </span>-: <span style="color: #800080;">0</span><span style="color: #000000;">:Source:hello.c </span>-: <span style="color: #800080;">0</span><span style="color: #000000;">:Graph:hello.gcno </span>-: <span style="color: #800080;">0</span><span style="color: #000000;">:Data:hello.gcda </span>-: <span style="color: #800080;">0</span>:Runs:<span style="color: #800080;">1</span> -: <span style="color: #800080;">0</span>:Programs:<span style="color: #800080;">1</span> -: <span style="color: #800080;">1</span>:#include&lt;stdio.h&gt; -: <span style="color: #800080;">2</span><span style="color: #000000;">: </span><span style="color: #800080;">1</span>: <span style="color: #800080;">3</span>:<span style="color: #0000ff;">int</span> main(<span style="color: #0000ff;">int</span> argc,<span style="color: #0000ff;">char</span>*<span style="color: #000000;"> argv[]) </span>-: <span style="color: #800080;">4</span><span style="color: #000000;">:{ </span><span style="color: #800080;">1</span>: <span style="color: #800080;">5</span>: <span style="color: #0000ff;">if</span>(argc&gt;<span style="color: #800080;">1</span><span style="color: #000000;">) #####: </span><span style="color: #800080;">6</span>: printf(<span style="color: #800000;">"</span><span style="color: #800000;">AAAA\n</span><span style="color: #800000;">"</span><span style="color: #000000;">); </span>-: <span style="color: #800080;">7</span>: <span style="color: #0000ff;">else</span> <span style="color: #800080;">1</span>: <span style="color: #800080;">8</span>: printf(<span style="color: #800000;">"</span><span style="color: #800000;">BBB\n</span><span style="color: #800000;">"</span><span style="color: #000000;">); </span><span style="color: #800080;">1</span>: <span style="color: #800080;">9</span>: return <span style="color: #800080;">0</span><span style="color: #000000;">; </span>-: <span style="color: #800080;">10</span>:}</pre> <div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div> <span class="cnblogs_code_collapse" style="display: none;">View Code</span></div> <p><strong>#&nbsp;lcov -d . -t 'Hello test' -o 'hello_test.info' -b . -c &nbsp; &nbsp;</strong> &nbsp; &nbsp; &nbsp;(我们借助lcov对hello.c.gcov进行改造,可以看见生成了hello_test.info)</p> <p><strong>#&nbsp;genhtml -o result hello_test.info &nbsp; &nbsp;</strong>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (生成了result文件夹,借助web服务器,我们就可以很直观的看到结果了)</p> <p>用浏览器打开index.html,下面是hello.c.gcov.html的信息,着色过的代码,看起来方便多了。</p> <p><img src="https://images2015.cnblogs.com/blog/753880/201610/753880-20161003193512207-2016285688.png" alt=""></p> <h2>三、遇到的问题及解决方案</h2> <h3>1.Can't locate Digest/MD5.pm</h3> <p style="margin-left: 30px;">错误信息:</p> <p style="margin-left: 60px;">[root@bogon gcov]# lcov -d . -t 'Hello test' -o 'hello_test.info' -b . -c<br>Capturing coverage data from .<br>Can't locate Digest/MD5.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/bin/geninfo line 57.<br>BEGIN failed--compilation aborted at /usr/bin/geninfo line 57.</p> <p style="margin-left: 30px;">解决方法</p> <p style="margin-left: 60px;">perl -MCPAN -e 'install Digest::Perl::MD5'</p> <p style="margin-left: 60px;">如果还不行,那就:</p> <p style="margin-left: 60px;">perl -MCPAN -e 'install Digest::MD5'</p> <p style="margin-left: 60px;">如果报少CPAN的那就先yum install perl-CPAN,然后再执行上面的命令。</p> <h3>2.&nbsp;geninfo: ERROR</h3> <p style="margin-left: 30px;">错误信息:</p> <p style="margin-left: 60px;">Scanning . for .gcda files ...<br>Found 1 data files in .<br>Processing hello.gcda<br>geninfo: ERROR: /home/test/gcov/hello.gcno: reached unexpected end of file</p> <p style="margin-left: 30px;">解决方法:</p> <p style="margin-left: 60px;">把lcov-1.9及以下的版本换成lcov-1.9以上的版本。本文用的是lcov-1.12</p> <h2>四、参考地址:</h2> <p><a href="http://blog.csdn.net/jiayanhui2877/article/details/8727193" target="_blank">http://blog.csdn.net/jiayanhui2877/article/details/8727193</a></p> <p><a href="http://blog.csdn.net/21cnbao/article/details/40268617" target="_blank">http://blog.csdn.net/21cnbao/article/details/40268617</a></p> <p><a href="http://stackoverflow.com/questions/4844188/c-using-gcov-and-lcov-problem" target="_blank">http://stackoverflow.com/questions/4844188/c-using-gcov-and-lcov-problem</a></p> <p><a href="http://www.cnblogs.com/turtle-fly/archive/2013/01/09/2851474.html" target="_blank">http://www.cnblogs.com/turtle-fly/archive/2013/01/09/2851474.html</a></p> <p><a href="http://blog.csdn.net/maray/article/details/40401577" target="_blank">http://blog.csdn.net/maray/article/details/40401577</a>&nbsp; &nbsp;(此文说明了gcov的原理)</p> <p>&nbsp;</p> </div>

上一篇: vue动态属性
下一篇: C#中执行cmd命令
o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
软件工程第2次作业——Visual Studio 2017下基于C/C++的VSTS单元测试实践

Write one minute, test all day long. 环境确定 IDE:Microsoft Visual Studio 2017 Community语言:C++单元测试工具:VSTS IDE 此处使用Visual Studio 2017 Community作为开发环境,安装V......

osc_u4dvv5qa
2019/04/11
4
0
关于单元测试工具的比较

本人目前正在学单元测试方面的知识,也使用了几个工具Cppunit,gtest,cxxunit,还有vs2008自带的单元测试功能。感觉cppunit时间久矣,用的人也越来越少了,gtest比cppunit用起来简单一点,有...

reme
2011/07/12
1.9K
1
Parasoft C/C++test更新至v10.4.2版本,静态分析性能增强!

Parasoft C/C++test是针对 C/C++ 开发的综合性代码质量保障工具,有效提高开发团队工作效率和软件质量。1月29日,MISRA和AUTOSAR联盟宣布合并两项最受欢迎的安全关键C ++开发编码标准,澄清了...

mnrssj
2019/04/26
391
0
软工实践寒假作业(2/2)

这个作业属于哪个课程 2020春|S班(福州大学) 这个作业要求在哪里 寒假作业(2/2) 这个作业的目标 1.学习使用github<br />2.制定代码规范<br />3.开发一个疫情统计程序<br />4.给出此次作业的...

osc_8g67o6g0
02/17
2
0
Cantata9.0 | 全 新 功 能

Cantata 9.0,从2019年10月开始正式发布,它是一个重要的具有全新功能的新版本。此版本引入了对测试驱动开发(TDD)的支持,并增强了Cantata的AutoTest功能,为C ++代码提供了自动测试生成技...

旋极科技
2019/11/07
24
0

没有更多内容

加载失败,请刷新页面

加载更多

VB语言基础重要知识点12

我们课程,我们做一些针对于考试的简要讲解。 一、有关考试的几个问题 首先,提问:考试最重要的是什么? 答案其实很简单:得分!!!!! 想要得分,就要做到基本的保存。 保存哪些文件呢?...

刘金玉编程
2019/10/30
3
0
全网最全JAVA、Python电子书!限时领取,过时不候!

给大家整理了最全的入门+进阶书籍!!! 免费领取,无套路! 加微信发送“电子书” 秒通过,秒发资源! 本文分享自微信公众号 - Python进击者(JAVAandPythonJun)。 如有侵权,请联系 supp...

kuls
01/16
18
0
原创356--免费还是付费

最近得有一个星期,被一个录屏软件(record it)烦到了,本来免费版可以无限制录制,只能720p,GIF不支持,高清不支持,没有剪辑功能。 之前调研了好几种,用起来还是这个方便,就一直用了。...

八音弦
04/24
14
0
数字IC技术讨论群,设计和验证、前端和后端,总有你感兴趣的话题。快满了,需要的抓紧加入。

本文分享自微信公众号 - 白山头讲IC(gray_mount)。 如有侵权,请联系 support@oschina.cn 删除。 本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。...

白山头
04/29
5
0
how to install mongodb in centos7

[root@xtwj88 ~]# cat /etc/yum.repos.d/mongodb-org-4.2.repo [mongodb-org-4.2]name=MongoDB Repositorybaseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86......

qwfys
36分钟前
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部