网络上php代码的覆盖率统计特别多,C/C++的不多见,大概是因为c/C++的收费?不知道= =
感谢原作者,原微博地址:http://www.cnblogs.com/turtle-fly/archive/2013/01/09/2851474.html
http://ltp.sourceforge.net/coverage/lcov.php demo
主要操作是:1 用gcov完成对c/c++文件的覆盖;2 通过lcov生成覆盖率报告;3 集成到jenkins的自动化case(需要自己做)
本章只写最简单的应用:编译单个c文件,生成lcov报告
一 搭建环境
我是直接在linux下运行程序,因此只需安装gcov和lcov环境即可
-
安装 C++ 编译环境
- yum list gcc-c++
-
gcc-c++.x86_64
- rpm -q gcc-c++.x86_64 检查,若有该安装包则无需安装
- 若无则 yum list gcc-c++.x86_64
-
vim 一个cpp文件
- ```
include
int main()
{
std::cout << "Hello Wolrd!" << std::endl;
return 0;
}
```- 编译为可执行文件 g++ HelloWorld.cpp -o 1.c
- 执行 ./1.c 即可
-
安装 gcov 环境
- 惭愧我服务器上有,所以没有安装。版本如下:gcov -v(跟gcc绑定的)
-
安装lcov环境:https://sourceforge.net/projects/ltp/ 可下载不同版本
- ```
cd /usr/local
wget http://sourceforge.net/projects/ltp/files/Coverage%20Analysis/LCOV-1.12/lcov-1.12.tar.gz
tar -xzvf lcov-1.12.tar.gz
cd lcov-1.12
make install
lcov -v 查看版本:lcov: LCOV version 1.12 即安装成功不需要编译,直接安装。lcov, gendesc, genhtml, geninfo, genpng将被安装到/usr/bin目录。
<span style="line-height: 1.5"><span style="font-size: 18px; background-color: rgba(255, 255, 0, 1)">**二 编写一个简单的c文件**</span>。文件名 fib.c(斐波那契数列)</span>
1 #include
2 int fibonacci(int n);
3
4 int main ()
5 {
6 int fib;
7 int n;
8
9 for (n = 0; n <= 10; n++) {
10 fib = fibonacci(n);
11 printf("fibonnaci(%d) = %dn", n, fib);
12 }
13
14 return 0;
15 }
16
17 int fibonacci(int n)
18 {
19 int fib;
20 if (n <= 0) {
21 fib = 0;
22 }
23 else if (n == 1) {
24 fib = 1;
25 }
26 else {
27 fib = fibonacci(n -1) + fibonacci(n - 2);
28 }
29
30 return fib;
31 }
<span style="font-size: 18px">**<span style="background-color: rgba(255, 255, 0, 1)">三 gcov覆盖代码</span>**</span>
1. 编译:<span style='font-family: "Courier New"; font-size: 12px; line-height: 1.5'>gcc -c fib.c -ftest-coverage -fprofile-arcs</span>
<span style='font-family: "Courier New"; font-size: 12px; line-height: 1.5'>检查发现生成了fib.gcno和fib.o文件,即正确</span>
<span style='font-family: "Courier New"; font-size: 12px; line-height: 1.5'>.gcno由-ftest-coverage产生,包含了重建基本块图和相应的块的源码的行号的信息。</span>
2 链接:以下三者择一即可,生成可执行文件fib
gcc fib.o -o fib --coverage //我用的这个
gcc fib.o -o fib -lgcov
gcc fib.o -o fib -fprofile-arcs
3 运行fib:.<span style='font-family: "courier new", courier'>/fib</span>
生成gcda文件,.gcda是由加了-fprofile-arcs编译参数的编译后的文件运行所产生的,它包含了弧跳变的次数和其他的概要信息。见附1
4 生成gcov报告:<span style='font-family: "courier new", courier'>gcov fib.c</span>
<span style='font-family: "courier new", courier'>生成的fib.c.gcov文件包含了代码覆盖的统计数据,数字代表每行代码被执行的次数及行号。</span><span style='font-family: "courier new", courier'></span>
1 -: 0:Source:fib.c
2 -: 0:Graph:fib.gcno
3 -: 0:Data:fib.gcda
4 -: 0:Runs:1
5 -: 0:Programs:1
6 -: 1:#include
7 -: 2:
8 -: 3:int fibonacci(int n);
9 -: 4:
10 1: 5:int main ()
11 -: 6:{
12 -: 7: int fib;
13 -: 8: int n;
14 -: 9:
15 12: 10: for (n = 0; n <= 10; n++) {
16 11: 11: fib = fibonacci(n);
17 11: 12: printf("fibonnaci(%d) = %dn", n, fib);
18 -: 13: }
19 -: 14:
20 1: 15: return 0;
21 -: 16:}
22 -: 17:
23 453: 18:int fibonacci(int n)
24 -: 19:{
25 -: 20: int fib;
26 453: 21: if (n <= 0) {
27 89: 22: fib = 0;
28 -: 23: }
29 364: 24: else if (n == 1) {
30 143: 25: fib = 1;
31 -: 26: }
32 -: 27: else {
33 221: 28: fib = fibonacci(n -1) + fibonacci(n - 2);
34 -: 29: }
35 -: 30:
36 453: 31: return fib;
37 -: 32:}
man
<span style="font-size: 18px">**<span style="background-color: rgba(255, 255, 0, 1)">四 lcov整理覆盖率数据</span>**</span>
1. 使用已生成的.gcon .gcda文件生成覆盖率数据fib.info文件<span style='font-family: "courier new", courier'>lcov -c -o fib.info -d .</span>
<span style='font-family: "courier new", courier'>其中:-c lcov的操作,表示要去捕获覆盖率数据</span>
<span style='font-family: "courier new", courier'>-o 输出文件,后面跟目标文件</span>
<span style='font-family: "courier new", courier'>-d 源文件.gcno .gcda所在文件夹,此处为'.'意为当前文件夹</span>
[mobdev@ip-*** gtest]$lcov -c -o fib.info -d .<br></br>Capturing coverage data from .<br></br>Found gcov version: 4.8.3<br></br>Scanning . for .gcda files ...<br></br>Found 1 data files in .<br></br>Processing fib.gcda<br></br>Finished .info-file creation //表示成功
<span style="line-height: 1.5">2. 生成html格式的报告:<span style='font-family: "courier new", courier'>genhtml fib.info -o fib_result</span></span>
<span style="line-height: 1.5"><span style='font-family: "courier new", courier'>即将文件fib.info生成html输出到fig_result文件夹内</span></span><span style="line-height: 1.5"><span style='font-family: "courier new", courier'></span></span>
[mobdev@ip- gtest]$genhtml fib.info -o fib_result
Reading data file fib.info
Found 1 entries.
Found common filename prefix "cppTest"
Writing .css and .png files.
Generating output.
Processing file gtest/fib.c
Writing directory view page.
Overall coverage rate:
lines......: 100.0% (12 of 12 lines) //代码逻辑行覆盖率
functions..: 100.0% (2 of 2 functions)//代码方法覆盖率
3 压缩文件下载到windows系统,并打开查看网页版
tar cvf fib_result.tar.gz fib_result/
sz fib_result.tar.gz //下载windows路径
在windows路径下,解压tar.gz文件,进入路径,在浏览器打开index.html如下图
![](https://www.ccppcoding.com/wp-content/uploads/742895-20160621161626772-679157467.png)
<span style="font-size: 18px; background-color: rgba(255, 255, 0, 1)">**五 问题**</span>
1 执行lcov命令时,报错"Out of memory!",生成的fib.info文件夹为空。是因为版本不匹配
![](https://www.ccppcoding.com/wp-content/uploads/742895-20160621161909115-516619404.png)
解决:查看版本如下,需要更新lcov的版本。1.10以上的lcov才支持4.8的gcov
[user@ip-* gtest]$gcov -v
gcov (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9)
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.
[user@ip-* gtest]$lcov -v
lcov: LCOV version 1.9
2 注意 gcc 只能编译 C 文件,编译 C++ 文件会报错
Fib.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'<br></br>collect2: ld 返回 1
编写一个C++文件,则在操作的第二步时更换为如下文件及命令
Fib.cpp 文件(源码相同)
编译: g++ -c Fib.cpp -ftest-coverage -fprofile-arcs
链接: g++ Fib.o -o Fib --coverage
运行:./Fib
之后步骤相同,生成文件及各项检查均相同
<span style='font-family: "courier new", courier'>附件为编译的各个文件的解析。</span>
### Linux平台代码覆盖率测试工具GCOV相关文件分析
<span style='font-family: "courier new", courier'>附1 od -t x4 -w16 fib.gcda</span>
http://www.linuxidc.com/Linux/2011-05/36537.htm
```
原文链接: https://www.cnblogs.com/zhaoxd07/p/5604049.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/235589
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!