gcov和lcov使用经验

转载 2012年06月05日 13:34:37

转自: http://magustest.com/blog/tag/lcov/


使用gcov和lcov做代码覆盖有一段时间了,期间走了一些弯路,算是一些经验教训。

  • gcov可以对shared object进行代码覆盖信息收集。

之前的一篇文章说过,gcov不能收集.so的代码覆盖率信息,其实这个是错的。

如果是C++程序,在CXXFLAGS中加入-fprofile-arcs -ftest-coverage 作为编译选项,并且在LDFLAGS中加入-lgcov作为链接选项。如果没有-lgcov选项编译出来的.so文件在动态加载的时候会提示类似 undefined reference to ‘__gcov_merge_add’ 或者 undefined reference to ‘__gcov_init’这样的错误。

如果是C程序,在CFLAGS中加入-fprofile-arcs -ftest-coverage 作为编译选项,也是在LDFLAGS中加入-lgcov作为链接选项,就OK了。跑测试的时候跟正常测试一样,最后把收集到的.gcda文件处理一下就能得到代码覆盖率报告

  • 用lcov处理.gcda文件的时候,在处理某些文件的时候hang了。

对于这个问题,不知道根本原因是什么,可能是那个文件的某行代码触发了bug,我对此是workaround了一下。lcov本身是一堆Perl脚本,打开它,通常在这里“/usr/bin/geninfo”,然后找到这行,注释掉

push(@gcov_options, “-a”) if ($gcov_caps->{‘all-blocks’});

  • genhtml的一个参数:-f, –frames

Use HTML frames for source code view。这样会在每个结果页的左边生成一个缩略图,review代码的时候很方便。但是,如果你的项目里面用到了一些第三方的库,而那些第三方的库没有提供完整的源代码,那么使用这个参数就会出现问题。

gd-png: fatal libpng error: Image width or height is zero in IHDR
gd-png error: setjmp returns error condition

解决方法可以是1. 尝试找一下源代码;2. 通常这些第三方库,我们都是放在一个单独的文件夹里面的,这样子用lcov处理.gcda文件的时候,可以指定目录,把这些第三方库的目录跳过去

  • genhtml的一个参数:–num-spaces NUM

默认值是8,出来的报告看着很费劲,建议换成4,如果代码有很多层,那设成2也是可以的

 Posted by magus at 11:53 Tagged with: gcov, lcov,代码覆盖
122011
 

lcov是建立在gcov之上的一个可以生成html代码覆盖率报告的工具,最近公司开始尝试引入代码覆盖来提高产品质量,lcov很好地满足了我们的需求,虽然lcov本身支持生成代码覆盖率的diff报告,但是跟我们的需求不太符合。

首先说一下我们的情况,我们有一套自动化回归测试集,可以看做是我们测试的全集。现在已经完成了基于这个回归测试集的代码覆盖率报告,这其中肯定有某些行没有被覆盖到的,如何评估这些没有被测试过的行的风险呢?最开始是DEV跟QA一起review,由开发来评估这些没有被测试过的代码。最近提出了一个新的思路,就是用Production的代码覆盖和本地回归测试的代码覆盖做一个diff,着重看一下那些在Production里面实际被执行过的代码中,有哪些是我们本地回归测试所没有覆盖的,因为这些“裸奔”的代码才是最危险的代码。

查一下文档,lcov在生成html报告的时候可以做这个事情,在genhtml的时候使用参数“–baseline-file baseline-file”,指定了这个参数以后就会在用输入的tracefile里面的counter来减去baseline-file里面的counter,完成这个减法计算以后再生成报告。可以用Local测试的数据作为basefile,两者一减,在报告里面那些cover的行,就是Production上跑到的代码而回归测试集没有能覆盖的部分。但是如果直接用的话,结果可能不是我们想要的,因为我用了genhtml这样的一个特性:“Note that when a count for a particular line in baseline-file is greater than the count in the tracefile, the result is zero.”。

举个例子,如果我们的代码被执行了若干次:

Code A B C D
Local 0 40 50 60
Production 50 50 50 50
Actual result 50 (local uncover) 10 (local uncover) 0 (covered) 0 (covered)
Expected local uncover covered covered covered

主要看第三列,B这行代码。如果在Local测试中某行代码被执行了40次,而同一行代码在Production被执行了50次,那么diff出来的结果是这行代码没有被覆盖,而实际的结果是回归测试已经覆盖到了。解决思路很简单,我们可以让Local的counter增加N倍,这个N要足够大,就能避免这种情况的发生了。当我们按照正常操作生成一个tracefile的时候,接下来就用“–add-tracefile tracefile” 来把这个tracefile的counter加上去,

lcov -a mytest.info -a mytest.info -o mytest_2x.info

lcov -a mytest_2x.info -a mytest_2x.info -o mytest_4x.info

写个shell脚本帮你干这个事情,不到半小时就能把counter增加2的N次方倍。最后以这个放大了counter的tracefile作为基线,生成的diff report

genhtml -o diffresult –num-spaces 4 –legend -b mytest_1024x.info prod.info

最终结果:

Code A B C D
Local 0 40960 51200 61440
Production 50 50 50 50
Actual result 50 (local uncover) 0 (covered) 0 (covered) 0 (covered)
Expected local uncover covered covered covered

什么样的代码最危险?没有被测试过的代码是最危险的。Production和regression test的代码覆盖率diff报告可以给我们提供一些有针对性的信息。

 Posted by magus at 16:40 Tagged with: gcov, lcov,代码覆盖
162010
 

两个PPT的主题其实都是关于代码覆盖的,那为什么分开了2个PPT呢?因为准备在两个会上讲,一个讲代码覆盖,尽量不涉及工具细节,另一个只介绍工具。

PPT写的很粗,主要靠讲,不过PPT本身的话我个人感觉一般般,但是又没有修改的动力了,就先放上来吧,有问题意见请及时给我反馈,多谢先啦。

Using gcov and lcov
Knowledge share on code coverage
 Posted by magus at 00:02 Tagged with: gcov, lcov,PPT, 代码覆盖
122010
 

gcov是一个可用于C/C++的代码覆盖工具,是gcc的内建工具。下面介绍一下如何利用gcov来收集代码覆盖信息。
想要用gcov收集代码覆盖信息,需要在gcc编译代码的时候加上这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:}

被标记为#####的代码行就是没有被执行过的,代码覆盖的信息是正确的,但是让人去读这些文字,实在是一个杯具。不用担心,有另外一个工具叫lcov,可以用程序解析这些晦涩的字符,最终输出成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的目录下,就可以看报告了。



Android SQLite 性能优化——显示使用事务

数据库是应用开发中常用的技术,在Android应用中也不例外。Android默认使用了SQLite,介绍实际项目中遇到大量操作数据时的处理方式; 以及原理;
  • 2016年11月23日 07:14

gcov 用法

简介      在这章里,我们将会探讨gcov实用程序,并且了解一下如何使用gcov来帮助测试与支持软件配置与优化。我们将会了解如何使用gcov来构建软件,并且理解他所提供的各种数据类型。最后,我们...
  • cbbbc
  • cbbbc
  • 2015-03-27 00:08:23
  • 448

覆盖率测试工具gcov & lcov使用手册

Gcov: 代码覆盖率工具 1.      编译: 编译时gcc添加编译选项“gcc-fprofile-arcs“和”–ftest-coverage”: e.g:gcc-fprofile-arcs  ...
  • kevin_ji
  • kevin_ji
  • 2016-03-14 13:32:03
  • 2647

gcov,lcov常见问题

本文转载:http://magustest.com/blog/whiteboxtesting/code-coverage-gcov-lcov/ 使用gcov和lcov做代码覆盖有一段...
  • ligengyong2010
  • ligengyong2010
  • 2015-05-20 17:21:08
  • 638

gcov和lcov的使用

1、Gcov是进行代码运行的覆盖率统计的工具,它随着gcc的发布一起发布的,它的使用也很简单,需要在编译和链接的时候加上-fprofile-arcs -ftest-coverage生成二进制文件,gc...
  • lgtnt
  • lgtnt
  • 2010-09-04 23:36:00
  • 3011

gcov和lcov

gcov是什么 gcov能做什么 如何使用 编译生成gcno与gcda 生成报告代表没有被执行过 可能的问题 生成文件失败 文件时间戳不一致 Using gcov with GCC Optimizat...
  • qingfengpapa
  • qingfengpapa
  • 2017-10-16 15:28:54
  • 137

gcov和lcov使用经验

转自: http://magustest.com/blog/tag/lcov/ 使用gcov和lcov做代码覆盖有一段时间了,期间走了一些弯路,算是一些经验教训。 gcov...
  • ThirstyBlue
  • ThirstyBlue
  • 2012-06-05 13:34:37
  • 2679

使用gcov和lcov测试代码覆盖率

gcov与 lcov简介gcovgcov是Linux下GCC自带的一个C/C++代码覆盖率分析工具,因此只要安装了gcc,就不需要再次安装了lcovlcov介绍gcov能够生成代码覆盖信息,但是不够直...
  • hyb612
  • hyb612
  • 2017-08-06 19:41:42
  • 552

gcov、lcov与genhtml 使用心得

gcc是linux平台下的C、C++ 编译器 gcov是配合gcc产生覆盖信息报告的工具; lcov是将gcov产生的报告信息,以更直观的方式显示出来工具 基本的使用方法分为4个阶段...
  • origin_lee
  • origin_lee
  • 2015-03-18 14:48:55
  • 555

GNU Toolchain —— (五)gcov与lcov入门

gcov 是一个可用于C/C++的代码覆盖工具,是gcc 的内建工具。下面介绍一下如何利用gcov 来收集代码覆盖信息。 想要用gcov 收集代码覆盖信息,需要在gcc 编译代码的时候加上这2个选项 ...
  • wind19
  • wind19
  • 2011-01-05 10:42:00
  • 3296
收藏助手
不良信息举报
您举报文章:gcov和lcov使用经验
举报原因:
原因补充:

(最多只允许输入30个字)