gcov lcov (一)

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作为gnu/gcc工作组件之一,是一款的免费的代码覆盖率测试工具,而且可以结合lcov生成美观的html的测试报表。本文介绍一些gcov的使用方法,基本原理,一些实际中可能会遇到的问题以及解决思路。

  1. Gcov的用法

1.1       编译

Gcov的使用方法很简单,首先需要给gcc编译的时候打开覆盖测试的开关

例如要对srcfile.c单个文件生成的程序进行代码覆盖测试,在gcc编译的时候:

1
2
                   
gcc -fprofile-arcs -ftest-coverage srcfile.c -o srcfile

或者简化成:

1
2
                   
gcc --coverage srcfile.c -o srcfile

如果源文件很多,需要编译,链接的时候,在gcc编译的时候:

编译:

1
2
                            
gcc -fprofile-arcs -ftest-coverage -c srcfile.c

链接:

1
2
                            
gcc srcfile.o -o srcfile -lgcov

或者

1
2
                           
gcc srcfile.o –o srcfile -fprofile-arcs

看出来了没有,gcov可以只针对大项目中的某几个单独的文件进行代码覆盖测试,只要在这几个文件编译的时候,加上-ftest-coverage,其他的文件不变就行了,爽吧。

1.2       生成报表

编译完成后会同时生成 *.gcno 文件(gcov notes),gcov生成覆盖率报告时需要参考该文件。

运行生成的可执行文件,给予正常的工作负载,待其正常退出后会生成覆盖率统计数据 *.gcda 文件(gcov data)

通过如下命令行之一查看覆盖率报告:

gcov 生成文本统计结果和带 line-count 标注的源代码:gcov srcfile

lcov 生成较正式的 HTML 报告:

1
2
lcov -c -d srcfile_dir -o srcfile.info
genhtml -o report_dir srcfile.info

注意:另外,编译选项中最好加入 -g3 -O0,前者是为了增加调试信息,后者是为了禁用优化,免得覆盖率测试不准确。

1.3       一个单文件的例子

一个例子程序如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <stdlib.h>
int main( int argc, char * argv[]) {
     int i = 0;
     printf ( "Begin Test...n" );
     if (1 == argc) {
         printf ( "argc == 1n" );
     } else {
         printf ( "argc != 1n" );
         for (i = 0; i < argc; i++)
         printf ( "%dtoft%dn" , i+1, argc);
     }
     printf ( "End Test!n" );
}

编译:

1
gcc test .c -fprofile-arcs -ftest-coverage -o test

生成文件如下:

1
test  test .c  test .gcno

运行:

1
. /test  1  2  3  4

生成文件如下:

1
test  test .c  test .gcda  test .gcno

生成覆盖测试报告:

1
gcov  test

生成的test.gcov如下:

gcov

第一列是覆盖情况,第二列是行号加源程序,其中第一列中数字开头的是执行的次数,####开头的是没有执行到的语句。

2. Gcov的实现原理简介

Gcc中指定-ftest-coverage 等覆盖率测试选项后,gcc 会:

  • 在输出目标文件中留出一段存储区保存统计数据
  • 在源代码中每行可执行语句生成的代码之后附加一段更新覆盖率统计结果的代码
  • 在最终可执行文件中进入用户代码 main 函数之前调用 gcov_init 内部函数初始化统计数据区,并将gcov_exit 内部函数注册为 exit handlers
  • 用户代码调用 exit 正常结束时,gcov_exit 函数得到调用,其继续调用 __gcov_flush 函数输出统计数据到 *.gcda 文件中

2 对后台服务程序进行覆盖率测

从 gcc coverage test 实现原理可知,若用户进程并非调用 exit 正常退出,覆盖率统计数据就无法输出,也就无从生成报告了。后台服务程序若非专门设计,一旦启动就很少主动退出,用 kill 杀死进程强制退出时就不会调用 exit,因此没有覆盖率统计结果产生。

为了解决这个问题,我们可以给待测程序增加一个 signal handler,拦截 SIGHUP、SIGINT、SIGQUIT、SIGTERM 等常见强制退出信号,并在 signal handler 中主动调用 exit 或 __gcov_flush 函数输出统计结果即可。如何使用gcov完成对后台驻守程序的测试

该方案仍然需要修改待测程序代码,不过借用动态库预加载技术和 gcc 扩展的 constructor 属性,我们可以将 signalhandler 和其注册过程都封装到一个独立的动态库中,并在预加载动态库时实现信号拦截注册。这样,就可以简单地通过如下命令行来实现异常退出时的统计结果输出了:

