GCCCoverage代码分析-.⽂件及其格式分析Content
0. 序
1. .gcda⽂件分析
1.1 gcov-dump程序输出结果
1.2 ⽂件实际内容
1.3 ⽂件格式总结
2. .gcno⽂件分析
2.1 gcov-dump程序输出结果
2.2 ⽂件实际内容
2.3 ⽂件格式总结
3. ⼩结
0.序
在""⼀⽂中,我们详细分析了gcov-dump程序的实现原理及每种tag的输出格式,本⽂,仍然以前⾯⼏篇⽂章的test.c为例,说明gcov-dump程序的输出结果,并总结.gcda/.gcno⽂件格式。
少儿歌曲下载1. .gcda⽂件分析
1.1 gcov-dump程序输出结果
以下dump结果请参考""⼀⽂的3.3和3.4节。
# /home/zubo/v-dump/da
输出格式可以参考源代码,或者""。
1.2⽂件实际内容
⽂件的⼆进制内容如下,对应以上输出,更清楚。
# od -t x4 -da
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
格式信息可以参考源代码,也可以参考""。
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/v-dump/
//magic:version,和stamp,对应下⾯的0xc5ecae39,与da⼀⼀对应
<:note:magic `gcno':version `401p'
<:stamp 3320622649
<: 01000000: 9:FUNCTION ident=3, checksum=0xeb65a768, `main' test.c:4
/
/: tag=0x01000000,length=9,tagname=FUNCTION,function的信息(ident,checksum,函数名,⽂件名,⾏号)
//以下为9个BLOCKS记录throw的过去式
<: 01410000: 9:BLOCKS 9 blocks
<: 0 0000 0000 0000 0000 0000 0000 0000 0000 //0为序号,每8个blocks为⼀⾏
<: 8 0000 //8为序号,⼀共9个
//以下为8个ARCS记录,⼩写的arcs和block为提⽰信息,⼤写的ARCS为tag名字
<: 01430000: 3:ARCS 1 arcs //tag=0x01430000:length=3:tagname=ARCS n_arcs=1,格式下同
<: block 0: 1:0005 //blockno=0:dst=1:flags=0005
<: 01430000: 3:ARCS 1 arcs愚人节 英语
<: block 1: 3:0005
<: 01430000: 3:ARCS 1 arcs
<: block 2: 3:0005
<: 01430000: 5:ARCS 2 arcs //2个arcs
<: block 3: 2:0000 4:0005 //有两个⽬的地,格式:blockno=3: dst1=2:flags1 dst2=4:flags2
<: 01430000: 5:ARCS 2 arcs
<: block 4: 5:0004 6:0000
<: 01430000: 5:ARCS 2 arcs
lel<: block 5: 7:0004 8:0003
<: 01430000: 5:ARCS 2 arcs
<: block 6: 7:0004 8:0003
<: 01430000: 3:ARCS 1 arcs
<: block 7: 8:0001
//以下为6个LINES记录,⼩写的block为提⽰信息,⼤写的LINES为tag名字
<: 01450000: 10:LINES //tag=0x01450000:length=10:tagname=LINES
<: block 1:`test.c':4, 7, 9 //blockno=1:'⽂件名':lineno1=4,lineno2=7,lineno3=9
<: 01450000: 9:LINES
<: block 2:`test.c':10, 9etn
<: 01450000: 8:LINES
<: block 4:`test.c':12
<: 01450000: 8:LINES
<: block 5:`test.c':13
<: 01450000: 8:LINES
<: block 6:`test.c':15
<: 01450000: 8:LINES
<: block 7:`test.c':16
输出格式可以参考源代码,或者""。
2.2⽂件实际内容
<⽂件的实际内容,使⽤od命令输出,如下。
# od -t x4 -
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
上海小学英语* //* reprents 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
格式信息可以参考源代码,也可以参考""。
注:
(1)粗体蓝⾊为tag。
(2)000000006e69616d: 'n', 'i', 'a', 'm' => 函数名main
(3)0000632e74736574: 'c', '.', 't', 's', 'e', 't' =>⽂件名test.c
(4) *表⽰该⾏与上⼀⾏完全相同,即line suppression,⾏隐藏/⾏压缩(可参考od命令的manual页)。使⽤如下命令可以消除,即按⽂件真实内容显⽰。
utility# od -t x4 -w16 -
(5) Function name和filename由gcov_read_string()函数完成,在该函数中,先读取length,然后在读取length个字(4字节/字)。
2.3⽂件格式总结
在写⼊/读取⽂件时均以4字节为单位,下⾯的分析如不特别注明,每个数据均为4字节。
(0) file header格式
magic='gcda', version, stamp
(1) FUNCTION格式
pigeonholetag=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格式
linenob=0, lengthb=0ccrs
linenoa=0, lengtha>0,filename, lineno1, lineno2, ..., linenon,linenob=0, lengthb=0 tag=0x01450000, length, blockno,linenoa=0, lengtha>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.⼩结
本⽂在""⼀⽂基础上,说明gcov-dump程序的输出结果,并总结.gcda/.gcno⽂件格式。⾄此,对Linux平台代码覆盖率测试⼯具GCOV相关⽂件的构成,有较深的认识。
Reference
Technorati 标签: