gcov 用法

Linux平台代码覆盖率测试工具GCOV简介 本博客http://blog.youkuaiyun.com/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, --branc 阅读详情
   简介
     在这章里,我们将会探讨gcov实用程序,并且了解一下如何使用gcov来帮助测试与支持软件配置与优化。我们将会了解如何使用gcov来构建软件,并且理解他所提供的各种数据类型。最后,我们将探讨当执行保险测试时要避免的事情。
    gcov是什么?
     我们从gcov可以为我们做什么开始。gcov是一个保险测试工具。当构建一个程序时,gcov会监视一个程序的执行,并且会标识出执行了哪一行源码,哪一行没有执行。更进一步,gcov可以标识出某一行源执行的次数,这对于执行配置很有用(程序在哪里花费了大多数的时间)。因为gcov可以分辨出哪一行没有执行,这对于保险测试工具是很有用的。
     我们将会讨论3.2.2版本的GNU编译器工具链的gcov的用法。
     准备镜像
让我们来看一下如何为gcov的使用准备镜像。我们将会在接下来的部分提供更为详细的gcov的选项,所以这里只是作为一个介绍。我们将将会使用下面的所列的bubblesort的源码:
     
 #include <stdio.h>

       void bubbleSort( int list[], int size )
       {
         int i, j, temp, swap = 1;

         while (swap) {

           swap = 0;

           for ( i = (size-1) ; i >= 0 ; i— ) {

             for ( j = 1 ; j <= i ; j++ ) {

               if ( list[j-1] > list[j] ) {

                 temp = list[j-1];
                 list[j-1] = list[j];
                 list[j] = temp;
                 swap = 1;

               }

             }

           }

         }

       }

       int main()
       {
         int theList[10]={10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
         int i;

         /* Invoke the bubble sort algorithm */
         bubbleSort( theList, 10 );

         /* Print out the final list */
         for (i = 0 ; i < 10 ; i++) {
           printf("%d\n", theList[i]);
         }

       }


   gcov程序将会与编译器工具链一起使用。这就意味着我们将要在其上进行保险测试的镜像必须用一个特殊的选项集合进行编译。下面是我们用来演示编译bubbleSort.c的命令:
    gcc bubblesort.c -o bubblesort -ftest-coverage -fprofile-arcs
     当我们执行生成的程序时会生成一些包含关于程序的相关数据的文件。gcov程序将会使用这些文件来报告数据并且向开发者提供相应的信息。当指定-ftest -coverage选项时会为每一个源码生成两个文件。这些文件会使用.bb与.bbg作为扩展名,并且用这些文件来重组每一个可执行程序的程序流图。对于-fprofile-arcs,将会生成一个包含每一个指令分支的执行计数的以.da为扩展名的文件。这些文件会在执行以后与源码文件一起使用,来标识源码的执行行为。
    使用gcov程序
    现在我们准备好了我们的程序镜像了,让我们继续我们其余的部分。运行我们的程序就会生成我们在前面所讨论的数据集文件。然后我们使用我们希望进行检测的源码运行gcov程序。如下面所示:
$ ./bubblesort
    ...
$ gcov bubblesort.c
100.00% of 17 source lines executed in file bubblesort.c
Creating bubblesort.c.gcov.
这告诉我们在我们的例子程序中所有的源码行至少都执行了一次。我们可以通过查看所生成的bubblesort.c.gcov文件来了解每一源码行所实际运行的次数。如下面所示:
        -:    0:Source:bubblesort.c
        -:    0:Graph:bubblesort.gcno
        -:    0:Data:bubblesort.gcda
        -:    0:Runs:1
        -:    0:Programs:1
        -:    1:#include <stdio.h>
        -:    2:void bubbleSort(int list[],int size)
        1:    3:{
        1:    4:    int i,j,temp,swap=1;
        4:    5:    while(swap)
        -:    6:    {
        2:    7:    swap=0;
       22:    8:    for(i=(size-1);i>=0;i--)
        -:    9:    {
      110:   10:        for(j=1;j<=i;j++)
        -:   11:        {
       90:   12:        if(list[j-1]>list[j])
        -:   13:        {
       45:   14:            temp=list[j-1];
       45:   15:            list[j-1]=list[j];
       45:   16:            list[j]=temp;
       45:   17:            swap=1;
        -:   18:        }
        -:   19:        }
        -:   20:    }
        -:   21:    }
        1:   22:}
        -:   23:int main()
        1:   24:{
        1:   25:    int theList[10]={10,9,8,7,6,5,4,3,2,1};
        -:   26:    int i;
        -:   27:    /*Invoke the buble sort algorithm*/
        1:   28:    bubbleSort(theList,10);
        -:   29:
        -:   30:    /*print out the final list*/
       11:   31:    for(i=0;i<10;i++)
        -:   32:    {
       10:   33:    printf("%d\n",theList[i]);
        -:   34:    }
        1:   35:    return 0;
        -:   36:}

     现在让我们来看一下其中的一些关键点,看一下他所提供的内容。第一列显示了源码中每一行源码所执行的次数。在一些情况下,执行次数并没有提供。这些只是并不会影响代码的简单C源码元素。
      这些计数可以提供一些关于程序执行的信息。例如,测试的第12行执行了90次,而14-17行的代码只是执行了45次。这告诉我们当这个函数调用了90次,真正成功的仅是45次。换句话说,大部分的测试时间浪费在两个元素的交换上。这是由于测试数据的顺序所造成的。
     从这里我们可以看到代码段中最常执行的部分就是排序算法的内循环部分。这是因为由于退出测试第10行要比第12行执行的次数多一些。
查看分支概率
     我们也可以使用-b选项来查看程序的分支数据。这个选项会输出程序中每一个分支的频度与相应的摘要。例如,我们使用-b选项来执行gcov命令:
$ gcov -b bubblesort.c
100.00% of 17 source lines executed in file bubblesort.c
100.00% of 12 branches executed in file bubblesort.c
100.00% of 12 branches taken at least once in file bubblesort.c
100.00% of 2 calls executed in file bubblesort.c
Creating bubblesort.c.gcov.
所生成的bubblesort.c.gcov文件如下所示。
        -:    0:Source:bubblesort.c
        -:    0:Graph:bubblesort.gcno
        -:    0:Data:bubblesort.gcda
        -:    0:Runs:1
        -:    0:Programs:1
        -:    1:#include <stdio.h>
        -:    2:void bubbleSort(int list[],int size)
function bubbleSort called 1 returned 100% blocks executed 100%
        1:    3:{
        1:    4:    int i,j,temp,swap=1;
        4:    5:    while(swap)
branch  0 taken 67%
branch  1 taken 33% (fallthrough)
        -:    6:    {
        2:    7:    swap=0;
       22:    8:    for(i=(size-1);i>=0;i--)
branch  0 taken 91%
branch  1 taken 9% (fallthrough)
        -:    9:    {
      110:   10:        for(j=1;j<=i;j++)
branch  0 taken 82%
branch  1 taken 18% (fallthrough)
        -:   11:        {
       90:   12:        if(list[j-1]>list[j])
branch  0 taken 50% (fallthrough)
branch  1 taken 50%
        -:   13:        {
       45:   14:            temp=list[j-1];
       45:   15:            list[j-1]=list[j];
       45:   16:            list[j]=temp;
       45:   17:            swap=1;
        -:   18:        }
        -:   19:        }
        -:   20:    }
        -:   21:    }
        1:   22:}
        -:   23:int main()
function main called 1 returned 100% blocks executed 100%
        1:   24:{
        1:   25:    int theList[10]={10,9,8,7,6,5,4,3,2,1};
        -:   26:    int i;
        -:   27:    /*Invoke the buble sort algorithm*/
        1:   28:    bubbleSort(theList,10);
call    0 returned 100%
        -:   29:
        -:   30:    /*print out the final list*/
       11:   31:    for(i=0;i<10;i++)
branch  0 taken 91%
branch  1 taken 9% (fallthrough)
        -:   32:    {
       10:   33:    printf("%d\n",theList[i]);
call    0 returned 100%
        -:   34:    }
        1:   35:    return 0;
        -:   36:}


      从这里我们可看到这与上面的文件相类似,但是这一次每一个分支点都用他们的频度进行了标示。
分支点依赖于目标结构建指令集。第12行是一个简单的if语句,所以有一个分支点。在这里我们可以注意到这是50%,这通过我们前面观察程序的执行次数可以看出。其他的分支点有一些难于分析。例如,第7行是一个while语句,有两个分支点。在X86汇编中,这一行分编译成我们下面所看到的样子:
1:   cmpl        $0, -20(%ebp)
2:   jne        .L4
3:   jmp        .L1
     从这里我们可看出,swap变量与0进行比较。如果他不等于0,就会跳转到第2行,.L4。否则要跳转到第3行,.L1。第2行所示的分支概率为67%。这是因为这一行执行3次,但是jne只执行了两次。当第2行的jne并没有执行时,我们直势头跳转到第3行。这只执行一次,但是一旦执行,程序就结束了。所以分支1要花费100%的时间。
所以分支概率在理解程序流时是要相当有用的,但是要参考汇编需要理解分支点在哪里。
不完整程序测试
     当gcov计数一个测试并不是100%的程序时,并没有执行的行是标记为####,而不是执行次数。下面显示的是一个由gcov创建的文件来显示少于100%的测试。
        
       #include <stdio.h>

                int main()
           1    {
           1      int a=1, b=2;

           1      if (a == 1) {
           1        printf("a = 1\n");
                  } else {
      ######        printf("a != 1\n");
                  }

           1      if (b == 1) {
      ######        printf("b = 1\n");
                  } else {
           1        printf("b != 1\n");
                  }

           1      return 0;
                }

     当这个程序运行时,gcov实用程序也会向标准输出输出相应的信息。他会显示可能执行的源码行的行数以及实际运行的百分比。
   
 $ gcov incomptest.c
 77.78% of 9 source lines executed in file incomptest.c
 Creating incomptest.c.gcov.
 $
 如果我们的例子程序有多个函数,我们可以通过使用-f选项来查看每一个函数的执行情况。如下面的我们以bubbleSort程序所进行的演示:
$ gcov -f bubblesort.c
100.00% of 11 source lines executed in function bubbleSort
100.00% of 6 source lines executed in function main
100.00% of 17 source lines executed in file bubblesort.c
Creating bubblesort.c.gcov.
$
gcov可用的选项
gcov程序调用的格式为:
gcov [options] sourcefile
其可用的选项如下:
选项            目的
-v,-version        打印版本信息
-h,-help        打印帮助信息
-b,-branch-probabilities向输出文件输出分支频度
-c,-branch-counts    打印分支计数而不是分支频度
-n,-no-output        不创建gcov输出文件
-l,-long-file-names    创建长文件名
-f,-function-summaries    打印每一个函数的概要
-o,-object-directory    .bb,.bbg,.da文件存放的目录


     从上面这个表中,我们可以看到一个单个字符选项,以及一个长选项。当从命令行中使用gcov命令时短选项是比较有用的,但是当gcov是Makefile的一个部分时,应使用长选项,因为这更易于理解。
当了解gcov程序的版本信息时,可以使用-v选项。因为gcov是与一个指定的编译器工具链联系在一起的(实际上是由gcc工具链而构建的),gcc版本与gcov的版本是相同的。
gcov程序的简介以及选项帮助可以用-h选项来进行显示。
 
undefined reference to _gcov_init问题

On the link line you have to either
a) add -fprofile-arcs
b) add -lgcov

