http://www.linuxidc.com/Linux/2011-05/36540.htm

1. .gcda文件分析

1.1 gcov-dump程序输出结果

1.2 文件实际内容

1.3 文件格式总结

2. .gcno文件分析

2.1 gcov-dump程序输出结果

2.2 文件实际内容

2.3 文件格式总结

3. 小结

0. 序

在"Linux平台代码覆盖率测试-gcov-dump原理分析"一文中,我们详细分析了gcov-dump程序的实现原理及每种tag的输出格式,本文,仍然以前面几篇文章的test.c为例,说明gcov-dump程序的输出结果,并总结.gcda/.gcno文件格式。

1. .gcda文件分析

1.1 gcov-dump程序输出结果

以下dump结果请参考"Linux平台代码覆盖率测试-GCC如何编译生成gcov/gcov-dump程序及其bug分析"一文的3.3和3.4节。

# /home/zubo/gcc/2011-04-11.gcov-dump/gcov-dump test.gcda

test.gcda:data:magic `gcda':version `401p'

test.gcda:stamp 3320622649  //对应下面的0xc5ecae39

test.gcda: 01000000:   2:FUNCTION ident=3, checksum=0xeb65a768  //tag, length=2, ident, checksum

test.gcda:  01a10000:  10:COUNTERS arcs 5 counts  //tag, length=10, 5个COUNTERS

test.gcda:              0 10 0 1 0 1  //此处便是5个counter,共40字节

test.gcda: a1000000:   9:OBJECT_SUMMARY checksum=0x00000000

test.gcda:              counts=5, runs=1, sum_all=12, run_max=10, sum_max=10

test.gcda: a3000000:   9:PROGRAM_SUMMARY checksum=0x51924f98

test.gcda:              counts=5, runs=1, sum_all=12, run_max=10, sum_max=10

输出格式可以参考源代码,或者"Linux平台代码覆盖率测试-gcov-dump原理分析"。

1.2 文件实际内容

文件的二进制内容如下,对应以上输出,更清楚。

# od -t x4 -w16 test.gcda

0000000 67636461 34303170 c5ecae39 01000000  //'gcda', '401p', timestamp, tag=0x01000000

0000020 00000002 00000003 eb65a768 01a10000  //length=2, ident=3, checksum, 0x01a10000

0000040 0000000a 0000000a 00000000 00000000  //length=0xa=10, counter content: 0xa, 0, 1, 0, 1

0000060 00000000 00000001 00000000 00000000  //8 Bytes for each counter

0000100 00000000 00000001 00000000 a1000000  //                          , tag=0xa1000000

0000120 00000009 00000000 00000005 00000001  //length=9, checksum=0, counts=5, runs=1

0000140 0000000c 00000000 0000000a 00000000  //sum_all=0xc=12(8 Bytes), run_max=0xa=10(8 Bytes)

0000160 0000000a 00000000 a3000000 00000009  //sum_max=0xa=10(8 Bytes), tag=a3000000, length=9

0000200 51924f98 00000005 00000001 0000000c  //same as above

0000220 00000000 0000000a 00000000 0000000a

0000240 00000000 00000000

0000250

格式信息可以参考源代码,也可以参考"Linux平台代码覆盖率测试工具GCOV相关文件分析"。

1.3 文件格式总结

在写入/读取文件时均以4字节为单位,下面的分析如不特别注明,每个数据均为4字节。

(0) file header格式

magic='gcda', version, stamp

(1) FUNCTION格式

tag=0x01000000, length, ident, checksum

(2) COUNTERS格式

tag=0x01a10000, length, counter1, counter2, ..., countern

其中,划线部分均为8字节,其他为4字节。另外,n=length/2。

(3) OBJECT/PROGRAM SUMMARY格式

tag=0xa1000000/0xa3000000, length, checksum=0, counts, runs, sum_all, run_max, sum_max

其中,划线部分均为8字节,其他为4字节。

2. .gcno文件分析

2.1 gcov-dump程序输出结果

其中的空行和//注释为笔者所加。

# /home/zubo/gcc/2011-04-11.gcov-dump/gcov-dump test.gcno

//magic:version,和stamp,对应下面的0xc5ecae39,与test.gcda一一对应

test.gcno:note:magic `gcno':version `401p'

test.gcno:stamp 3320622649

