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

2023-10-28

本博客(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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 正则表达式匹配IPv4,IPv6

    简单学习了一下正则表达式 感觉IPv4 IPv6匹配挺实用的 记录一下 IPv4 25 0 5 2 0 4 d 1 d 2 1 9 d 3 25 0 5 2 0 4 d 1 d 2 1 9 d String IPv4Regex 25 0 5
  • 函数调用栈——初探!

    好些日子以前 我接触了Java 当时碰到一个问题 方法调用栈 当时不太明白 直到前段时间学了 数据结构 中的 栈 才略微的明白了一些 先将这个曾经不懂的地方总结一下 首先 必须对 栈 这种结构的特性有所了解 栈的特性 后进先出 在程序中 调
  • 万字超详细解析!Spring之基于注解的声明式事务

    14 1 概述 14 1 1 编程式事务 事务功能的相关操作全部通过自己编写代码来实现 Connection conn try 开启事务 关闭事务的自动提交 conn setAutoCommit false 核心操作 提交事务 conn c
  • iOS 16适配

    IDE环境相关升级 Xcode 14 0 macOS 12 4 Xcode 14 Beta 3 传送门 https developer apple com services account download path Developer T
  • Elasticsearch新手入门教程(已经是最简洁版)

    1 配置JDK环境 建议1 7以上 2 官网下载ES https www elastic co cn 3 解压启动 用dos命令进入压缩包里面 这里可修改端口 补充 插件使用 这里使用的elasticsearch head master 插
  • win10+wsl2+ubuntu+zsh+Powerlevel10k+nerd fonts

    wsl2 是适用于 linux 的 windows 子系统的新版本 是相对于 wsl1 的升级 简单理解就是 wsl2 是可以在 windows 下进行 linux 开发 在我开来 wsl2 和虚拟机没什么区别 wsl2 就是一个交互性优化
  • 信息收集----谷歌语句

    信息收集的方式可以分为两种 主动和被动 主动的信息收集方式 通过直接访问 扫描网站 这种将流量流经网站的行为 被动的信息收集方式 利用第三方的服务对目标进行访问了解 比如 Google搜索 通过搜索引擎 有时会给我们带来意想不到的效果 下面
  • thinkphp5 切换多语言

    请求时候 1 header中增加 Accept Language 语言 2 在请求地址中增加 lang 语言参数
  • python--unittest单元测试框架

    1 简介 unittest单元测试框架是受到 JUnit JAVA 的启发 与其他语言中的主流单元测试框架有着相似的风格 其支持测试自动化 配置共享代码测试 支持将测试样例聚合到测试集中 并将测试与报告框架独立 2 构成 静态类图 2 1
  • ajax发生错误,Ajax犯的错误处理方法

    1 ajax 发送请求时状态判断 if else 语句问题 var xhr new XMLHttpRequest xhr open get strUrl xhr onreadystatechange function if xhr read
  • 时序分析/约束(一):相关概念

    由 zme 于 星期四 02 20 2014 15 03 发表 http xilinx eetrend com blog 6631 时序分析时FPGA设计中永恒的话题 也是FPGA开发人员设计进阶的必由之路 慢慢来 先介绍时序分析中的一些基
  • uniapp 登入功能 vuex使用 通俗易懂

    目录 功能介绍 运行效果 未登入状态 登入页面 进行登入完后 代码演示 功能结构 请求封装 详细文章 部分api ts 关于 用户登入接口 store index ts store user ts main js App vue type
  • 2018-12-12 Pycharm git clone 密码错误

    在新建工程的时候选择了 clone from git 不小心把密码输错了 再次clone 不再提示输入密码 只提示错误 微信截图 20181212003707 png 进入 windows 凭据 点击下三角 删除即可 微信截图 201812
  • nodejs express multer 中文名乱码

    找了半天找不到 科学上网出去秒解决 哎 无力吐槽 不bb那么多 直接上代码 上传时前端正常 但是后端接收文件时乱码 const uploads multer 文件上传的位置 dest path join dirname public upl
  • Java中字符串与byte数组之间的转换方法

    在Java编程中 我们常常需要对字符串和byte数组进行转换 字符串一般是用来表示文本信息 而byte数组则是用来表示二进制数据 如图片 音频等 本文将详细介绍Java中字符串和byte数组之间的转换方法 包括将字符串转换为byte数组和将
  • Failed to find Build Tools revision 27.0.3

    因为电脑系统的问题 导致运行一下Android Studio整个8G的电脑内存都给吃没了 索性又重装了下电脑 重新安装了下Android Studio 错误信息 11 44 Gradle sync failed Failed to find
  • @Value值注入及配置文件组件扫描方式

    spring配置文件对应的是父容器 springMVC配置文件产生的是子容器 前者一般配置数据源 事务 注解等 当然还可以进一步将一些配置细化到其他xml中 后者一般配置控制层相关的 如静态资源 视图解析器等 系统启动的时候 先初始化父容器
  • 神经网络的计算量(FLOPs)、参数量(Params)、推理时间(FPS)的定义及实现方法

    目录 1 定义 2 实现方法 2 1 计算参数量 2 2 计算参数量和FLOPs 2 3 计算推理时间 FPS 3 数据大小对参数量和FLOPs的影响 4 参数量和FLOPs对于硬件要求 参考 1 定义 在评价深度学习模型的大小 计算量 推
  • CentOS7搭建Redis Sentinel

    目录 什么是Redis Sentinel 搭建Redis Sentinel 启动与验证 什么是Redis Sentinel 官方文档 Redis 的 Sentinel 文档 搭建Redis Sentinel 首先需要在CentOS环境下准备
  • GCC Coverage代码分析-GCC如何编译生成gcov/gcov-dump程序及其bug分析

    本博客 http blog csdn net livelylittlefish 贴出作者 阿波 相关研究 学习内容所做的笔记 欢迎广大朋友指正 Content 0 序 1 编译gcov gcov dump 2 额外的话 3 gcov dum