Coding-Mac上使用工具获取覆盖率

    摘要

    GCOV在Mac中的下载&安装GCOV包含在GCC中3.LCOV是GCOV图形化的前端工具是Linux Test Project维护的开放源代码工具,最初…

    拖了无限久的教程终于完结了。

    另外,想了很久,还是准备带着自己仅有的一点儿小家当,从简书迁移到掘金。这应该是在简书上的最后一篇教程/知识梳理了。

    毕竟掘金才是程序猿们的小乐园,简书虽然目前在编辑器的功能等等上优于掘金,不过整体氛围还是以写作文章为主,而不是代码……

    文章会在最hen近jiu几yi天hou都迁移过去。

    本文目的:

    1.简单介绍所使用的工具

    2.示范一遍覆盖率流程

    得到代码文件→进行编译并插桩→跑程序→运行gcov、lcov,输出覆盖率可视化文件

    3.进一步说明细节内容

    4.参考文献

    A.基础内容:

    1.GCC

    GCC是一个用于linux系统下编程的编译器

    是一个用于编程开发的自由编译器。最初,GCC只是一个C语言编译器,它是GNU C Compiler 的英文缩写。随着众多自由开发者的加入和GCC自身的发展,如今的GCC已经是一个包含众多语言的编译器了。其中包括 C,C++,Ada,Object C和Java等。所以,GCC也由原来的GNU C Compiler变为GNU Compiler Collection。也就是 GNU编译器家族的意思。当然,如今的GCC借助于它的特性,具有了交叉编译器的功能,即在一个平台下编译另一个平台的代码。

    GCC在Mac中的下载&安装

    GCC在Mac中应该已经自带了,如果没有,使用Homebrew安装即可

    在安装了Homebrew的情况下

    brew install gcc

    2.GCOV

    Gcov是进行代码运行的覆盖率统计的工具,它随着gcc的发布一起发布的,它的使用也很简单,需要在编译和链接的时候加上-fprofile-arcs -ftest-coverage生成二进制文件,gcov主要使用.gcno和.gcda两个文件,.gcno是由-ftest-coverage产生的,它包含了重建基本块图和相应的块的源码的行号的信息。.gcda是由加了-fprofile-arcs编译参数的编译后的文件运行所产生的,它包含了弧跳变的次数和其他的概要信息。gcda文件的生成需要先执行可执行文件才能生成。生成gcda文件之后执行命令gcov .cpp就会在屏幕上打印出测试的覆盖率,并同时生成文件“cpp.gcov”,然后用vi打开就可以看见哪行被覆盖掉了。


    GCOV在Mac中的下载&安装

    GCOV包含在GCC中


    3.LCOV

    是GCOV图形化的前端工具

    是Linux Test Project维护的开放源代码工具,最初被设计用来支持Linux内核覆盖率的度量

    基于Html输出,并生成一棵完整的HTML树

    输出包括概述、覆盖率百分比、图表,能快速浏览覆盖率数据

    支持大项目,提供三个级别的视图:目录视图、文件视图、源码视图

    LCOV在Mac中的下载&安装

    各种教程有不同的下载指向,下载Linux Test套装、mget一些下载链接等等

    不过实际上使用Homebrew就可以了(花了好长时间找下载点,结果基本每个都不行,最后……得来全不费工夫)

    在安装了Homebrew的情况下,brew install lcov即可

    安装完成后lcov -v查看安装情况

    LCOV中自带genhtml工具,用于生成结果网页


    B.流程梳理:

    1.在对源代码进行编译时,我们使用make工具进行,并在编译过程中进行插桩。

    编译后,还会获得源代码文件对应的gcno文件。

    2.进行过插桩的程序,在被执行时即创建与源文件一一对应的.gcda文件。

    .gcda文件会记录源代码的运行数据

    3.在既有源文件又有gcda文件的情况下,使用命令gcov *.c,就会生成gcov文件

    文件名为xxx.x.gcov

    gcov文件包含着代码的覆盖信息

    4.使用lcov生成info数据

    5.最后使用lcov自带的genhtml工具,生成网页结果报告

    总结来说如图所示

    C.应用示例:

    1.写个超简单的程序

    由main.c和test.c组成

    main.c

    #include <stdio.h>#include <stdlib.h>void test(int vount);int main(int argc, char *argv[]){    int i = 0;    if(argc == 2)        i = -1;    else        i = 10;    printf("arg is %d\n",i);    test(i);    return EXIT_SUCCESS;}

    test.c

    #include <stdio.h>void test(int count){    if (count == -1)        printf ("获取到值为2,%d为-1,测试通道二已通过",count);    else        printf ("滴滴滴,测试通道一已通过");}

    2.编写Makefile文件

    使用Makefile文件用于编译

    GCOV_FLAGS=-fprofile-arcs -ftest-coverageCFLAGS+=$(GCOV_FLAGS)LDFLAGS+=-lpthread $(GCOV_FLAGS)target=mainall:$(target)main : test.o main.o    $(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS)    @echo "gdb-gcov测试程序覆盖率..."%.o : %.c    $(CC) -g -c $^ -o $@ $(CFLAGS) $(DEFINES).PHONY : cleanclean :    rm -rf *.o    rm -rf $(target)    rm -rf *.gcov *.gcda *.gcno

    前三行用于设置GCC及插桩

    需要注意的是,在这里,我们使用的是C语言。不同语言的源文件在编译时有所区别,具体请学习Makefile相关

    3.运行程序

    ./main

    4.GCOV生成覆盖率数据

    gcov main.cgcov test.c

    5.LCOV处理数据并生成结果网页

    lcov -d . -t 'Main Test' -o 'main_test.info' -b . -cgenhtml -o result main_test.info

    最后再在文件夹中找到打开网页,即可查看到代码的覆盖率啦

    D.代码、参数细节

    1.Makefile文件

    makefile是用于定义编译规则的文件,它会将多个源文件按照规定的顺序编译完成。

    1.1编译和链接

    编译-将源文件转换为中间代码文件(Win下为.obj,Unix为.o),即Object File。
    链接-将大量的Object File合成执行文件。主要是链接函数和全局变量。

    1.2Makefile规则

    基本规则

    target ... : prerequisites ...    command    ...    ...

    target
    可为object file,也可为执行文件或者label
    prerequisites
    生成该target所以来的文件/target
    command
    该target要执行的命令

    1.3make命令

    使用make命令,会在当前目录下找到名字叫"Makefile"或"makefile"的文件,并根据内容进行编译

    1.4覆盖率内容解析

    GCOV_FLAGS=-fprofile-arcs -ftest-coverage//用于添加GCOV编译配置CFLAGS+=$(GCOV_FLAGS)LDFLAGS+=-lpthread $(GCOV_FLAGS)//加在CFLAGS和LDFLAGS上//CFLAGS-置顶头文件(.h)的路径//LDFLAGS-GCC等编译器UI用到的一些优化参数main : test.o main.o//设置参数%.o : % .c//设置参数.PHONY : clean//.PHONY表示clean为一个伪目标文件//这部分为清空目标文件的规则,便于重编译并保持清洁

    1.5注意事项

    Makefile中的命令,必须以TAB键开始!

    2.GCOV

    2.1Gcov常用参数

    参数 描述
    -a 输出每个基本块的运行计数, 此选项可用于统计在同一行中的若干语句的各自运行次数
    -b 输出分支语句频率信息到输出文件, 以及概要信息到标准输出, 但不显示无条件分支
    -c 以数字而不是百分比显示分支频率
    -n 不创建输出文件
    -l 创建的输出文件名中包含头文件名, 这对于头文件中包含代码并被多个源文件使用时有用
    -p 在 .gocv 文件名中加入完整的路径信息, 此时路径中的 ‘/’ 用 ‘#’ 表示, ‘..’ 用 ‘^’ 表示
    -f 输出每个函数的概要信息

    3.LCOV&Genhtml

    3.1LCOV使用格式

    lcov -d . -t '表格名称' -o '文件名称.info' -b . -c

    3.2Genhtml使用格式

    genhtml -o 输出目录名 文件名.info


    参考资料

    本文主要参考自↓(感谢作者)
    https://blog.csdn.net/gatieme/article/details/78368667

    GCC官方文档,可戳↓
    https://gcc.gnu.org/onlinedocs/gcc/index.html#SEC_Contents

    关于Makefile的相关知识,可戳↓
    https://seisman.github.io/how-to-write-makefile/variables.html

    https://blog.csdn.net/gatieme/article/details/78368667
    https://blog.csdn.net/21cnbao/article/details/40268617
    https://www.cnblogs.com/taskiller/archive/2012/12/14/2817650.html
    https://blog.csdn.net/yyw794/article/details/77963310
    https://www.cnblogs.com/wanghetao/archive/2013/10/01/3348885.html
    https://blog.csdn.net/alpha_love/article/details/62953847

    卖萌并打滚求点赞

    (~ ̄▽ ̄)~╰( ̄▽ ̄)╭( ̄▽ ̄)*ヾ(=・ω・=)o(゚▽゚)/

    avatar
    • 本文由 发表于 2018年11月11日
    Mac 软件推荐(续)之程序猿篇 mac软件下载

    Mac 软件推荐(续)之程序猿篇

    在前面一篇文章“Mac 软件推荐(续) -- !程序猿篇” (文章取名装X失败, 悲伤)中, 我已经介绍了一些大众化的软件, 当然作为程序猿的你也应该参考参考(没看过前文的必须补上啊).本篇文章将介绍...
    匿名

    发表评论

    匿名网友 填写信息