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

时间:2014-04-17 06:13:37

标签: 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?

2 个答案:

答案 0 :(得分:0)

据我所知,GCOV仪器数据只能说明代码中的某些点是执行的(可能是多少次)。但是检测的代码点之间没有关系。

听起来你想要的是通过代码确定路径。要做到这一点,您需要对代码进行静态分析(需要完整的C解析器,名称解析器,流分析器),,您需要将动态检测点按执行顺序连接在一起。

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

然后,使用GCOV数据,您可以确定GCOV数据点之间的流量。除非你的目标是展示执行痕迹,否则我不清楚除了你的目标是展示执行痕迹之外,你还可以购买除静态控制流分析之外的任何东西。

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

答案 1 :(得分:0)

gcov(或lcov)是一种选择。它确实生成了您要查找的大部分信息,但这些文件的更新频率取决于调用__gcov_flush()的频率。它并不是真正的实时,并不包括您正在寻找的所有信息(特别是'何时')。 gcov数据格式here和标题文件here中有一个简短摘要。 lcov数据描述为here

对于您正在寻找的内容DTrace应该能够实时提供您需要的所有信息。对于Apple平台上的Objective-C,运行时有dtrace个探针,可以跟踪几乎所有内容。有许多有用的指南和示例可供学习dtrace以及如何编写脚本。 Brendan Gregg提供了一些非常好的例子。大书呆子牧场已经完成了series of articles