GCC Coverage代码分析-GCC如何编译生成gcov/gcov-dump程序及其bug分析

本文介绍了如何在不重新编译整个GCC项目的情况下,仅通过GCC的makefile文件编译gcov/gcov-dump程序。在编译过程中遇到的静态库libiberty.a找不到的问题,以及gcov-dump程序中一个导致输出异常的大数据bug的分析和修复。修复后的gcov-dump程序能正确地dump .gcda文件内容。
摘要由CSDN通过智能技术生成

本博客(http://blog.csdn.net/livelylittlefish)贴出作者(阿波)相关研究、学习内容所做的笔记,欢迎广大朋友指正!

Content

0.

1.编译gcov/gcov-dump

2. 额外的话

3. gcov-dump程序的一个bug

3.1 bug描述

3.2 bug分析与修复

3.3 正确的输出

3.4 gcov-dump的打印开关

3.5一个问题:上面红色的0是什么?谁打印出来的?

4. 总结

 

 

0.

 

某些版本的Gcc在默认情况下编译,可能不会产生gcov-dump程序,或者不会安装到/usr/bin。但gcov-dump程序在做覆盖率测试时dump相关文件(.gcda/.gcno)内容时非常必要和好用。

 

Gcc的编译耗时又繁琐,如果某些配置不正确,会导致编译过程中各种莫名其妙的错误。因此,本文主要讲述在不重新编译整个Gcc项目的情况下,如何获得gcov-dump程序。

 

本文在Linux平台上实验,以gcc-4.1.2为例,且gcc源代码在/usr/src/gcc-4.1.2目录。以下若不做特别说明,.表示gcc源代码目录,即/usr/src/gcc-4.1.2

 

1.编译gcov/gcov-dump

 

Gcov-dump.c位于./gcc目录下,因此,可以通过./gccmakefile文件编译生成gcov-dumpgcc目录下configure程序即可生成该makefile

 

makefile文件中的gcov-dump如下,由./gcc/build下的Makefile文件中抽取出来。

exeext =

 

CPPLIB = ../libcpp/libcpp.a

LIBIBERTY = ../libiberty/libiberty.a

 

# Internationalization library.

LIBINTL =

LIBINTL_DEP =

 

# Character encoding conversion library.

LIBICONV =

LIBICONV_DEP =

 

LIBS = $(CPPLIB) $(LIBINTL) $(LIBICONV) $(LIBIBERTY)

 

gcov.o: gcov.c gcov-io.c $(GCOV_IO_H) intl.h $(SYSTEM_H) coretypes.h $(TM_H) /

   $(CONFIG_H) version.h

gcov-dump.o: gcov-dump.c gcov-io.c $(GCOV_IO_H) $(SYSTEM_H) coretypes.h /

   $(TM_H) $(CONFIG_H)

 

GCOV_OBJS = gcov.o intl.o version.o errors.o

gcov$(exeext): $(GCOV_OBJS) $(LIBDEPS)

$(CC) $(ALL_CFLAGS) $(LDFLAGS) $(GCOV_OBJS) $(LIBS) -o $@

 

GCOV_DUMP_OBJS = gcov-dump.o version.o errors.o

gcov-dump$(exeext): $(GCOV_DUMP_OBJS) $(LIBDEPS)

$(CC) $(ALL_CFLAGS) $(LDFLAGS) $(GCOV_DUMP_OBJS) $(LIBS) -o $@

至于其他的定义,非本文重点,不予解释。

# cd /usr/src/gcc-4.1.2/gcc/build

# make clean

# make gcov-dump

...

make: *** No rule to make target `../build-i686-pc-linux-gnu/libiberty/libiberty.a', needed by `build/genmodes'. Stop.

 

# make gcov

...

make: *** No rule to make target `../build-i686-pc-linux-gnu/libiberty/libiberty.a', needed by `build/genmodes'. Stop.

程序提示在../build-i686-pc-linux-gnu/libiberty目录下没有找到genmodes所需的静态库libiberty.a

 

makefile文件中也了解到,gcov/gcov-dump实际所需的静态库是libcpp.alibiberty.a。实际上,只需在gcc目录下的makefile文件中指定好这两个静态库的路径(绝对路径和相对路径均可)即可解决问题。例如:/usr/bin/libiberty.a

 

2.额外的话

 

不得不指出的一点:事实上,对libcpp.a的依赖几乎为0,且对libiberty.a的依赖也仅限于以下函数。

FILE *fopen_unlocked (const char *, const char *);

void unlock_std_streams (void);

这两个函数的声明在./include/libiberty.h中。

 

因此,了解这些之后,就可以将gcov/gcov-dump相关的文件抽取出来,单独成为一个独立的项目,来编译出gcov/gcov-dump,以方便对gcov/gcov-dump源代码和原理的学习、调试。

——将另文讨论。

 

3. gcov-dump程序的一个bug

 

3.1 bug描述

 

用上述生成的gcov-dump程序dump出某个.gcda文件的内容,如下。

# cd /home/zubo/gcc/test

#/usr/src/gcc-4.1.2/gcc/build/gcov-dump test.gcda

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

test.gcda:stamp 1427241144

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

test.gcda: 01a10000:  10:COUNTERS arcs 5 counts

test.gcda:             0 10 0 1 0 1

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:             counts

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值