Linux下gcov和lcov代码覆盖率分析方法

gcov是Linux下GCC自带的一个C/C++代码覆盖率分析工具

使用方法:在gcc或者g++后面添加参数 -fprofile-arcs -ftest-coverage

注意:-fprofile-arcs -ftest-coverage必须同时在编译器和链接器上设置,(makefile里面可以加在 CFLAGS 和 LDFLAGS上),如果连接的时候出现undefined reference to `__gcov_init' 错误,则还要加上-lgocv

编译成功后运行编译好的程序,然后退出程序。程序会在当前目录下生成*.gcda文件。

然后使用 gcov *.c 或者gcov *.cpp生成代码覆盖信息,这个时候需要将原始代码文件*.cpp或者*.c放在*.gcda文件一个目录中。

完成后会生成*.c.gcov或者*.cpp.gcov文件,里面包含了代码覆盖信息。

由于*.gcov是文字模式的,linux还自带了一个lcov工具,可以帮助我们把文字的信息转换成更直观的图形表格模式。

lcov -d . -t '表格名称' -o '文件名称.info' -b . -c

此时还没完,这个指令只是输出了一个 info 的中间文件,要变成html格式的图形文件还要下面的指令:

genhtml -o 输出目录名 文件名.info

这样才会在输出目录中生成完整的html图形文件,用浏览器在文件目录中打开index文件就能看到了。

C/C++程序的代码覆盖率统计工具非常少,与JAVA相比开源免费的工具更是寥寥无几,好用又开源的简直是凤毛麟角。左挑右选最后看中了基于GCOV的LCOV作为NGINX测试的覆盖率统计工具。选择LCOV的原因很简单:一是适合GCOV是GCC配套的测试覆盖率工具;二是NGINX是纯C的程序,GCOV对纯C代码的覆盖率展现更加精确;三是LCOV作为GCOV的扩展,能够生成直观的HTML的带源码的覆盖率报表。

那么下面就来看看,怎么通过LCOV来展现NGINX测试代码覆盖率的情况。

一、下载和安装

1、LCOV的主页:http://ltp.sourceforge.net/coverage/lcov.php

2、如果你有root权限解压后直接make insall安装到系统的执行目录,然后在任意地方都可以执行LCOV工具的命令了。

3、如果你没有root或者sudo的权限,也没问题,可以直接在Makefile里定义PREFIX变量并指向拥有权限的安装目录(例如:PREFIX=/home/mylcov),然后make install安装到指定的目录,通过带路径的命令形式来使用LCOV工具的命令(例如:/home/mylcov/lcov …)。

4、GCOV无需安装,伴随着GCC和LINUX一起发行。

二、如何统计覆盖率

1、要让LCOV能最后统计并展现出覆盖率,需要在编译被测的NGINX的时候添加一些选项,从而打开GCOV的代码覆盖率支持。 编译选项:-fprofile-arcs -ftest-coverage 链接选项:-lgcov NGINX使用autoconf生成makefile,我们只需要在configure时加入以上的选项,请执行以下的命令行开启NGINX的代码覆盖率功能。

./configure–with-pcre –with-http_ssl_module –with-cc-opt=”-fprofile-arcs -ftest-coverage” –with-ld-opt=-lgcov标红加粗的部分就是前述的选项。

2、编译安装NGINX并初始化LCOV统计数据 在执行完刚才的CONFIGURE命令后,直接make 和make install就把带有统计代码覆盖的NGINX版本安装好了。这个时候会发现在源码的编译目录里有不少.gcno和.gcda文件,.gcno是覆盖率统计的路径弧长文件,.gcda是覆盖率文件。 我们接下来要做的事情是要将覆盖率的数据初始化,并且今后在每次重新统计覆盖率之前都需要进行初始化。在刚才源码的编译目录中执行lcov –d ./ -z,意思是将当前目录(./)下的gcda覆盖率文件清空,是覆盖率数据回复到空的状态。

3、启动NGINX执行各种各样的测试吧

4、测试执行完成,收集覆盖率数据 依然是在NGINX源码编译目录下执行lcov –b ./ -d ./ -c –o outputfile.info,意思是统计的相对目录是当前目录,对当前目录下的覆盖率数据进行采集,并汇总到名为outputfile.info的文件中。

5、利用汇总的数据文件生成直观的网页形式的带有代码覆盖情况的报告 在outputfile.info所在目录下执行genhtml outputfile.info,意思是利用汇总数据文件outputfile.info生成一些列的网页格式的报告。

三、LCOV的优势和弱点

LCOV基于GCOV进行测试覆盖率的统计,LCOV本身也是为了LINUX内核测试覆盖率而生的,因此对于LINUX下GCC编译的程序有很好的支持,并且通过html形式的报告展现给测试人员,结果非常直观并且利于分析。LCOV测试的覆盖率的种类也比较全面,行覆盖、分支覆盖、函数覆盖。 但是也有令人遗憾的地方对于以so形式存在的动态链接库文件不能给予支持,对于完全C++编写的代码的覆盖率统计结果是以C++代码被编译器处理过后的C 形式来统计的,所以覆盖的数据和实际代码展示页中的情况略有出入,但是仍然可以作为测试覆盖率的参考。 总体来说LCOV对于NGINX这样的纯C的静态编译的程序是能够非常好的满足代码覆盖率统计的需求的。

Linux下gcov和lcov代码覆盖率分析(C/C++覆盖率在NGINX测试中的应用)相关推荐

  1. linux下的CPU、内存、IO、网络的压力测试

    linux下的CPU.内存.IO.网络的压力测试 要远程测试其实很简单了,把结果放到一个微服务里直接在web里查看就可以了,或者同步到其他服务器上 一.对CPU进行简单测试: 1.通过bc命令计算特别 ...

  2. Linux下c/c++项目代码覆盖率的产生方法

    最近做了一系列的单元测试相关的工作,除了各种规范及测试框架以外,讨论比较多的就是关于代码覆盖率的产生,c/c++与其他的一些高级语言或者脚本语言相比较而言,例如 Java..Net和php/pytho ...

  3. 【驱动】linux下I2C驱动架构全面分析

    I2C 概述 I2C是philips提出的外设总线. I2C只有两条线,一条串行数据线:SDA,一条是时钟线SCL ,使用SCL,SDA这两根信号线就实现了设备之间的数据交互,它方便了工程师的布线. ...

  4. linux下查看cpu负载及分析

    linux下查看cpu负载有两个命令可以看:uptime 和 top. 其中load average的三个值分别表示1分钟.5分钟.15分钟的CPU负载情况,是运维需要经常关注的 那么怎么确定这些值展 ...

  5. linux下I2C驱动架构全面分析

    I2C 概述 I2C是philips提出的外设总线. I2C只有两条线,一条串行数据线:SDA,一条是时钟线SCL ,使用SCL,SDA这两根信号线就实现了设备之间的数据交互,它方便了工程师的布线. ...

  6. LINUX 下的逆向 用 IDA 分析,样本逆向中系统调用的识别方法

    作者:RootKiter 无符号表情况下的逆向 LINUX平台下的程序,可以通过strip程序进行精简,精简过的可执行文件会变小,同时又丝毫不影响执行效率.但这种情况会给程序逆向带来困扰.由于没有符号 ...

  7. linux如何拿到文件的返回值,linux 下read函数返回值分析

    原文出处:http://blog.chinaunix.net/space.php?uid=20558494&do=blog&id=2803003 read函数是Linux下不带缓存的文 ...

  8. linux io 分析,Linux 下的I/O性能分析 iotop

    Linux下的IO统计工具如iostat, nmon等大多数是只能统计到per设备的读写情况, 如果你想知道每个进程是如何使用IO的就比较麻烦. 当然如果你会systemtap, 或者blktrace ...

  9. linux keepalived 脚本,Linux下安装Keepalived及原理分析

    1.keepalived 原理 1.keepalived是什么 keepalived是集群管理中保证集群高可用的一个服务软件,其功能类似于heartbeat,用来防止单点故障. 2.keepalive ...

最新文章

  1. html网页文件的主体标记,HTML的填空题:1.HTML文件中网页文件的主体标记是_________,标记页面标题的标记是_____________。如题 谢...
  2. 语雀图片与七牛云之间的迁移同步
  3. 《网站分析师实战指南》一1.4 进入实战之路
  4. 今天是星期四,不知道是不是由于太想家了,每天晚上做梦遇到家人
  5. python 数学符号读法大全_math_数字与数学 | Numeric Mathematical_Python_参考手册_非常教程...
  6. nyoj239月老的难题
  7. Android Studio 常见插件收藏
  8. HTML5 学习总结(二)——HTML5新增属性与表单元素
  9. Android内容提供者(群发短信)
  10. python爬虫爬取搜狗微信文章(代理池+re从跳转链接中找到真实URL问题)
  11. c语言遥控器程序设计,基于51单片机的红外线遥控器解码程序设计
  12. Windows安装Nginx并设置开机自启
  13. 重启docker时:Error starting userland proxy: listen tcp 0.0.0.0:9000: listen: address already in use
  14. 如何使用NVivo进行定性研究?
  15. 电脑连接上WiFi但是上不了网
  16. FigDraw 21. SCI文章中绘图之三维散点图 (plot3D)
  17. 【易语言助手插件】IDE 鼠标手势1.2 原汁原味移植浏览器手势
  18. 终于搞定Direct3D中视频播放
  19. MySQL 多实例部署 xtrabackup备份与恢复
  20. uniapp使用百度语音识别语音转文字

热门文章

  1. 实用工具类库java.util
  2. ActiveX (.ocx)的写法,及在IE里调用
  3. Android数据存储之SQLite的操作
  4. 《区块链原理、设计与应用》一1.4 潜在的商业价值
  5. Linux定时备份数据到百度云盘
  6. python itertools product函数
  7. 程序注释应该注意的地方
  8. 卡特兰数Catalan Number
  9. ip classles
  10. 安装php出现 “make: *** [ext/gd/libgd/gd_jpeg.lo] Error ”