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

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的静态编译的程序是能够非常好的满足代码覆盖率统计的需求的。

猜你喜欢

转载自blog.csdn.net/ctrigger/article/details/89392862