Linux平台代码覆盖率测试工具GCOV相关文件分析

2014-11-24 09:02:03 ? 作者: ? 浏览: 0

Content


1. 使用 od 命令 dump 文件内容


2. 文件内容解析


(1) file magic


(2) version


(3) time stamp


(4) FUNCTION tag


(5) COUNTER tag


(6) OBJECT SUMMARY tag


(7) PROGRAM SUMMARY tag


(8) file end


3. 文件读取函数及其调用过程


3.1 读取 / 写入相关调用


3.2 程序退出点


Appendix: gcov 文件格式定义




本文仍以 Linux 平台代码覆盖率测试工具 GCOV 简介 一文的例子为例,分析 gcda/gcno 的文件格式和读取 / 写入方法。



1. 使用 od 命令 dump 文件内容


od 命令的使用方法可参考其 manual 页。



2. 文件内容解析



(1) file magic



0x67636461 is file magic, that is, "gcda".



0x67636461 是怎么来的呢?细心的读者一定会发现,实际上就是 'g','c','d','a' 字符的 ASCII 码组成的,即 0x67,0x63,0x64,0x61 。即采用字符的 ASCII 码作为文件 magic 。可参考附录的解释。



defined as the following.


(2) version



0x34303170 is the GCOV_VERSION, that is, 401p, 4.1.2p


该版本常量在 gcov_iov.h 文件中定义,如下。


然而,这个文件是在编译 GCC 时自动产生的;文件的内容,是有 gcov_iov 程序产生,该程序由 gcov_iov.c 编译得来, 我们可以直接在 gcc 源代码下的 gcc 目录编译该文件,例如。


同样的道理, 0x34303170 即为字符 '4','0','1','p' ASCII 码组成。 'p' 代表 prerelease ,请参考附录。



(3) time stamp



0x4e8eb3f0=1317975024 is the time stamp from GreenWich, it will be read and discarded.



可以使用 date 名验证这个时间,如下。不过,数值上好像有些差异,至于原因,本文不再研究。



# date -d @1317975024 +"%F %T %z"


2011-10-07 16:10:24 +0800


# date --date='2011-04-13 11:13:07' +%s


1302664387



(4) FUNCTION tag



0x01000000 is a FUNCTION tag, defined as follows.


then, 0x00000002 is its length; and 0x00000003 is the function identifier. Next, 0xeb65a768 is the checksum.



1 :只有是 FUNCTION tag 时,才会有后续的 length, function identifier checksum



FUNCTION 数据结构如下。


-->

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: