Gcov 查看代码覆盖率

GCOV 工具简介

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

它是 gcc 自带的查看代码覆盖率的工具,无需额外安装,在嵌入式的 arm-eabi-none-gcc 中同样可以使用(需要重写部分系统函数)。

使用效果如下图所示:

程序运行完成后,可以查看每个文件的代码覆盖率情况,上面报告中展示了每个文件的行覆盖率,函数覆盖率和分支覆盖率。

打开一个文件的覆盖率报告,页面对开始有文件的基本信息描述,以 FreeRTOS 的 task.c 为例,它的有效代码行数为 921 行,共 24 个函数(几千行的文件其实也没多少嘛~)

在覆盖率的正文,有该文件的完整代码,并用不同颜色进行高亮标注了:

  • 蓝色表示运行被覆盖的代码,前面的数字表示代码执行次数。
  • 红色表示未执行代码。
  • 白色表示无效代码,包括注释,空行和未编译代码。

gcov 使用

使用 gcov 的流程非常简单,只需要三步即可。 下面以 hello world 为例,展示生成覆盖率报告。

代码如下:

//main.c#include <stdio.h>int main(int argc, char **argv)
{printf("hello world\n");return 0;
}

第一步: 添加编译参数 -fprofile-arcs -ftest-coverage

在所需要的生产覆盖率的文件中,添加编译参数,编译代码生成目标文件,同时会生成 *.gcno 文件,其中包含文件的行号等信息。

gcc main.c -c -fprofile-arcs -ftest-coverage -o main.o
ls # 输出文件列表:
# main.c  main.gcno  main.o
gcc main.o -lgcov -o main

第二步: 添加链接参数 -lgcov ,运行程序

运行程序后,会生成一个 *.gcda 文件,里面包含代码执行次数等数据。

gcc main.o -lgcov -o main
# 运行程序
./main
# hello world
ls # 输出文件列表:
#main  main.c  main.gcda  main.gcno  main.o

第三步: 输出覆盖率报告 使用下面命令输出覆盖率报告

# 第一次使用前安装工具
sudo apt install lcov# 生成覆盖率文本报告
lcov -c -d . -o test.info --rc lcov_branch_coverage=1 
# 生成覆盖率网页报告
genhtml --branch-coverage -o result test.info 

输入上面两/三条命令后在,执行命令的文件路径可以看到一个 result 文件夹,在里面就是对应的网页覆盖率报告。

用浏览器打开 index.html 就可以看到最开始展示的覆盖率信息了。

特殊环境使用注意点:

在正常使用 gcov 是非常简单的,但是在特殊项目中使用 gcov 需要注意一些坑,否则就会跟我一样掉进去出不来。。。

  1. 链接时,会在 .init_array 段插入 __gcov_init() 函数,该函数在 main 运行之前初始化 gcov 运行环境。
    如果修改过链接脚本,注意 .init_array 的全局构造函数是否执行成功。
  2. 和上面一样,链接时,会在全局析构函数中插入 __gcov_exit() 函数,在 main 执行结束后,输出 *.gcda 文件。
    如果程序为异常退出,则不会生成 *.gcda 文件,此时需要在代码适当位置插入 __gcov_flush() 函数,将文件进行保存。
  3. 默认状态 *.gcda 文件和 *.gcno 文件所在文件夹相同,如果需要修改输出文件夹,可通过添加环境变量:GCOV_PREFIX 和 GCOV_PREFIX_STRIP
    GCOV_PREFIX_STRIP=16 , 为将原有路径裁剪16个文件夹。 GCOV_PREFIX=/home/tester/build , 为将裁剪后的路径添加前缀 例如:上文中默认 main.gcda 所在的文件 /home/tester/main.gcda,裁剪后添加前缀后变为/home/tester/build/main.gcda
  4. gcov 内部使用了一些系统函数,需要确保这些哈是函数可用

实现原理

gcov 实现基本原理为在编译时,向代码中插桩,记录运行时的执行流,具体细节可见参考链接两位大佬的详细分析,我就在在此赘述了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/177308.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu自建git服务器

