gcov lcov 覆盖c/c++项目入门


1、分别执行如下两条命令,就自动完成 gcov 和 lcov 的安装

$ sudo apt-get install gcov
$ sudo apt-get install lcov


2、这里举斐波那契数列的一个程序为例

1 #include <stdio.h>
 2 
 3 int fibonacci(int n);
 4 
 5 int main ()
 6 {
 7    int fib;
 8    int n;
 9 
10    for (n = 0; n <= 41; n++) {
11       fib = fibonacci(n);
12       printf("fibonnaci(%d) = %d\n", n, fib);
13    }
14 
15    return 0;
16 }
17 
18 int fibonacci(int n)
19 {
20    int fib;
21    if (n <= 0) {
22       fib = 0;
23    }
24    else if (n == 1) {
25       fib = 1;
26    }
27    else {
28       fib = fibonacci(n -1) + fibonacci(n - 2);
29    }
30 
31    return fib;
32 }

GCOV 用于简单项目的覆盖

1. 编译

$ gcc -c fib.c -ftest-coverage -fprofile-arcs

 

除了 fib.o 之外,还生成了 fib.gcno 的话,成功了

.gcno是由-ftest-coverage产生的,它包含了重建基本块图和相应的块的源码的行号的信息。

2. 链接

$ gcc fib.o -o fib


回归正题,链接的时候下面三条任选一个执行即可

$ gcc fib.o -o fib --coverage
$ gcc fib.o -o fib -lgcov
$ gcc fib.o -o fib -fprofile-arcs

应该会正常生成 fib

3. 运行程序 fib

$ ./fib

 

会生成 .gcda 文件,.gcda是由加了-fprofile-arcs编译参数的编译后的文件运行所产生的,它包含了弧跳变的次数和其他的概要信息。

4. 生成 gcov 报告

$ gcov fib.c

 

生成的 fib.c.gcov 文件中就包含了代码覆盖的统计数据,数字代表了每行代码被执行的次数及行号,相信这个不难分析



-:    0:Source:fib.c
         -:    0:Graph:fib.gcno
         -:    0:Data:fib.gcda
         -:    0:Runs:1
         -:    0:Programs:1
         -:    1:#include <stdio.h>
         -:    2:
         -:    3:int fibonacci(int n);
         -:    4:
         1:    5:int main ()
         -:    6:{
         -:    7:   int fib;
         -:    8:   int n;
         -:    9:
        43:   10:   for (n = 0; n <= 41; n++) {
        42:   11:      fib = fibonacci(n);
        42:   12:      printf("fibonnaci(%d) = %d\n", n, fib);
         -:   13:   }
         -:   14:
         1:   15:   return 0;
         -:   16:}
         -:   17:
1402817422:   18:int fibonacci(int n)
         -:   19:{
         -:   20:   int fib;
1402817422:   21:   if (n <= 0) {
 267914296:   22:      fib = 0;
         -:   23:   }
1134903126:   24:   else if (n == 1) {
 433494436:   25:      fib = 1;
         -:   26:   }
         -:   27:   else {
 701408690:   28:      fib = fibonacci(n -1) + fibonacci(n - 2);
         -:   29:   }
         -:   30:
1402817422:   31:   return fib;
         -:   32:}
         -:   33:

1. 汇总覆盖率数据,使用已经生成的 .gcno .gcda 文件生成覆盖率数据

$ lcov -c -o fib.info -d .

 

简单解释一下三个选项

-c: lcov 的一个操作,表示要去捕获覆盖率数据

-o: 输出文件

-d: .gcno .gcda 所在的文件夹,注意这里有个“.”,是从当前文件夹中获取数据的

问题又来了,开始在 lcov 的过程中,碰到 Negative length 的问题,顺着提示找到 lcov 源码中的一处 $(length) ,之后并没有头绪为什么会是负值传入的,于是根据 sourceforge 上面的地址,发了一封邮件询问了一下,回信意思是我使用的 gcc 版本为 4.7.2,需要 lcov 1.10+ 版本支持,使用 1.09 或更低版本的 lcov 会出现这样的问题。于是到以下地址去下载了最新的 lcov

http://ltp.sourceforge.net/coverage/lcov.php

在 lcov 1.10 的 release notes 中写明了对 gcc 4.7+ 提供了支持。

2. 生成 html 格式的报告

$ genhtml fib.info -o fib_result

 

genhtml 是安装 lcov 时附带的,使用上面产生的 .info 文件生成报告,存放于 fib_result 文件夹中

没错,这里的报告并不只是一个文件,有好多存放在你 -o 指定的目录下,生成之后进入 fib_result 就可以看见念想很久的 index.html 了

这里再分享一下怎么从 terminal 用浏览器打开网页:

$ firefox index.html



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值