Dan*_*maa 6 gcc llvm clang instruments gcov
我正在尝试创建一个类似于TraceGL的工具,但是对于C类语言:

如您所见,上面的工具突出显示未以红色执行的代码流.
例如,在为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 才能提取此数据;配置比定制更容易,因为它是一个设计属性而不是“定制”操作。YMMV。
然后,使用 GCOV 数据,您可以确定 GCOV 数据点之间的流量。我不清楚这是否会给您带来超出静态控制流分析所获得的任何东西,除非您的目标是展示执行跟踪。
要动态地执行此操作,您可以强制检测代码中的每个数据收集点注意它是最近遇到的点;在此之前,它会记录之前遇到的最近的点。这实际上会在点之间产生与控制流相匹配的引用链。从你的角度来看,这有两个问题,我认为:a)你必须修改 GCOV 或其他一些工具来插入这种不同类型的仪器,b)你必须担心什么时候记录“前辈”以及如何记录“前辈”数据收集点多次受到攻击。