Ubuntu 安装 gitlab-ce sudo apt-get update sudo apt-get install gitlab-ce 安装成功 sudo apt-get install gitlab-ce 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取状态信息... 完成 下列【新】软件包将被安装&#xff1a;gitlab-ce 升…

GitHub项目监控

目录 github开放平台接口限流 监控某个仓库的更新状态 对于常用Github的用户来说&#xff0c;经常有一些自动化的需求。比如监控某些项目的更新情况并实时拉取&#xff0c;比如监控github全网上传的代码是否携带了公司的APIKEY&#xff0c;SECRETKEY等… github开放平台 gith…

26 行为型模式-命令模式

1 命令模式介绍 2 命令模式原理 3 命令模式实现 模拟酒店后厨的出餐流程,来对命令模式进行一个演示,命令模式角色的角色与案例中角色的对应关系如下: 服务员: 即调用者角色,由她来发起命令. 厨师: 接收者,真正执行命令的对象. 订单: 命令中包含订单 /*** 订单类**/ public cl…

2023年Zotero最新同步教程-使用TeraCloud的25G免费空间实时跨设备同步文献

文章目录 1. 前言2.1. 注册账号2.1.1. 填写注册信息2.1.2. 创建账号成功2.1.3. 注意2.2. 扩容空间2.3. 打开WebDAV 3. Zotero配置WebDAV同步3.1. 设置网址3.2. 验证服务器3.3. 文件同步成功 4. 结语 1. 前言 Zotero免费版的存储空间是300m&#xff0c;一个图文PDF动辄两三M&am…

智慧灌溉平台

1.知识百科 智慧灌溉是运用物联网、云计算、大数据等新一代信息技术&#xff0c;结合农业生产的实际需求&#xff0c;通过传感器采集土壤温湿度、光照强度等信息&#xff0c;利用无线传感网络传输到中央控制系统进行智能控制。智慧灌溉系统由传感器&#xff08;水位传感器&…

YOLOv5优化:独家创新(SC_C_Detect)检测头结构创新,实现涨点 | 检测头新颖创新系列

💡💡💡本文独家改进:独家创新(SC_C_Detect)检测头结构创新,适合科研创新度十足,强烈推荐 SC_C_Detect | 亲测在多个数据集能够实现大幅涨点 目录 1. SC_C_Detect介绍 2. SC_C_Detect加入YOLOv5 2.1 新建models/head_improve.py

基础课15——语音标注

语音数据标注是对语音数据进行处理和分析的过程&#xff0c;目的是让人工智能系统能够理解和识别语音中的信息。这个过程包括了对语音信号的预处理、特征提取、标注等步骤。 在语音数据标注中&#xff0c;标注员需要对语音数据进行分类、切分、转写等操作&#xff0c;让人工智…

京东平台数据分析:2023年9月京东扫地机器人行业品牌销售排行榜

鲸参谋监测的京东平台9月份扫地机器人市场销售数据已出炉&#xff01; 根据鲸参谋平台的数据显示&#xff0c;9月份&#xff0c;京东平台扫地机器人的销量近14万&#xff0c;环比增长约2%&#xff0c;同比降低约4%&#xff1b;销售额为2.9亿&#xff0c;环比降低约4%&#xff0…

GORM:在Go中轻松管理数据库

GORM综合介绍 - Go对象关系映射库 在现代软件开发中&#xff0c;高效的数据库管理对于构建强大的应用程序至关重要。GORM是Go开发人员寻求与数据库进行交互的简化方式的宝贵工具。GORM是Go对象关系映射的缩写&#xff0c;它为Go的面向对象世界与数据库的关系世界之间提供了桥梁…

获取Webshell方法

CMS系统指的是内容管理系统。已经有别人开发好了整个网站的前后端&#xff0c;使用者只需要部署cms&#xff0c;然后通过后台添加数据&#xff0c;修改图片等工作&#xff0c;就能搭建好一个的WEB系统。 CMS获取Webshell方法 WordPress后台拿Webshell phpcms拿Webshell 非CMS…

FedAT:异步更新联邦学习方法

