Chinaunix首页 | 论坛 | 博客
  • 博客访问: 157652
  • 博文数量: 113
  • 博客积分: 2070
  • 博客等级: 大尉
  • 技术积分: 1377
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-18 09:13
文章分类

全部博文(113)

文章存档

2013年(1)

2012年(3)

2011年(8)

2010年(8)

2009年(31)

2008年(62)

我的朋友

分类: LINUX

2010-05-07 10:50:46

   Linux 下的代码覆盖率检查工具 gcov lcov 昨天试了试,遇到奇怪的问题
为各位看官方便,先把问题背景描述一下,下面节选网上的一段介绍 “
 

一、关于gcov工具
gcov伴随gcc 发布。gcc编译加入-fprofile-arcs -ftest-coverage 参数生成二进制程序,执行测试用例生成代码覆盖率信息。
1、如何使用gcov
用GCC编译的时候加上-fprofile-arcs -ftest-coverage选项,链接的时候也加上。
fprofile-arcs参数使gcc创建一个程序的流图,之后找到适合图的生成树。只有不在生成树中的弧被操纵(instrumented):gcc添加了代码来清点这

些弧执行的次数。当这段弧是一个块的唯一出口或入口时,操纵工具代码(instrumentation code)将会添加到块中,否则创建一个基础块来包含操纵

工具代码。gcov主要使用.gcno和.gcda两个文件。
.gcno是由-ftest-coverage产生的,它包含了重建基本块图和相应的块的源码的行号的信息。
.gcda是由加了-fprofile-arcs编译参数的编译后的文件运行所产生的,它包含了弧跳变的次数和其他的概要信息。
Gcov执行函数覆盖、语句覆盖和分支覆盖。

举个例子,程序代码由main.c和tmp.c两个文件组成,编译、链接、运行程序
编译:gcc -fprofile-arcs -ftest-coverage -o myapp main.c tmp.c
运行:./myapp
然后 输入
命令: gcov main.c,gcov tmp.c

这个时候当前目录下有了新的文档main.c.gcov,和tmp.c.gcov

……

 
   现在说我们的问题,加了-fprofile-arcs -ftest-coverage 选项编译后运行,但不是没有.gcda 就是缺少 .gcno 总不能一次全部输出,不过偶尔会出全。几经周折发现了问题的规律,特记录如下: 每次运行都需要重新编译 .o文件,否则就会出现上面描述的问题,其机理尚不清楚,解决办法,只能每次运行程序前先 清理掉 .o文件 然后编译,再运行即可输出 gcno ,gcda 供gcov使用。
 
  已找到问题是:gcda 文件只有在新程序执行后才生成,上次有脚本有误(可能是执行的不是新程序)导致了错误的判断。
 
note : lcov -z 会清除 .gcda 文件
 
 
参考  lcov 的使用方式
 

LCOV README 文件(翻译)

作者:终南   <>

-------------------------------------------------
- README file for the LTP GCOV extension (LCOV) -
- Last changes: 2008-11-17                      -
-------------------------------------------------

说明
-----------
GCOV 是一个 GNU 工具,当运行一个特定的测试用例后,通过GCOV 可以查看一个程序的那些代码被实际执行。 LCOV 是GCOV的一个扩展工具。该扩展由一套 PERL 脚本组成,基于 GCOV 的文本式输出来实现以下增强的功能:


    * 基于 HTML 的输出:使用条形图和不同的颜色来表示。

    * 支持大型项目:信息汇总页面提供三个层次的代码覆盖细节信息:目录视图、文件视图和源代码视图,允许快速浏览代码覆盖数据。

LCOV 最初为支持 Linux 内核代码覆盖评估而设计,但是同样可用于测量标准用户空间应用程序的代码覆盖率。


README 目录
-----------------------
1. 相关文件
2. 安装 LCOV
3. 如何访问内核代码覆盖数据的示例
4. 如何访问用户空间应用程序代码覆盖数据的示例
5. 问题和评论



1. 相关文件
------------------
README             - 该 README 文件
CHANGES           - 各发行版本的更新列表
bin/lcov                - 收集 LCOV 代码覆盖数据的工具
bin/genhtml         - 根据 LCOV 数据生成 HTML 输出的工具
bin/gendesc        - 创建说明文件的工具,同时也被 genhtml 使用
bin/geninfo         - 内部工具(创建 LCOV 数据文件)
bin/genpng          - 内部工具(创建源代码文件的 png 图形汇总信息)
bin/install.sh        - 内部工具(安装和卸载)
descriptions.tests - LTP 软件包的测试说明文件,被 gendesc 使用
man                      - 放置 LCOV 使用工具的 man 页面的目录
example               - 用来演示 LCOV 的示例文件目录
lcovrc                  - LCOV 配置文件
Makefile               - Makefile 文件,包含 'install' 和 'uninstall' 目标


2. 安装 LCOV
------------------
可以从以下页面选择下载 LCOV 软件包,RPM 或 tarball 形式:
    


为安装 tarball,将软件包解压到一个目录然后运行:

make install

也可以使用匿名 CVS 来获取最新版本(但可能是不稳定的版本):

cvs -d:pserver:anonymous@ltp.cvs.sourceforge.net:/cvsroot/ltp login

(当询问密码时,按回车即可)

cvs -z3 -d:pserver:anonymous@ltp.cvs.sourceforge.net:/cvsroot/ltp export -D now utils

切换到 utils/analysis/lcov 目录然后输入:

make install


3. 如何访问内核代码覆盖数据的示例
---------------------------------------------------
前提条件:从以下页面下载并安装 gcov-kernel 软件包:



将最终的 gcov 内核模块文件复制到 system wide modules 目录或者 PERL 脚本所在目录。以 root 身份, 执行:

a) 重置计数器

     lcov --zerocounters

b) 收集当前代码覆盖状态到一个文件

     lcov --capture --output-file kernel.info

c) 获取 HTML 输出

     genhtml kernel.info

使用 web 浏览器打开 index.html 文件查看代码覆盖结果。


4. 如何访问用户空间应用程序代码覆盖数据的示例
---------------------------------------------------------------------
前提条件:使用 GCC 以 -fprofile-arcs 和-ftest-coverage 选项编译程序。假设编译目录名称为 "appdir",然后执行:

a) 重置计数器

     lcov --directory appdir --zerocounters

b) 收集当前代码覆盖状态到一个文件(应用程序启动和停止至少一次后,该命令才能正常工作)

     lcov --directory appdir --capture --output-file app.info

c) 获取 HTML 输出

     genhtml app.info

使用 web 浏览器打开 index.html 文件查看代码覆盖结果。


5. 问题和评论
-------------------------
参见软件包中的 man 页面,以便获取如何使用 LCOV 工具的详细信息。

有关这些工具的问题和评论,请通过电子邮件联系,LTP 电子邮件列表:。

 原文地址 http://hi.baidu.com/li_zhongnan/blog/item/8a386bca49b4d241f31fe737.html
阅读(12997) | 评论(0) | 转发(0) |
0

上一篇:FA 地图包 700m

下一篇:4.10 mod

给主人留下些什么吧!~~