原文地址:http://blog.chinaunix.net/uid-13182088-id-2904573.html

GCC Coverage代码分析-GCC如何编译生成gcov/gcov-dump程序及其bug分析 本博客(http://blog.youkuaiyun.com/livelylittlefish)贴出作者(阿波)相关研究、学习内容所做的笔记,欢迎广大朋友指正! Content 0. 序 1.编译gcov/gcov-dump 2. 额外的话 3. gcov-dump程序的一 阅读详情

相关推荐

OpenHarmony覆盖率测试,gcov及lcov的原理和使用简介

采用覆盖率驱动的验证方式可以量化验证进度,保证验证的完备性。本文主要介绍了openharmony代码和分支覆盖率测试中所使用的工具(即gcov及lcov)的简介、工作原理及使用方法。

GCOV使用

1. gcov是什么? Gcov is GCC Coverage是一个测试代码覆盖率的工具是一个命令行方式的控制台程序伴随GCC发布,配合GCC共同实现对C/C++文件的语句覆盖和分支覆盖测试;与程序概要分析工具(profiling tool,例如gprof)一起工作,可以估计程序中哪一段代码最耗时; 注:程序概要分析工具是分析代码性能的工具。 2. gcov能做什么? gcov可

code. eat. sleep. loop 814

【GIS效率手册】告别C盘爆满:三步重置ArcMap默认地理数据库路径

本文针对ArcMap用户C盘空间常被占满的问题,提供了三步重置默认地理数据库路径的详细教程。通过修改地图文档属性,将数据存储位置从C盘迁移至其他驱动器,不仅能有效释放系统盘空间,还能提升数据管理效率与安全性,是GIS数据规范化管理的关键一步。

g2h3i4j5的博客 542

代码覆盖度工具:gcov和lcov

gcov的使用方法: (1)在Cmakelist中加入覆盖度相关设置:    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage") (2)使用Cmake或者Catkin_make进行编译,生成.o和.gcno文件; (3)在bulid/[node_node]/CmakeFiles/test.dir/src中找到.gcno文件; (4)使用gcov -b test.cpp.gcno文件生成.gcov文件,此文

阿辉学长博客 905

别再硬啃C代码了!用Simulink的Matlab Function模块手把手教你搭建CRC8校验模型(附完整M脚本)

本文详细介绍了如何利用Simulink的Matlab Function模块轻松实现CRC8校验模型,替代传统的C代码编写。通过可视化建模和即时验证,开发者可以高效完成算法设计,并自动生成嵌入式代码。文章包含完整的M脚本示例和工程实践技巧,特别适合嵌入式系统开发人员提升工作效率。

weixin_42520661的博客 183

扫地机器人:从仿真到决策,一个完整SLAM导航系统的自研之路

本文详细记录了从零开始自研扫地机器人SLAM导航系统的全过程,涵盖ROS-Gazebo仿真系统搭建、地图预处理优化、全覆盖规划算法迭代等关键技术。通过三次算法升级,最终实现92%的清洁效率,并分享DWA调参、状态机设计等实战经验,为开发者提供从仿真到落地的完整解决方案。

weixin_29053695的博客 352

GCOV 用法

CFLAGS="-fprofile-arcs -ftest-coverage" LIBS="-lgcov" 1。GCOV (1) 编译 CFLAGS CXXFLAGS LDFLAGS += "-fprofile-arcs -ftest-coverage -g -O0 -fPIC"     gcc -fprofile-arcs -ftest-coverage -g -O0 -o te

在线笔记 4194

【RKNN】RKNN(Rockchip Neural Network)​​ 的详解

RKNN 为 Rockchip 硬件提供了高效的 AI 推理解决方案,适合需要低功耗、实时响应的边缘场景

浩瀚之水的专栏 1684

gcov的使用 收藏

 gcov的使用 收藏 使用gcov进行保险测试简介在这章里,我们将会探讨gcov实用程序,并且了解一下如何使用gcov来帮助测试与支持软件配置与优化。我们将会了解如何使用gcov来构建软件,并且理解他所提供的各种数据类型。最后,我们将探讨当执行保险测试时要避免的事情。gcov是什么?我们从gcov可以为我们做什么开始。gcov是一个保险测试工具。当构建一个程序时,gcov会监视一个程序的执行,并且会标识出执行了哪一行源码,哪一行没有执行。更进一步,gcov可以标识出某一行源执行的次数,这对于执行配置很有用

lidalei2010的专栏 664

OpenGL 进阶系列10 - 光线跟踪实现简介(Ray Tracing)

OpenGL 实现光线跟踪(Ray Tracing)是一个相对复杂但有趣的挑战,通常用于生成高度逼真的图像效果,如反射、折射、阴影等。OpenGL 本身并不是为光线跟踪设计的,但可以通过结合计算着色器和现代 OpenGL 功能实现光线跟踪。光线跟踪的基本思路是从相机(或视点)出发,发射光线并计算这些光线与场景中物体的交点。光线与场景中物体相交的计算。计算交点的光照(基于表面法线、光源位置、材质等)。反射和折射的处理(如果物体是透明或反射的)。

GPU全栈博主 1534

ArcGIS Pro 3.4 二次开发 - 知识图谱

本文介绍了在ArcGIS Pro SDK 3.4和.NET 8环境下操作知识图谱的方法。主要包含两大功能模块:1) 知识图谱数据存储操作,包括建立连接、获取图层、检索要素类与表定义、ID转换等;2) 知识图谱数据模型管理,如获取数据模型属性、标识符信息等。代码示例详细展示了如何使用C#通过QueuedTask异步任务与知识图谱服务交互,包括异常处理、数据转换等常见操作场景。所有示例均采用using语句确保资源释放,并遵循ArcGIS Pro SDK的最佳实践。