文章链接&#xff1a;FedAT: A Communication-Efficient Federated Learning Method with Asynchronous Tiers under Non-IID Data 发表会议: SC’21 (International Conference for High Performance Computing, Networking, Storage, and Analysis) 高性能计算&#xff0c;体…

【Cocos新手进阶】使用cocos 的预制体创建动态的滚动框组件。

本篇文章主要讲解&#xff0c;使用cocos 游戏引擎制作动态生成的滚动框实例教程。 日期&#xff1a;2023年11月1日 作者&#xff1a;任聪聪 引擎版本&#xff1a;2.4.3 至 2.4.11 关于预制体的说明和概念 cocos中的预制体的作用是能够让你使用数据的形式进行控制界面的变化&am…

Python web开发中的单元测试自动化技巧!

Python作为一种广泛使用的编程语言&#xff0c;在web开发中也扮演着重要的角色。在进行web开发时&#xff0c;单元测试是一个不可或缺的环节。单元测试可以确保代码的正确性&#xff0c;并且能够在开发过程中快速发现问题&#xff0c;有助于提高代码质量和开发效率。 在Python…

黑芝麻智能助力亿咖通·天穹Pro行泊一体智能驾驶计算平台正式量产

11月1日&#xff0c;亿咖通科技旗下首款智能驾驶计算平台——亿咖通天穹Pro行泊一体智能驾驶平台已向客户开始正式量产交付。亿咖通天穹行泊一体智能驾驶计算平台是亿咖通科技基于黑芝麻智能华山二号A1000&#xff0c;由双方合作研发并推出的具备行泊一体能力的智能驾驶解决方案…

【MySQL进阶之路丨第十四篇】一文带你精通MySQL重复数据及SQL注入

引言 在上一篇中我们介绍了MySQL ALTER命令及序列使用&#xff1b;在开发中&#xff0c;对MySQL重复数据的处理是十分重要的。这一篇我们使用命令行方式来帮助读者掌握MySQL中重复数据的操作。 上一篇链接&#xff1a;【MySQL进阶之路丨第十三篇】一文带你精通MySQL之ALTER命令…

Http代理与socks5代理有何区别?如何选择?(二)

上篇文章我们基本分别了解了http代理与socks5代理的定义与优缺点&#xff0c;接下来我们继续来了解http代理与socks5代理之间的比较与区别。 一、两者的比较 1、功能比较 HTTP代理专门用于Web流量&#xff0c;并在处理HTTP和HTTPS协议方面非常高效。它们可以修改正在传输的数据…

网络层协议【IP协议】

全文目录 基本概念IP协议IPv4 协议头格式&#xff1a;分片发送方进行分片&#xff1a;识别IP分片&#xff1a;组装IP分片&#xff1a; 网段划分DHCP技术IP分类 私有IP和共有IP1. 私有IP地址&#xff08;Private IP Address&#xff09;&#xff1a;2. 公网IP地址&#xff08;Pu…

408操作系统笔记

一操作系统概述 1.操作系统的概念 操作系统&#xff1a;是控制和管理整个计算机系统 的硬件和软件资源 &#xff0c;合理地组织&#xff0c;调度计算机的工作和资源的分配&#xff0c;为用户和其他软件提供方便接口和环境的程序集合&#xff0c;是计算机系统中最基本的系统软…

UE5 日记(人物连招:蒙太奇动画通知(含视频链接))

教程https://www.youtube.com/watch?vsWpENaVGj2M&listPLiSlOaRBfgkcPAhYpGps16PT_9f28amXi&index10&ppiAQB 相关蓝图 连招逻辑 动画通知类 逻辑分析 1.用户输入 已搭载战斗系统模块,可以收到输入指令 2.连击 第一次攻击&#xff1a; 第一次攻击&#xff0c;…

windows使用FindWindow函数查找窗口句柄

理解什么是句柄&#xff1f; 对于“句柄”&#xff0c;之前一直停留在一知半解的认识层面&#xff0c;也说不清具体概念&#xff0c;只知道它是一个标识符&#xff0c;用来标记对象或者说某个东西的。只知其名不知其意。目前学习windows编程&#xff0c;对“句柄”做一个完整的…