【问题标题】:Processing gcov data files for tracing purposes处理 gcov 数据文件以进行跟踪
【发布时间】:2014-06-01 07:04:03
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: gcc clang llvm instruments gcov


    【解决方案1】:

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

    对于您要查找的内容,DTrace 应该能够实时提供您需要的所有信息。对于 Apple 平台上的 Objective-C,运行时有 dtrace 探针,可以让您跟踪几乎任何东西。有许多有用的指南和示例可用于了解 dtrace 以及如何编写脚本。 Brendan Gregg 提供了一些非常棒的例子。 Big Nerd Ranch 在上面做了一个series of articles

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-07
        • 2011-02-27
        • 1970-01-01
        相关资源
        最近更新 更多