gcc - 处理 gcov 数据文件以进行跟踪

标签 gcc clang llvm instruments gcov

我正在尝试创建一个类似于 TraceGL 的工具,但适用于 C 类型语言:

enter image description here

如您所见,上面的工具以红色突出显示了未执行的代码流。

例如,在为 Objective-C 构建这个工具方面,我知道 gcov(和 clang 中的 libprofile_rt)输出数据文件可以帮助确定给定代码行执行了多少次。但是,gcov 数据文件能否告诉我在程序执行期间何时发生了给定的代码行?

例如,如果在代码路径 A 和 B 期间调用 X 行,我是否能够从 gcov 中确定代码路径 A 和 B 在仅给定 X 行的情况下调用 X 行?

最佳答案

据我所知,GCOV 检测数据仅表明代码中的某个点被执行(可能执行了多少次)。但是检测的代码点之间没有关系。

听起来您想要的是确定通过代码的路径。为此,您要么需要对代码进行静态分析(需要完整的 C 解析器、名称解析器、流分析器),要么需要按执行顺序将动态检测点耦合在一起。

第一个要求你找到能够处理 C 的所有荣耀的机器;你不想自己重复。 GCC、Clang、我们的 DMS 工具包都是选择。我知道 GCC 和 Clang 做了非常认真的分析;我很确定您至少可以找到过程内控制流分析;我知道 DMS 可以做到这一点。您必须自定义 GCC 和 Clang 才能提取此数据。您必须配置 DMS 才能提取此数据;配置比定制更容易,因为它是设计属性而不是“定制”操作。天啊。

然后,使用 GCOV 数据,您可以确定 GCOV 数据点之间的流量。我不清楚这会为您购买任何超出静态控制流分析已经​​获得的东西,除非您的目标是展示执行跟踪。

要动态执行此操作,您可以做的是强制检测代码中的每个数据收集点注意它是最近遇到的点;在此之前,它会记录之前遇到的最近点。这实际上会在点之间产生一个与控制流匹配的引用链。从您的角度来看,这有两个问题,我认为:a)您必须修改 GCOV 或其他一些工具来插入这种不同类型的仪器,b)您必须担心何时以及如何记录“前辈”数据收集点不止一次被击中。

关于gcc - 处理 gcov 数据文件以进行跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23125850/

相关文章:

c++ - 包含所有包含 header 内容的临时文件

llvm - 无法构建 LLVM 和 Clang

Clang AST 转储不显示#defines

c - 链接共享库后符号丢失

c - 定义结构时避免 "redefinition of typedef"警告

c - 函数调用是否与 %rax 以外的其他寄存器混淆?

c++ - 如何使用 Clang 从 C++ 字符串生成 AST?

cmake - 从 llvm 源目录中使用 cmake 开发 llvm pass

llvm - 使用 LLVM 工具链编译、组装和反汇编

android - 为 Android 交叉编译时链接到 libgcc.a 时出错,但符号存在?