您的位置:首页 > 运维架构 > Linux

Linux平台代码覆盖率测试工具GCOV简介

2013-11-19 20:01 639 查看
本博客http://blog.csdn.net/livelylittlefish 贴出作者(三二一@小鱼)相关研究、学习内容所做的笔记,欢迎广大朋友指正!

Content



1. gcov是什么?

2. gcov能做什么?

3. 如何使用gcov?

3.1 使用gcov的3个阶段

(1) 编译

(2) 收集信息

(3) 报告

3.2 gcov的选项

(1) -a, --all-blocks

(2) -b, --branch-probabilities

(3) -c, --branch-counts

4. 小结



1. gcov是什么?

Gcov is GCC Coverage

是一个测试代码覆盖率的工具

是一个命令行方式的控制台程序

伴随GCC发布,配合GCC共同实现对C/C++文件的语句覆盖和分支覆盖测试;

与程序概要分析工具(profiling tool,例如gprof)一起工作,可以估计程序中哪一段代码最耗时;

注:程序概要分析工具是分析代码性能的工具。



2. gcov能做什么?



gcov可以统计

每一行代码的执行频率

实际上哪些代码确实被执行了

每一段代码(section code)的耗时(执行时间)

因此,gcov可以帮你优化代码,当然这个优化动作还是应该有开发者完成。



3. 如何使用gcov?



笔者也以gcov的manual页自带的例子为例,代码(没有做任何改动)如下。



filename: test.c



3.1 使用gcov的3个阶段



(1) 编译



# gcc -fprofile-arcs -ftest-coverage -o test test.c

# ls

test test.c test.gcno

-fprofile-arcs -ftest-coverage告诉编译器生成gcov需要的额外信息,并在目标文件中插入gcov需要的extra profiling information。因此,该命令在生成可执行文件test的同时生成test.gcno文件(gcov note文件)。



(2) 收集信息

# ./test

Success

# ls

test test.c test.gcda test.gcno

执行该程序,生成test.gcda文件(gcov data文件)。



(3) 报告

# gcov test.c

File 'test.c'

Lines executed:87.50% of 8

test.c:creating 'test.c.gcov'



# ls

test test.c test.c.gcov test.gcda test.gcno

生成test.c.gcov文件,该文件记录了每行代码被执行的次数。



test.c.gcov文件内容如下,蓝色表示笔者添加的注释。

-: 0:Source:test.c

-: 0:Graph:test.gcno

-: 0:Data:test.gcda

-: 0:Runs:1

-: 0:Programs:1

-: 1:#include //前面的数字表明该clause被执行的次数,下同

-: 2:

-: 3:int main (void)

1: 4:{

-: 5: int i, total;

-: 6:

1: 7: total = 0;

-: 8:

11: 9: for (i = 0; i < 10; i++) //前面的数字11表明该clause被执行11次

10: 10: total += i;

-: 11:

1: 12: if (total != 45)

#####: 13: printf ("Failure/n");

-: 14: else

1: 15: printf ("Success/n");

1: 16: return 0;

-: 17:}

-: 18:

3.2 gcov的选项



gcov的选项不多,也好理解,此处选3个典型的选项并结合例子加以说明。



(1) -a, --all-blocks



在.gcov文件中输出每个基本快(basic block)的执行次数。如果没有-a选项,则输出'main'函数这个block的执行次数,如上所示。使用该选项可以

Write individual execution counts for every basic block. Normally gcov outputs execution counts only for the main blocks of a line. With this option you can determine if blocks within a single line are not being executed.



# gcov -a test.c

File 'test.c'

Lines executed:87.50% of 8

test.c:creating 'test.c.gcov'



Test.c.gcov文件内容。

-: 0:Source:test.c

-: 0:Graph:test.gcno

-: 0:Data:test.gcda

-: 0:Runs:1

-: 0:Programs:1

-: 1:#include

-: 2:

-: 3:int main (void)

1: 4:{

-: 5: int i, total;

-: 6:

1: 7: total = 0;

-: 8:

11: 9: for (i = 0; i < 10; i++)

1: 9-block 0

10: 9-block 1

11: 9-block 2

10: 10: total += i;

-: 11:

1: 12: if (total != 45)

1: 12-block 0

#####: 13: printf ("Failure/n");

$$$$$: 13-block 0

-: 14: else

1: 15: printf ("Success/n");

1: 15-block 0

1: 16: return 0;

1: 16-block 0

-: 17:}

-: 18:

(2) -b, --branch-probabilities



在.gcov文件中输出每个分支的执行频率,并有分支统计信息。



# gcov -b test.c

File 'test.c'

Lines executed:87.50% of 8

Branches executed:100.00% of 4

Taken at least once:75.00% of 4

Calls executed:50.00% of 2

test.c:creating 'test.c.gcov'

-: 0:Source:test.c

-: 0:Graph:test.gcno

-: 0:Data:test.gcda

-: 0:Runs:1

-: 0:Programs:1

-: 1:#include

-: 2:

-: 3:int main (void)

function main called 1 returned 100% blocks executed 86%

1: 4:{

-: 5: int i, total;

-: 6:

1: 7: total = 0;

-: 8:

11: 9: for (i = 0; i < 10; i++)

branch 0 taken 91%

branch 1 taken 9% (fallthrough)

10: 10: total += i;

-: 11:

1: 12: if (total != 45)

branch 0 taken 0% (fallthrough)

branch 1 taken 100%

#####: 13: printf ("Failure/n");

call 0 never executed

-: 14: else

1: 15: printf ("Success/n");

call 0 returned 100%

1: 16: return 0;

-: 17:}

-: 18:

(3) -c, --branch-counts



在.gcov文件中输出每个分支的执行次数。

# gcov -c test.c

File 'test.c'

Lines executed:87.50% of 8

test.c:creating 'test.c.gcov'



-c是默认选项,其结果与"gcov test.c"执行结果相同。



其他选项,请读者参考相关文档。



4. 小结



本文简单介绍了Linux平台GCC自带的代码覆盖率测试工具GCOV的基本情况是使用方法。详细研究需要参考官方文档或者一些研究者的论文。





Reference

Gcov的manual页

http://gcc.gnu.org/onlinedocs/gcc/Gcov.html

http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html

http://dev.firnow.com/course/6_system/linux/Linuxjs/20071129/88999.html

Technorati 标签:
Linux,
代码覆盖率, Gcov
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: