GCC 的代码覆盖率选项如何工作?

2024-03-04

考虑以下命令:

gcc -fprofile-arcs -ftest-coverage main.c

它生成文件 main.gcda,gcov 将使用该文件来生成覆盖率分析。 那么main.gcda是如何生成的呢?仪器仪表是如何完成的?我可以看到检测代码吗?


.gcda不是由编译器生成的;它是由您的程序在执行时生成的。

.gcno 是编译时生成的文件,它是“注释文件”。 gcc 为每个 CU(编译器单元)生成一个基本的框图注释文件 (.gcno)。

那么main.gcda是如何生成的呢?

在运行时,统计数据被收集并存储在内存中。一些退出回调被注册,并在程序终止时被调用以将数据写入 .gcda 文件。这意味着如果您在程序中调用 abort() 而不是 exit(),则不会生成 .gcda 文件。

仪器仪表是如何完成的?我可以看到检测代码吗?

您需要检查 gcc 的实现来获取详细信息,但基本上,检测是通过向程序插入指令来计算每条指令执行的次数来完成的。但它实际上并不需要为每条指令保留一个计数器; GCC 使用某种算法生成程序流程图并为该图找到生成树。只需要检测一些特殊的弧,即可生成所有代码分支的覆盖范围。 您可以反汇编二进制文件以查看检测的代码。 如果您想查看 gcc 源文件,这里有一些可供覆盖的文件:

托普莱夫.c 覆盖率.c 配置文件.c libgcov.c 冠状病毒变种c gcov-io.c

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

GCC 的代码覆盖率选项如何工作? 的相关文章

随机推荐

  • Bazel 和 Gradle 有什么区别?

    谷歌刚刚开源的 https github com bazelbuild bazel它的构建工具Bazel https bazel build 这个工具和之前有什么区别Gradle https gradle org 它能做什么 Gradle
  • Open Shift Angular 8 应用程序内存不足问题

    我正在为 openshift Angular 8 应用程序使用 Modern Web App 映像 但应用程序因 npm build 内存不足问题而失败 错误日志 usr libexec s2i assemble 第 62 行 296 被杀
  • Subversion 分支重新整合

    当分支重新集成到主干时 该分支实际上已经死亡了吗 您可以在重新集成后对分支进行修改并稍后将其合并回主干吗 你可以从技术上做到这一点 你的分支没有死亡也没有禁用 但不建议在重新集成后从分支合并到主干 您可以在这里找到有关其原因的完整讨论 Su
  • 选择不同的列并按列的子集进行分组

    我正在使用 SQL Server 2008 我陷入了这个恶性循环DISTINCT and GROUP BY 我有以下虚拟表myTable ID Street City PostalCode ProjectID Date NameId 1 B
  • OpenCV C++ 中跟踪物体的背景扣除和光流

    我正在开发一个项目 使用背景扣除来检测感兴趣的对象 并使用 OpenCV C 中的光流来跟踪它们 我能够使用背景扣除来检测感兴趣的物体 我能够在单独的程序上实现 OpenCV Lucas Kanade 光流 但是 我陷入了如何将这两个程序合
  • iOS YTPlayerView 强制视频质量

    我目前正在使用iOS youtube player helper我们的应用程序中的库 有一个视图控制器 带有YTPlayerView它的宽高比为 16 9 这意味着它只占据屏幕的一部分 视频以中等格式加载 无论如何 我都无法使其以 720P
  • MongoDB 脚本基础知识 - 如何

    MongoDB 脚本的基础知识是什么 我认为剧本将以 js 我们使用它来运行它mongo try js 但如果我把 print db foo find in try js并使用mongo try js 它会说 MongoDB shell v
  • C++ Linux (Ubuntu) 正确写入串行(对于 Arduino)

    我想知道是否有一种标准方法可以与高效的串行设备进行通信 我应该使用标准库吗 如果有 是哪一个 现在我正在摆弄让 LED 根据输入的数字以给定的量亮起 Arduino 代码如下 只是练习一些东西 看我过于简单且低效的测试 include
  • 如何处理R中的浮点错误

    考虑以下 R 函数 is sqrt lt function x y if x 2 y TRUE else FALSE 它回答 x 是否是 y 的平方根 如果 y 是完全平方数 则函数的行为符合预期 is sqrt 2 4 返回 TRUE i
  • 比较和替换 SQL Server 中字符串中的字符

    我有一个字符串说 Hel 1 oO Input string Hel 1 oO 我想创建一个函数来解析字符串 Hel 1 oO 并将字母数字以外的所有字符替换为 基本上我想使用正则表达式作为 A Za z0 9 这样除了这些字符之外的所有字
  • 从 iOS 照片库中删除图像[重复]

    这个问题在这里已经有答案了 我创建了一个应用程序 它从手机的照片库中获取图像并将其显示在集合视图上 现在 我希望每当用户选择图像并单击删除按钮时 该特定图像就会从集合视图和图像库中删除 我正在使用 ALAssetLibrary 来获取图像
  • 为什么启动流式查询会导致“ExitCodeException exitCode=-1073741515”?

    一直在尝试适应新的结构化流媒体 但一旦我开始 它就会一直给我以下错误 writeStream query 知道是什么原因造成的吗 如果您在本地和 HDFS 之间拆分检查点和元数据文件夹 我能找到的最接近的是一个正在进行的 Spark 错误
  • 调用方法时出现参数数量错误

    我有课AClass和一个方法someMethod得到一个Object数组作为参数 public class AClass public void someMethod Object parameters 主要是 当我尝试在我创建的对象上调用
  • Pubnub 推送通知不适用于跨平台移动应用程序

    我们正在开发一个基于 cordova 的 Android 应用程序 它具有聊天功能 我们正在从服务器发送测试聊天消息 当应用程序位于前台时 我们收到的消息很好 我们希望当应用程序在后台时收到有关聊天消息的通知 但是我们没有收到任何有关聊天消
  • 找不到模块:无法解析“/vercel/path0/node_modules/cross-fetch/node_modules/node-fetch/lib”中的“编码”

    有没有人遇到过 npm 包带来的不间断警告问题 supabase supabase js The warning message warn node modules cross fetch node modules node fetch l
  • 使用 Timer 在 C# 中更新 UI

    我正在努力使我的应用程序从串行端口读取数据并更新 UI 上的仪表更加高效 我想就处理 UI 更改的代码寻求一些建议 我设置了一个计时器来检查发送到 COM 端口的数据 另一个计时器则使用从 COM 端口接收到的变量更新 UI 基本上发生的事
  • 使用 lucene 改进多线程索引

    我正在尝试使用多个线程在 Lucene 中构建索引 因此 我开始编码并编写了以下代码 首先 我找到文件 并为每个文件创建一个线程来索引它 之后 我加入线程并优化索引 它有效 但我不确定 我可以大规模信任它吗 有什么办法可以改善吗 impor
  • 为什么JAXB说“xxx是一个接口,而JAXB无法处理接口”。即使生成的类不是接口

    我使用 JAXB 绑定我的 xsd 然后尝试创建 JAXBContext JAXBContext jaxbContext JAXBContext newInstance my package name 但是 JAXB 给出了 180 Ill
  • React Native 应用程序在启动时在 Android 11 上崩溃,但没有给出错误

    this is my build gradle setting and this is my system info 我正在尝试在 android 11 上运行 React Native 应用程序 但它在启动时不断崩溃而没有给出任何错误我尝
  • GCC 的代码覆盖率选项如何工作?

    考虑以下命令 gcc fprofile arcs ftest coverage main c 它生成文件 main gcda gcov 将使用该文件来生成覆盖率分析 那么main gcda是如何生成的呢 仪器仪表是如何完成的 我可以看到检测