Winemonk 763

gcov用法

简介 在这章里,我们将会探讨gcov实用程序,并且了解一下如何使用gcov来帮助测试与支持软件配置与优化。我们将会了解如何使用gcov来构建软件,并且理解他所提供的各种数据类型。最后,我们将探讨当执行保险测试时要避免的事情。 gcov是什么? 我们从gcov可以为我们做什么开始。gcov是一个保险测试工具。当构建一个程序时,gcov会监视一个程序的执行,并且会标识出执行了哪一行源码,哪一行没

那些年....的专栏 1767

浏览器解析HTML的过程及编程实现

需要注意的是,上述示例代码只是简化的演示,并未涵盖浏览器解析HTML的所有细节和复杂性。实际上,浏览器的HTML解析引擎还会处理一系列的特殊情况、错误容错和性能优化等方面的内容,以确保能够正确解析各种类型的HTML代码。HTML(超文本标记语言)是构建网页的基础语言,浏览器负责将HTML代码解析并渲染成可视化的网页。本文将详细介绍浏览器解析HTML的过程,并提供相应的编程示例代码。希望以上内容能帮助您理解浏览器解析HTML的过程,并通过提供的示例代码更好地了解如何在编程中实现这一过程。

ByteJolt的博客 321

代码覆盖率工具gcov用法

