Welcome 微信登录

首页 / 操作系统 / Linux / Linux平台代码覆盖率测试-.gcda/.gcno文件及其格式分析

Content0. 序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.gcdatest.gcda:data:magic `gcda":version `401p"test.gcda:stamp 3320622649  //对应下面的0xc5ecae39test.gcda: 01000000:   2:FUNCTION ident=3, checksum=0xeb65a768  //tag, length=2, ident, checksumtest.gcda:  01a10000:  10:COUNTERS arcs 5 counts  //tag, length=10, 5个COUNTERStest.gcda:              0 10 0 1 0 1  //此处便是5个counter,共40字节test.gcda: a1000000:   9:OBJECT_SUMMARY checksum=0x00000000test.gcda:              counts=5, runs=1, sum_all=12, run_max=10, sum_max=10test.gcda: a3000000:   9:PROGRAM_SUMMARY checksum=0x51924f98test.gcda:              counts=5, runs=1, sum_all=12, run_max=10, sum_max=10
输出格式可以参考源代码,或者"Linux平台代码覆盖率测试-gcov-dump原理分析"。 1.2 文件实际内容 文件的二进制内容如下,对应以上输出,更清楚。
# od -t x4 -w16 test.gcda0000000 67636461 34303170 c5ecae39 01000000  //"gcda", "401p", timestamp, tag=0x010000000000020 00000002 00000003 eb65a768 01a10000  //length=2, ident=3, checksum, 0x01a100000000040 0000000a 0000000a 00000000 00000000  //length=0xa=10, counter content: 0xa, 0, 1, 0, 10000060 00000000 00000001 00000000 00000000  //8 Bytes for each counter0000100 00000000 00000001 00000000 a1000000  //                          , tag=0xa10000000000120 00000009 00000000 00000005 00000001  //length=9, checksum=0, counts=5, runs=10000140 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=90000200 51924f98 00000005 00000001 0000000c  //same as above0000220 00000000 0000000a 00000000 0000000a0000240 00000000 000000000000250
格式信息可以参考源代码,也可以参考"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 3320622649test.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 blockstest.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=0005test.gcno:  01430000:   3:ARCS 1 arcstest.gcno:      block 1: 3:0005test.gcno:  01430000:   3:ARCS 1 arcstest.gcno:      block 2: 3:0005test.gcno:  01430000:   5:ARCS 2 arcs  //2个arcstest.gcno:      block 3: 2:0000 4:0005 //有两个目的地,格式:blockno=3: dst1=2:flags1 dst2=4:flags2test.gcno:  01430000:   5:ARCS 2 arcstest.gcno:      block 4: 5:0004 6:0000test.gcno:  01430000:   5:ARCS 2 arcstest.gcno:      block 5: 7:0004 8:0003test.gcno:  01430000:   5:ARCS 2 arcstest.gcno:      block 6: 7:0004 8:0003test.gcno:  01430000:   3:ARCS 1 arcstest.gcno:      block 7: 8:0001 //以下为6个LINES记录,小写的block为提示信息,大写的LINES为tag名字test.gcno:  01450000:  10:LINES           //tag=0x01450000:length=10:tagname=LINEStest.gcno:      block 1:`test.c":4, 7, 9  //blockno=1:"文件名":lineno1=4,lineno2=7,lineno3=9test.gcno:  01450000:   9:LINEStest.gcno:      block 2:`test.c":10, 9test.gcno:  01450000:   8:LINEStest.gcno:      block 4:`test.c":12test.gcno:  01450000:   8:LINEStest.gcno:      block 5:`test.c":13test.gcno:  01450000:   8:LINEStest.gcno:      block 6:`test.c":15test.gcno:  01450000:   8:LINEStest.gcno:      block 7:`test.c":16
输出格式可以参考源代码,或者"Linux平台代码覆盖率测试-gcov-dump原理分析"。