test.gcno: 01000000:   9:FUNCTION ident=3, checksum=0xeb65a768, `main' test.c:4

//: tag=0x01000000,length=9,tagname=FUNCTION,function的信息(ident,checksum,函数名,文件名,行号)

//以下为9个BLOCKS记录

test.gcno:  01410000:   9:BLOCKS 9 blocks

test.gcno:              0 0000 0000 0000 0000 0000 0000 0000 0000  //0为序号,每8个blocks为一行

test.gcno:              8 0000                                     //8为序号,一共9个

//以下为8个ARCS记录,小写的arcs和block为提示信息,大写的ARCS为tag名字

test.gcno:  01430000:   3:ARCS 1 arcs  //tag=0x01430000:length=3:tagname=ARCS n_arcs=1,格式下同

test.gcno:      block 0: 1:0005        //blockno=0:dst=1:flags=0005

test.gcno:  01430000:   3:ARCS 1 arcs

test.gcno:      block 1: 3:0005

test.gcno:  01430000:   3:ARCS 1 arcs

test.gcno:      block 2: 3:0005

test.gcno:  01430000:   5:ARCS 2 arcs  //2个arcs

test.gcno:      block 3: 2:0000 4:0005 //有两个目的地,格式:blockno=3: dst1=2:flags1 dst2=4:flags2

test.gcno:  01430000:   5:ARCS 2 arcs

test.gcno:      block 4: 5:0004 6:0000

test.gcno:  01430000:   5:ARCS 2 arcs

test.gcno:      block 5: 7:0004 8:0003

test.gcno:  01430000:   5:ARCS 2 arcs

test.gcno:      block 6: 7:0004 8:0003

test.gcno:  01430000:   3:ARCS 1 arcs

test.gcno:      block 7: 8:0001

//以下为6个LINES记录,小写的block为提示信息,大写的LINES为tag名字

test.gcno:  01450000:  10:LINES           //tag=0x01450000:length=10:tagname=LINES

test.gcno:      block 1:`test.c':4, 7, 9  //blockno=1:'文件名':lineno1=4,lineno2=7,lineno3=9

test.gcno:  01450000:   9:LINES

test.gcno:      block 2:`test.c':10, 9

test.gcno:  01450000:   8:LINES

test.gcno:      block 4:`test.c':12

test.gcno:  01450000:   8:LINES

test.gcno:      block 5:`test.c':13

test.gcno:  01450000:   8:LINES

test.gcno:      block 6:`test.c':15

test.gcno:  01450000:   8:LINES