1
LD_PRELOAD=. /gcov_out .so . /daemon

测试完毕后可直接 kill 掉 daemon 进程,并获得正常的统计结果文件 *.gcda。

用来预加载的动态库gcov_out.so的代码如下,其中__attribute__ ((constructor))

是gcc的符号,它修饰的函数会在main函数执行之前调用,我们利用它把异常信号拦截到我们自己的函数中,然后调用__gcov_flush()输出错误信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#define SIMPLE_WAY
void sighandler( int signo)
{
#ifdef SIMPLE_WAY
     exit (signo);
#else
     extern void __gcov_flush();
     // flush out gcov stats data
     __gcov_flush();
     // raise the signal again to crash process
     raise (signo);
#endif
}
__attribute__ ((constructor))
void ctor()
{
     int sigs[] = {
         SIGILL, SIGFPE, SIGABRT, SIGBUS,
         SIGSEGV, SIGHUP, SIGINT, SIGQUIT,
         SIGTERM
     };
     int i;
     struct sigaction sa;
     sa.sa_handler = sighandler;
     sigemptyset(&sa.sa_mask);
     sa.sa_flags = SA_RESETHAND;
     for (i = 0; i < sizeof (sigs)/ sizeof (sigs[0]); ++i) {
         if (sigaction(sigs[i], &sa, NULL) == -1) {
             perror ( "Could not set signal handler" );
         }
     }
}

编译:

1
gcc -shared -fPIC gcov_out.c -o gcov_out.so

4. 参考资料

man gcc

man gcov

lcov – http://ltp.sourceforge.net/coverage/lcov.php

注意,lcov 最好使用 1.9 及以上版本,否则可能遇到如下错误:

geninfo: ERROR: …: reached unexpected end of file

转载:

http://blog.linezing.com/2011/03/%E4%BD%BF%E7%94%A8gcov%E5%AE%8C%E6%88%90%E4%BB%A3%E7%A0%81%E8%A6%86%E7%9B%96%E7%8E%87%E7%9A%84%E6%B5%8B%E8%AF%95

gcov和lcov gcov是什么 gcov能做什么 如何使用 编译生成gcno与gcda 生成报告代表没有被执行过 可能的问题 生成文件失败 文件时间戳不一致 Using gcov with GCC Optimization 缺陷 lcov lcov是什么 安装 使用lcov Reference gcov是什么? 测试代码覆盖率的工具 命令行方式控制台程序 GCC自带,伴随GCC一起发布 可以和gprof一起工作估算 阅读详情

相关推荐

代码覆盖工具gcov/lcov的使用

参考文献: gcov使用示例  http://blog.youkuaiyun.com/lishenglong666/article/details/8056777 lcov使用示例   http://www.linuxidc.com/Linux/2011-05/36544.htm gcov测试内核覆盖率 http://ltp.sourceforge.net/coverage/gcov.php 1.

ldhshao的专栏 2002

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

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

yuanxingyang的专栏 3045

使用gcov和lcov测试代码覆盖率

gcov与 lcov简介gcovgcov是Linux下GCC自带的一个C/C++代码覆盖率分析工具,因此只要安装了gcc,就不需要再次安装了lcovlcov介绍gcov能够生成代码覆盖信息,但是不够直观,因此需要借助lcov直观展示覆盖率,主要特点有:基于Html输出,并生成一棵完整的HTML树 输出包括概述、覆盖率百分比、图表,能快速浏览覆盖率数据 支持大项目,提供三个级别的视图:目录视图、文

守望的博客-编程珠玑 4116

覆盖率测试工具gcov & lcov使用手册

Gcov: 代码覆盖率工具 1.      编译: 编译时gcc添加编译选项“gcc-fprofile-arcs“和”–ftest-coverage”: e.g:gcc-fprofile-arcs  -ftest-coverage -otest test0309.c 编译完后会生成* .gcno文件 2.   执行: 执行生成的可执行程序,gcda文件: # ./test

IT源动力 1万+

代码覆盖率测试工具:gcov+lcov

简单介绍代码覆盖率测试工具gcov及前端工具lcov

jfleecumt的博客 3194

gcov和lcov代码覆盖率工具

1.GCOV查看arm-linux代码覆盖率 一、           关于gcov工具 gcov伴随gcc 发布。gcc编译加入-fprofile-arcs -ftest-coverage 参数生成二进制程序,执行测试用例生成代码覆盖率信息。 1、如何使用gcov 用GCC编译的时候加上-fprofile-arcs -ftest-coverage选项,链接的时候也加上。 fprofi

