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

来源:互联网 发布:淘宝法律专业自考通 编辑:程序博客网 时间:2024/05/20 05:26


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



原创粉丝点击