gCov 1.5版本数据文件格式分析

来源:互联网 发布:文本挖掘算法 编辑:程序博客网 时间:2024/05/28 06:05

作者:蓝白云


说明:本文参考的源代码版本为gcc-2.95.3版本

 

gCov 1.5版本依赖2类文件才能生成代码覆盖率报告,第一类:源代码文件,其次就是:源文件描述文件、程序基本块流程图文件和覆盖率数据文件,本文是针对后者进行分析和说明(当然,源代码文件没有分析的意义)。

我们可以在gcc源代码中的gcov.c源文件的bbg_fileda_filebb_file三个文件指针为线索来找到它们仨的文件数据格式。

三个文件之间的关系

三种文件都是以二进制格式存在。它们的关系是,根据bb文件中的代码行信息找到bbg文件中对应的基本块(based block),然后根据基本块找到对应的覆盖率数据。最后结合源文件一并输出代码覆盖率报告。

x.c源文件为例来阐述gCov覆盖率统计产生的数据文件格式,以下是x.c的覆盖率报告。其中 Branch data中 + 表示分支是否被覆盖, # 表示未被覆盖;Line data 中的数字表示代码行被执行的次数。

Branch dataLine dataSource code

1:: #include "stdio.h"

2:: /* file: x.c */

3:: void foo(int i)

4:: {

5 [ +++++ :8 :switch(i)

#]

6::{

7[ + ]:2 :case 1:printf("a\n");/*yes */ break;

8::case 2:

9::/* yes */

10:2 :printf("b\n");

11[ + ]:2 :break;

12[ + ]:2 :case 3:printf("c\n");break;

13:2 :default: printf("other\n");

14::}

15:: }

16::

17:: int test_main()

18:: {

19:2 :int i;

20[ +++ ]:10 :for(i=0;i<4;++i)

21:8 :foo(i);

22[ + ]:2 :return 0;

23:: }

x.da文件格式

8个字节为单位计算,第一个单位为x文件的插桩点总数,第二个单位开始到最后表示每个插桩点的覆盖次数(即运行了多少次);

x.bb文件格式

x.bb文件描述源文件名和函数名,以及函数中的有效行号。函数名和源文件名都是通过字符串表示。字符串都是以’\0’结尾的字符串,且字符序以4字节对齐,不足的末尾以0补充。

-2<函数名>-2 + 函数中有效语句所占用的行号(case不算)[当前行的分支块个数,以4字节的0表示1]

-1<源文件名>-1

x.bbg文件格式

bbg文件是用来表示程序的流程图的,每个函数对应一个图,每个图中以基本块(based block)组成。

函数 = 块总数 + arcs总数{} + 以-1结尾

其中“图”=每个块的边数[destflag_bits] + …

例如:将x.bbg文件(二进制格式)翻译成如下可读格式,{}表示一个图(也就是一个函数),以[]表示一条边(或叫:弧),其中flag_bits0时(即0246等)表示一个覆盖率桩点(见图中蓝色的边所示),桩点顺序与x.da文件桩点顺序对应

// x.c 的 foo 函数

17 25

{ 1 [ 1, 4], // 0

2 [ 2, 5],[9, 0], // 1

2 [ 3, 5],[5, 1], // 2

2 [ 4, 5],[7, 0], // 3

1 [13, 1], // 4

2 [ 6, 5],[11, 0], // 5

1 [13, 0], // 6

2 [ 8, 5],[16, 3] // 7

1 [15, 0], // 8

2 [10, 5],[16, 3] // 9

1 [15, 0], // 10

2 [12, 5],[16, 3] // 11

1 [15, 0], // 12

2 [14, 5],[16, 3] // 13

1 [15, 4] // 14

1 [16, 3] // 15

1 [ 0, 3], // 16

} -1;


// x.c 的 test_main 函数

10 12

{ 1 [1, 4], // 0

1 [2, 5], // 1

2 [3, 5], [4, 0] // 2

1 [7, 1], // 3

2 [5, 5], [9, 3] // 4

1 [6, 5], // 5

1 [2, 0] // 6

1 [8, 1] // 7

1 [9, 3] // 8

1 [0, 3] // 9

} -1;


原创粉丝点击