gcov是一个测试代码覆盖率的工具。与GCC一起使用来分析程序,以帮助创建更高效、更快的运行代码,并发现程序的未测试部分. 确保编译文件环境安装了lcov和gcov (1)在代码中程序退出的处理流程中增加以下代码 #ifdef AUTO_TEST __gcov_flush(); #endif (2)在makefile文件中增加对应宏 宏定义CF_MACRO 中增加 -D__AUTO_TEST__ ...

weixin_43050332的博客 856

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

linux下代码覆盖率检查工具---gcov的用法

1.增加编译和链接的参数:-fprofile-arcs -ftest-coverage以Eclipse为例,为一个C++工程增加上述参数:<br />Project->Properties->C/C++ Build->Settings->GCC C++ Compiler->Command: 输入 g++ -fprofile-arcs -ftest-coverage<br /><br />Project->Properties->C/C++ Build->Settings->GCC C++ Linker->C

我本书生 2037

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【转载】gcov 用法 --用于统计代码覆盖率

【转载】gcov 用法-denmouse-ChinaUnix博客 http://blog.chinaunix.net/uid-13182088-id-2904573.html

wangsiman的专栏 361

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Linux操作系统下gcov命令介绍和使用案例

gcov [选项]... SOURCE|OBJ...

581

【Linux】一步一步学Linux——gcov命令(257)