test.gcno:      block 7:`test.c':16

输出格式可以参考源代码,或者"Linux平台代码覆盖率测试-gcov-dump原理分析"。

2.2 文件实际内容

test.gcno文件的实际内容,使用od命令输出,如下。

# od -t x4 -w16 test.gcno

0000000 67636e6f 34303170 c5ecae39 01000000  //magic="gcno", version="401p", stamp, tag=0x01000000

0000020 00000009 00000003 eb65a768 00000002  //length, ident, checksum, length=2

0000040 6e69616d 00000000 00000002 74736574  //functionname="niam"(8Bytes), length=2, filename=

0000060 0000632e 00000004 01410000 00000009  //"test.c"(8Bytes), lineno=4, tag=0x01410000, length=9

0000100 00000000 00000000 00000000 00000000  //9 blocks' content, all is 0

*                                            //* represents all 0 repeated (reference 'man od')

0000140 00000000 01430000 00000003 00000000  //tag=0x01430000, length=3, src=../../0, dest=1, flags=5

0000160 00000001 00000005 01430000 00000003  //tag=0x01430000, length=3, src=../../1, dest=3, flags=5

0000200 00000001 00000003 00000005 01430000  //tag=0x01430000, length=3, src=../../2, dest=3, flags=5

0000220 00000003 00000002 00000003 00000005

0000240 01430000 00000005 00000003 00000002  //tag=0x01430000, length=5, src=../../3, dest1=2, flags1=0

0000260 00000000 00000004 00000005 01430000  //                                 dest2=4, flags2=5

0000300 00000005 00000004 00000005 00000004  //tag=0x01430000, length=5, src=../../4, dest1=5, flags1=4

0000320 00000006 00000000 01430000 00000005  //                                 dest2=6, flags2=0

0000340 00000005 00000007 00000004 00000008  //tag=0x01430000, length=5, src=../../5, dest1=7, flags1=4

0000360 00000003 01430000 00000005 00000006  //                                 dest2=8, flags2=3

0000400 00000007 00000004 00000008 00000003  //tag=0x01430000, length=5, src=../../6, dest1=7, flags1=4

//                                 dest2=8, flags2=3

0000420 01430000 00000003 00000007 00000008  //tag=0x01430000, length=3, src=../../7, dest=8, flags=1

0000440 00000001 01450000 0000000a 00000001  //tag=0x01450000, length=10, blockno=1

0000460 00000000 00000002 74736574 0000632e  //lineno=0, length=2, filename="test.c"

0000500 00000004 00000007 00000009 00000000  //lineno=4, lineno=7, lineno=9, lineno=0

0000520 00000000 01450000 00000009 00000002  //lineno=0, tag=0x01450000, length=9, blockno=2

0000540 00000000 00000002 74736574 0000632e  //lineno=0, length=2, filename="test.c"

0000560 0000000a 00000009 00000000 00000000  //lineno=10, lineno=9, lineno=0, lineno=0

0000600 01450000 00000008 00000004 00000000  //tag=0x01450000, length=8, blockno=4, lineno=0

0000620 00000002 74736574 0000632e 0000000c  //length=2, filename="test.c", lineno=12

0000640 00000000 00000000 01450000 00000008  //lineno=0, lineno=0, tag=0x01450000, length=8

0000660 00000005 00000000 00000002 74736574  //blockno=5, lineno=0, length=2, filename="test.c"

0000700 0000632e 0000000d 00000000 00000000  //           lineno=13, lineno=0, lineno=0

0000720 01450000 00000008 00000006 00000000  //tag=0x01450000, length=8, blockno=6, lineno=0

0000740 00000002 74736574 0000632e 0000000f  //length=2, filename="test.c", lineno=15

0000760 00000000 00000000 01450000 00000008  //lineno=0, lineno=0, tag=0x01450000, length=8

0001000 00000007 00000000 00000002 74736574  //blockno=7, lineno=0, length=2, filename="test.c"

0001020 0000632e 00000010 00000000 00000000  //         , lineno=16, lineno=0, lineno=0

0001040

格式信息可以参考源代码,也可以参考"Linux平台代码覆盖率测试工具GCOV相关文件分析"。

注:

(1) 粗体蓝色为tag。

(2) 00000000 6e69616d: 'n', 'i', 'a', 'm'           => 函数名main

(3) 0000632e 74736574: 'c', '.', 't', 's', 'e', 't' => 文件名test.c

(4) *表示该行与上一行完全相同,即line suppression,行隐藏/行压缩(可参考od命令的manual页)。使用如下命令可以消除,即按文件真实内容显示。

# od -t x4 -w16 -v test.gcno

(5) Function name和filename由gcov_read_string()函数完成,在该函数中,先读取length,然后在读取length个字(4字节/字)。

2.3 文件格式总结

在写入/读取文件时均以4字节为单位,下面的分析如不特别注明,每个数据均为4字节。

(0) file header格式

magic='gcda', version, stamp

(1) FUNCTION格式

tag=0x01000000, length, ident, checksum, length1, function name, length2, filename, lineno

其中,length1为其后的function name的长度,function name的大小为4*length1字节。length2为其后的filename的长度,filename的大小为4*length2字节。filename即为该function所在的源文件的名字。

(2) BLOCKS格式

tag=0x01410000, length, block1, block2, ..., blockn

(3) ARCS格式

tag=0x01430000, length, src, dst1, flags1, dst2, flags2, ..., dstn, flagsn

一个arc的src block对应多个dst block,且每个dst block均有对应的flags。

(4) LINES格式

tag=0x01450000, length, blockno, linenoa=0, lengtha>0, filename, lineno1, lineno2, ..., linenon, linenob=0, lengthb=0

其中,

linenoa=0表明源文件信息的开始,lengtha(一定大于0)为其后的filename的长度,filename的大小为4*lengtha。

linenob=0表明该源文件信息的结束,且结束信息为8个字节的0,其中前4个字节是linenob=0,后4个字节是lengthb=0。

中间是lineno信息,有1个或多个lineno,且每个lineno不为0。

3. 小结

本文在"Linux平台代码覆盖率测试-gcov-dump原理分析"一文基础上,说明gcov-dump程序的输出结果,并总结.gcda/.gcno文件格式。至此,对Linux平台代码覆盖率测试工具GCOV相关文件的构成,有较深的认识。

本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2011-05/36540p2.htm

转载于:https://my.oschina.net/alphajay/blog/33852

Linux平台代码覆盖率测试-.gcda/.gcno文件及其格式分析相关推荐

  1. Linux平台代码覆盖率测试工具GCOV的前端工具LCOV简介

    本博客 http://blog.csdn.net/livelylittlefish 贴出作者(三二一@小鱼)相关研究.学习内容所做的笔记,欢迎广大朋友指正! Content 1. Lcov是什么? 2 ...

  2. Linux平台代码覆盖率测试工具GCOV简介

    本博客 http://blog.csdn.net/livelylittlefish 贴出作者(三二一@小鱼)相关研究.学习内容所做的笔记,欢迎广大朋友指正! Content 1. gcov是什么? 2 ...

  3. 实体机跑gtest单体测试,Linux平台代码覆盖率测试

    PC机是Linux系统,实体机是Android系统,利用gtest进行UT测试生成覆盖率报告(HTML格式). 本文主要是利用U盘将PC机中编译生成文件拷贝到真机上,再生成gcda文件,拷贝回PC机g ...

  4. linux代码工具tag,gcov-dump原理分析_Linux平台代码覆盖率测试

    第 16 页 LINES tag: tag_lines() 函数 3.4 LINES tag: tag_lines() 函数static void tag_lines ( const char * f ...

  5. Linux 平台下 误删 oracle 数据文件的恢复方法

    1  问题描述 之前写过一篇删除oracle home目录的blog,参考: Linux 平台误删 home oracle 根目录的解决方法 http://www.cndba.cn/Dave/arti ...

  6. 《TencentNCNN系列》 之bin文件(网络参数文件)格式分析

    #PS:要转载请注明出处,本人版权所有 #PS:这个只是 < 我自己 >理解,如果和你的 #原则相冲突,请谅解,勿喷 时间:2018.07.18 ncnn master commit id ...

  7. Linux 平台下如何使用GCC得到各种格式的文件正文(office文件,PDF,邮件,html,zip等)

    在文件数据挖掘处理技术中,如何从文本数据中抽取有价值的信息和知识是一个重要的数据挖据分支,是机器学习.自然语言处理.数理统计的基础技术之一,是信息检索,机器学习,AI智能等高端技术的的底层技术支持之一 ...

  8. linux图片什么格式文件怎么打开,解决Linux平台下无法打开jpg文件(提示: “Not a JPEG file: starts with 0x89 0x50”)的方法...

    1.我们经常从网上下载各种jpg图片,有时候某些jpg图片在ubuntu14.04平台下无法显示缩略图,如下图中的vim_logo.jpg. 某些jpg图片在ubuntu14.04平台下无法显示缩略图 ...

  9. linux 搭建任务队列集群,beanstalkd任务队列 linux平台安装测试

    client-libraries https://github.com/kr/beanstalkd/wiki/client-libraries 1,安装 beanstalkd sudo apt-get ...

  10. linux使用windows中编辑的文件,格式问题

    参考:https://blog.csdn.net/yongan1006/article/details/8142527 运行脚本时出现了这样一个错误,打开之后并没有找到所谓的^M,查了之后才知道原来是 ...

最新文章

  1. 【性格心理学】为什么我在关键时刻总是紧张?
  2. python转化为字符串格式_Python格式化字符串~转
  3. 设计模式学习笔记(总结篇:模式分类)
  4. java awt table_java.awt.image 类 LookupTable - Java 中文参考手册
  5. XP Embedded:不同的用户使用不同的外壳程序
  6. 随机过程:鞅与马尔科夫过程的理解
  7. sql的left join 命令详解
  8. [HDOJ2512]一卡通大冒险(DP)
  9. 【滤波器】基于matlab升余弦滤波器【含Matlab源码 993期】
  10. MyBatis源码阅读(十) --- 一级缓存、二级缓存工作原理
  11. c语言程序设计学校运动会管理系统,【纯小白求助】 课程设计里面《校际运动会管理系统》源代码运行...
  12. PLsql 永久注册码
  13. 高等数学---不定积分的计算---基本积分法
  14. Java实现对称加密
  15. 正则表达式re.S与re.M的区别
  16. TreeView 四技
  17. 基于MATLAB的多进制数字调制信号的矢量星座图分析
  18. 编译原理 实验三 LR(1)分析法 Java
  19. 2021-09-13项目部署
  20. 使用 Vue 脚手架

热门文章

  1. 安装Lync Server 2013
  2. 修改整合的Jfinal的Model自动绑定表插件 AutoTableBindPlugin
  3. 数据加密技术之加密算法
  4. Java中字符(串)和数值类型的转换
  5. Windows Workflow HOL学习笔记(七):添加一个验证来检查Email参数
  6. js触发click事件
  7. C#获取电脑硬件信息(CPU ID、主板ID、硬盘ID、BIOS编
  8. Layui table隐藏某一列
  9. 前后端-SpringBoot-JPA的简单写法(配合前端vue)
  10. 软件基本功:linux/windows的头文件互相包含,大哥你这是什么创新?