本博客 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

Linux平台代码覆盖率测试工具GCOV简介相关推荐

  1. Linux平台代码覆盖率测试工具GCOV的前端工具LCOV简介

    本博客 http://blog.csdn.net/livelylittlefish 贴出作者(三二一@小鱼)相关研究.学习内容所做的笔记,欢迎广大朋友指正! Content 1. Lcov是什么? 2 ...

  2. 实体机跑gtest单体测试,Linux平台代码覆盖率测试

    PC机是Linux系统,实体机是Android系统,利用gtest进行UT测试生成覆盖率报告(HTML格式). 本文主要是利用U盘将PC机中编译生成文件拷贝到真机上,再生成gcda文件,拷贝回PC机g ...

  3. linux代码工具tag,gcov-dump原理分析_Linux平台代码覆盖率测试

    第 16 页 LINES tag: tag_lines() 函数 3.4 LINES tag: tag_lines() 函数static void tag_lines ( const char * f ...

  4. linux平台软件动态分析工具valgrind系列工具及其可视化

    linux平台软件动态分析工具valgrind系列工具 Memcheck–内存检查工具 Callgrind–函数调用分析工具 Cachegrind–缓存命中分析工具 Helgrind–线程分析工具 M ...

  5. 【Linux 系统启动优化测试工具的使用——grabserial 】

    Linux 系统启动优化测试工具的使用--grabserial Linux 系统启动优化测试工具的使用--grabserial 1.grabserial工具安装 2.grabserial工具使用 3. ...

  6. linux服务器测试软件,linux服务器常用测试工具及命令

    linux服务器常用测试工具及命令 1. 服务器配置查看 执行teddysun大牛的bench.sh脚本,输入下列命令: wget -qO- bench.sh | bash 拿腾讯云的香港轻量级服务器 ...

  7. 代码覆盖率测试工具:gcov和lcov的使用

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

  8. C语言代码覆盖率测试软件,代码覆盖率检测工具GCOV

    一.关于gcov工具 gcov伴随gcc 发布.gcc编译加入-fprofile-arcs -ftest-coverage 参数生成二进制程序,执行测试用例生成代码覆盖率信息. 1.如何使用gcov ...

  9. C语言代码覆盖率测试工具-OpenCppCoverage介绍

    代码覆盖率测试工具名称:OpenCppCoverage 简介: OpenCppCoverage是2014年推出的Windows平台下开源的C++代码覆盖率工具,类似于Linux下gcc内嵌的gcov工 ...

最新文章

  1. 我先了解一下博客园创建随笔/文章/日记的过程与三者的区别(隐私等级,是否审核等)...
  2. mysql 5.7.17远端登陆_Mysql 5.7.17安装后登录mysql的教程
  3. 基于按annotation的hibernate主键生成策略
  4. eclipse工具连接mysql_eclipse工具中使用Data Source Explorer连接数据库(MySQL)
  5. aop实现原理_SpringAOP原理分析
  6. centos 6.0 rpm 包编译环境的搭建
  7. 构建Web内容的技术
  8. java多线程--信号量Semaphore的使用
  9. C++ #pragma once用法总结
  10. 经济学论文素材之日元汇率波动原因
  11. 2cm有多长实物图_2cm(2cm有多长实物图)
  12. LeCo-45. 跳跃游戏 II
  13. Python性能分析,Python可是无所不能的!
  14. 滑雪(广搜+记忆数组+STL)
  15. Taro小程序组件传值
  16. c语言语法基础之——局部变量及存储类别、全局变量及存储类别、宏定义 学习
  17. SQL Server2017数据库查询实验
  18. 贝叶斯网络的python实现:Monty Hall问题的求解
  19. 惠州掠影:(一)挥不去的少年印记
  20. Lectra.Pro.Style.v5r3c1 1CD

热门文章

  1. [转载] python中sort,sorted,reverse,reversed的区别
  2. [转载] python字符串数组字典_Python:字符串、列表、元组、字典
  3. [转载] python判断字符串中包含某个字符串_干货分享| Python中最常用的字符串方法
  4. [转载] python语言中表示赋值的符号是_Python 语言中 asterisk 符号用法小结
  5. 雷林鹏分享:MySQL DELETE 语句
  6. 使用pygal.maps.world库读取JSON格式文件,显示世界人口地图图示
  7. 递归 人理解循环 神理解递归
  8. 《Windows编程循序渐进》——对话框应用程序
  9. Java知多少(84)图形界面之布局设计
  10. hive中使用case、if:一个region统计业务(hive条件函数case、if、COALESCE语法介绍:CONDITIONAL FUNCTIONS IN HIVE)...