我正在尝试创建一个类似于TraceGL的工具,但对于C类语言:
如您所见,上面的工具突出显示未以红色执行的代码流。
例如,在为Objective-C构建此工具方面,我知道gcov(和clang中的libprofile_rt)输出的数据文件可以帮助确定给定代码行的执行次数。但是,gcov数据文件是否能够告诉我在程序执行期间何时发生了一行代码?
例如,如果在代码路径A和B期间调用了行X,我是否能够从gcov确定代码路径A和B在给定行X的情况下称为行X?
答案 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。