wjflyhigh的专栏 2872

覆盖率工具gcov和lcov的使用

覆盖率工具,gcov,lcov的使用

qq_50895567的博客 2617

gcov/lcov代码覆盖率工具使用说明

gcov是linux下进行代码覆盖测试的工具,随着gcc一起发布。lcov是gcov的图形化前端工具,根据gcov生成的内容,处理成一颗完整的html树,包括概述、覆盖率百分百、图标等轻便直观的内容。在根CMakeList.txt中添加ENABLE_GCOV选项:OPTION(ENABLE_GCOV "Enable gcov (debug, Linux builds only)" OFF)IF (...

wciserli1的博客 1301

【linux+gcov+lcov】linux下借助gcov和lcov工具实现单元测试覆盖率统计练习

1、gcov Linux下代码覆盖率工具,属于gcc工具集之一,随gcc一起发布,不需要独立安装。 使用gcov -v 可以查看gcov的版本信息,如下: 2、lcov lcov是gcov的图形化工具,可生成html格式的代码覆盖率报告,提高覆盖率检测结果的可读性。 lcov需要自己下载的开源软件,下载地址如下: https://sourceforge.net/projects/ltp/files/Coverage%20Analysis/ 3、lcov的手动安装 (1)进入到.tar.g

zhanghui962623727的博客 5442

GCOV覆盖率分析

一、GCOV简介 二、GCOV使用示例 三、GCOV编译命令 四、运行并生成覆盖率报告 五、覆盖率报告分析

AI-安全-功耗 983

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

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

覆盖率工具gcov,lcov实践

覆盖率工具gcov,lcov使用记录 背景 本文记录的是gcov和lcov在统计一个分布式数据库的代码覆盖率过程中遇到的问题。 介绍 *gcov是一个测试代码覆盖率的工具,随着gcc一起发布,不需要进行特别安装;而lcov是配合gcov生成覆盖率文件的工具,需要单独安装。 *lcov是基于源码安装的,下载源码解压后make install即可安装。在安装完成后,使用lcov -v可以正确查询到安装的lcov版本,但是在后续生成代码覆盖率文件时发生错误,提示Can’t locate PerlIO/gzip

m0_38099115的博客 2271

过压保护电路(OVP)

作者:AirCity 2020.2.4 Aircity007@sina.com 本文所有权归作者Aircity所有 1 示例一 当VBUS=5V时,各点电压电流如图所示,Q1接近截止,输出信号是5V。 当VBUS=5.4V开始,输出信号开始下降,直到VBUS=6.1V,输出信号降低为0.6V。 下面是实测波形,这个电路,输出信号的电压不会超过5.4V,这个输出信号可用于电源的控制信号。 2 ...

AirCity123的博客 3万+

C/C++ 代码覆盖率工具:gcov+lcov

GCOV是一个测试C/C++代码覆盖率的工具,使用它可以看出哪些代码被执行了,被执行的次数和时间。 1 gcov简介 GCOV随着gcc安装,不需要我们另外再进行安装,gcov的使用如下。 1.1 代码编译 想要用gcov收集代码覆盖信息, 需要在编译代码的时候加上这2个选项-fprofile-arcs -ftest-coverage,编译后会生成gcno文件。 1.1.1 直...

Hey_Sarah 1万+

Python手记-9:Python LXML库XPath的爬取晋江书目

1. lxml库 lxml是功能最丰富且易于使用的库,用于处理Python语言中的XML和HTML,还可实现WEB爬取,官文参考:https://lxml.de/,完整的PDF文档下载链接https://lxml.de/lxmldoc-4.5.0.pdf,但是阅读起来……em……怪自己不够聪明的样子。 Linux下安装lxml库:[root@chengyu ~]# pip3 instal...

成屿的专栏 4万+

STM32驱动HC-SR04超声波模块:两种精准测距方案详解

本文详解STM32驱动HC-SR04超声波模块的两种精准测距方案:定时器中断计数法和外部中断边沿检测法。涵盖硬件连接、代码实现与优化技巧,帮助开发者根据精度和复杂度需求选择合适方案,提升超声波测距在嵌入式项目中的稳定性和准确性。

g5h6i的博客 682

【嵌入式】gcov/lcov/gcovr代码覆盖率交叉编译使用解析

gcov是一个测试代码覆盖率的程序,正确地使用它搭配GCC可以分析、帮助你将代码写得更高效。帮助你优化程序。类似于一个profiling tool,使用gcov或者gprof,可以收集到一些基础的性能统计数据。每一行代码执行的频度每个代码文件中实际被执行到的行数每一个代码块执行使用的时间gcov创建一个logfile叫做 源文件名称.gcxx (这里的源文件名称指的是.c或者.cc文件的文件名),表示的是这个 源文件.c 中每一行所被执行的次数。这些文件可以配合gprof使用。

heroybc的博客 8856

Spring Boot集成ShardingSphere实现数据加密及数据脱敏 | Spring Cloud 48

利用ShardingSphere实现: - 数据加密 - 数据脱敏

gmHappy 1万+

gcov和lcov的使用

<br />1、Gcov是进行代码运行的覆盖率统计的工具,它随着gcc的发布一起发布的,它的使用也很简单,需要在编译和链接的时候加上-fprofile-arcs -ftest-coverage生成二进制文件,gcov主要使用.gcno和.gcda两个文件,.gcno是由-ftest-coverage产生的,它包含了重建基本块图和相应的块的源码的行号的信息。.gcda是由加了-fprofile-arcs编译参数的编译后的文件运行所产生的,它包含了弧跳变的次数和其他的概要信息。gcda文件的生成需要先执行可执行

lgtnt的专栏 4435

【Unity实战篇】 接入百度翻译,实现文本自动翻译功能

日常在做项目的过程中,游戏本地化几乎已经成为必不可少的一步。 本篇文章将演示怎样在Unity中接入百度翻译,实现文本自动翻译的功能。

努力前行,总会成为自己心中的那道光 9059

微信小程序云开发 - 实现商家转账到零钱(微信企业付款到零钱) V3功能流程及完整实例代码,过微信云开发的云函数实现企业付款到零钱(提供详细示例源码纯云函数实现,证书、密钥、签名等各种常见问题解决方案

企业付款到零钱(微信小程序提现功能,提现到零钱)微信小程序-云函数实现微信企业付款到零钱功能,实现微信商户号中的企业付款到零钱的功能,微信小程序+云开发+商家转账至零钱+微信小程序用户提现,使用云开发环境的云函数实现微信小程序的支付功能,微信小程序实现微信企业付款到零钱功能的流程,V3 V2基于微信云开发的商家转账至零钱,小程序云函数企业付款到零钱功能实现,云开发实现微信商户支付企业付款到零钱功能,不用服务器纯云函数实现,详细示例代码demo教程,API证书错误,转账不到账怎么办,密钥生成有误,转账失败,有

🏆 前端领域优质创作者 1万+

gcov 和 lcov

gcov lcov

JCRunner的专栏 1634

中文核心:swin transformer 农作物病虫害识别 完整代码数据

中文核心:swin transformer 农作物病虫害识别

939

gcov和lcov使用经验

转自: http://magustest.com/blog/tag/lcov/ 使用gcov和lcov做代码覆盖有一段时间了,期间走了一些弯路,算是一些经验教训。 gcov可以对shared object进行代码覆盖信息收集。 之前的一篇文章说过,gcov不能收集.so的代码覆盖率信息,其实这个是错的。 如果是C++程序,在CXXFLAGS中加入-fprofile-

ThirstyBlue的专栏 6000

在Simulink中实现一个基于SiC MOSFET的高效率电机驱动系统

本文介绍了在Simulink中构建基于SiC MOSFET的高效率电机驱动系统的详细流程。系统由直流电源模块、SiC MOSFET逆变器模块、PMSM电机模型、控制策略模块(包括矢量控制和PWM生成)以及反馈测量模块组成。文章逐步指导了从模型创建到参数设置的完整过程,包括各模块的具体实现方法。通过仿真可以评估系统在不同负载条件下的响应速度、效率、功率密度等性能指标。该建模方法为电机驱动系统的设计和优化提供了有效工具,同时建议根据实际硬件规格和工程需求进行参数调整和定制化开发。

xiaoheshang_123的博客 248

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

gcov,lcov常见问题

本文转载:http://magustest.com/blog/whiteboxtesting/code-coverage-gcov-lcov/ 使用gcov和lcov做代码覆盖有一段时间了,期间走了一些弯路,算是一些经验教训。 gcov可以对shared object进行代码覆盖信息收集。 之前的一篇文章说过,gcov不能收集.so的代码覆盖率信息,其实这个是错的

ligengyong2010的专栏 4545

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: linux dos2unix 和 unix2dos
下一篇: UNIX下的LD_PRELOAD环境变量
panfengsoftware
博客等级 码龄20年 38粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值