博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C/C++代码覆盖工具gcov与lcov入门
阅读量:4678 次
发布时间:2019-06-09

本文共 1622 字,大约阅读时间需要 5 分钟。

C/C++代码覆盖工具gcov与lcov入门

是一个可用于C/C++的代码覆盖工具,是的内建工具。下面介绍一下如何利用来收集代码覆盖信息。

想要用收集代码覆盖信息,需要在编译代码的时候加上这2个选项 “-fprofile-arcs -ftest-coverage”,把这个简单的程序编译一下

gcc -fprofile-arcs -ftest-coverage hello.c -o hello

编译后会得到一个可执行文件hello和hello.gcno文件,当用gcc编译文件的时候,如果带有“-ftest-coverage”参数,就会生成这个.gcno文件,它包含了程序块和行号等信息

接下来可以运行这个hello的程序

./hello 5

./hello 12

运行结束以后会生成一个hello.gcda文件,如果一个可执行文件带有“-fprofile-arcs”参数编译出来,并且运行过至少一次,就会生成。这个文件包含了程序基本块跳转的信息。接下来可以用gcov生成代码覆盖信息:

gcov hello.c

运行结束以后会生成2个文件hello.c.gcov和myfunc.c.gcov。打开看里面的信息:

-: 0:Source:myfunc.c

-: 0:Graph:hello.gcno
-: 0:Data:hello.gcda
-: 0:Runs:1
-: 0:Programs:1
-: 1:#include
-: 2:
-: 3:void test(int count)
1: 4:{
-: 5: int i;
10: 6: for (i = 1; i < count; i++)
-: 7: {
9: 8: if (i % 3 == 0)
3: 9: printf (“%d is divisible by 3 \n”, i);
9: 10: if (i % 11 == 0)
#####: 11: printf (“%d is divisible by 11 \n”, i);
9: 12: if (i % 13 == 0)
#####: 13: printf (“%d is divisible by 13 \n”, i);
-: 14: }
1: 15:}

被标记为#####的代码行就是没有被执行过的,代码覆盖的信息是正确的,但是让人去读这些文字,实在是一个杯具。不用担心,有另外一个工具叫,可以用程序解析这些晦涩的字符,最终输出成html格式的报告,很好吧!

lcov -d . -t ‘Hello test’ -o ‘hello_test.info’ -b . -c

指定lcov在当前目录“.”去找代码覆盖的信息,输出为’hello_test.info’ ,这个hello_test.info是一个中间结果,需要把它用genhtml来处理一下,genhtml是lcov里面的一个工具。

genhtml -o result hello_test.info

指定输出目录是 result。一个完整的html报告就生成了,做一个连接,把这个目录连到随便一个web server的目录下,就可以看报告了。

 

测试结果概览

具体某个文件的覆盖率

gcov和lcov基本上能满足测试过程中收集代码覆盖率信息的需求,不过有个遗憾就是gcov不能收集.so文件的代码覆盖信息。

发布于

 

    1. risewind说道:

      现在已经可以收集so的覆盖率信息了。

    2. 说道:

      gcov是非常方便,如果能统计一行的部分执行就好了。

      现在还没看到有这样的功能。
      比如
      if(a==0){a=1;}else{a=2;}
      如果只执行到a==0的条件,没执行到else部分,能表示出来部分执行就好了。

转载于:https://www.cnblogs.com/davad/p/5142429.html

你可能感兴趣的文章
杭电3466————DP之01背包(对状态转移方程的更新理解)
查看>>
算法分析常用记号
查看>>
spring mvc 返回类型
查看>>
[js高手之路] html5 canvas动画教程 - 匀速运动
查看>>
11.VS2015常用快捷键大全
查看>>
js学习总结----less常用的方法
查看>>
需求分析问卷调查及反馈结果
查看>>
当深度学习遇见自动文本摘要
查看>>
心随手动,驱动短视频热潮的引擎
查看>>
Servlet深入之初始化
查看>>
python中出现IndentationError:unindent does not match any outer indentation level错误
查看>>
<mvc:annotation-driven />与<context:annotation-config/>
查看>>
【UML】概念、关联、画画(一)
查看>>
由于空间,注定的结果——第五届山东省ACM编程比赛总结
查看>>
Android复制iPhone日期和时间选择器
查看>>
Jquery Dom节点常用操作
查看>>
深入理解正则表达式
查看>>
php学习笔记-定义常量
查看>>
七周七语言:Io Day 2
查看>>
robotframework 下对于web弹出框的处理
查看>>