Mac使用gcov、lcov进行覆盖率测试

本文目的:

  1. 简单介绍所使用的工具
  2. 示范一遍覆盖率流程

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

  1. 进一步说明细节内容
  2. 参考文献

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工具,生成网页结果报告

总结来说如图所示

覆盖率总结.png

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-coverage
CFLAGS+=$(GCOV_FLAGS)
LDFLAGS+=-lpthread $(GCOV_FLAGS)

target=main

all:$(target)

main : test.o main.o
    $(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS)
    @echo "gdb-gcov测试程序覆盖率..."

%.o : %.c
    $(CC) -g -c $^ -o $@ $(CFLAGS) $(DEFINES)

.PHONY : clean
clean :
    rm -rf *.o
    rm -rf $(target)
    rm -rf *.gcov *.gcda *.gcno

前三行用于设置GCC及插桩

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

3.运行程序

./main

4.GCOV生成覆盖率数据

gcov main.c
gcov test.c

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

lcov -d . -t 'Main Test' -o 'main_test.info' -b . -c
genhtml -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(゚▽゚)/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容