00. 目录 文章目录00. 目录01. 命令概述02. 命令格式03. 常用选项04. 参考示例05. 附录 01. 命令概述 gcov命令是一款测试程序的代码覆盖率的工具。 02. 命令格式 用法:gcov [选项]... SOURCE|OBJ... 03. 常用选项 显示代码覆盖信息。 -h, --help 打印此帮助并退出 -v, --...

C/C++软件工程师、嵌入式软件工程师、物联网研发工程师、C/C++讲师、物联网讲师、嵌入式讲师、鸿蒙讲师---欢迎大家一起交流(私信添加博主微信) 1901

使用gcov进行保险测试

 使用gcov进行保险测试简介在这章里,我们将会探讨gcov实用程序,并且了解一下如何使用gcov来帮助测试与支持软件配置与优化。我们将会了解如何使用gcov来构建软件,并且理解他所提供的各种数据类型。最后,我们将探讨当执行保险测试时要避免的事情。gcov是什么?我们从gcov可以为我们做什么开始。gcov是一个保险测试工具。当构建一个程序时,gcov会监视一个程序的执行,并且

977

使用gcov完成代码覆盖率的测试

本文源自:《量子数科院》http://www.linezing.com/blog/?p=234 Gcov作为gnu/gcc工作组件之一,是一款的免费的代码覆盖率测试工具,而且可以结合lcov生成美观的html的测试报表。本文介绍一些gcov的使用方法,基本原理,一些实际中可能会遇到的问题以及解决思路。 Gcov的用法 1.1       编译 Gcov的使用方法很简单,首先

IT人生 2963

gcov lcov (一)

Gcov作为gnu/gcc工作组件之一,是一款的免费的代码覆盖率测试工具,而且可以结合lcov生成美观的html的测试报表。本文介绍一些gcov的使用方法,基本原理,一些实际中可能会遇到的问题以及解决思路。 Gcov的用法 1.1       编译 Gcov的使用方法很简单,首先需要给gcc编译的时候打开覆盖测试的开关 例如要对srcfile.c单个文件生成的程序进行代码覆

沉淀 2950

软件工程师必备的技能 | 单元测试

关注、星标公众号,直达精彩内容来源:保罗的酒吧前言测试是软件开发过程中一个必须的环节,测试确保软件的质量符合预期。对于工程师自己来说,单元测试也是提升自信心的一种方式。直接交付没有经过测试...

李肖遥的专栏 622
上一篇: cygwin环境下gprof+gprof2dot+dot生成函数关系结构图
下一篇: linux kill & jobs
cbbbc
博客等级 码龄15年 609粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值