【问题标题】:How do the code coverage options of GCC work?GCC 的代码覆盖选项如何工作?
【发布时间】:2013-11-04 03:32:54
【问题描述】:

考虑以下命令:

gcc -fprofile-arcs -ftest-coverage main.c

它会生成文件 main.gcda,供 gcov 使用,以生成覆盖率分析。 那么main.gcda是如何生成的呢?仪表是怎么做的?我可以看到检测的代码吗?

【问题讨论】:

    标签: c gcc code-coverage gcov


    【解决方案1】:

    Can I see the instrumented code?

    您看不到 gcda 文件等检测数据。

    Gcov 是如何工作的?

    GCOV 分四个阶段工作:

    1. Code instrumentation during compilation

    2. Data collection during code execution

    3. Data extraction at program exit time

    4. Coverage analysis and presentation post-mortem.

    要了解有关各个步骤的更多信息,您可以阅读此 pdf。

    http://ltp.sourceforge.net/documentation/technical_papers/gcov-ols2003.pdf

    【讨论】:

      【解决方案2】:

      .gcda 不是编译器生成的;它是由您的程序在您执行时生成的。

      .gcno 是编译时生成的文件,它是“注释文件”。 gcc 为每个 CU(编译器单元)生成一个基本的块图注释文件(.gcno)。

      那么main.gcda是如何生成的呢?

      在运行时,统计数据被收集并存储在内存中。某些退出回调已注册,并在程序终止时被调用以将数据写入 .gcda 文件。这意味着如果您在程序中调用 abort() 而不是 exit(),则不会生成 .gcda 文件。

      仪器是如何完成的?我可以看到检测的代码吗?

      您需要检查 gcc 的实现以获取详细信息,但基本上检测是通过向程序中插入指令来计算每条指令的执行次数来完成的。但它并不一定要为每条指令保留一个计数器。 GCC 使用某种算法来生成程序流图并为该图找到一个生成树。只需要检测一些特殊的弧,并且可以从中生成所有代码分支的覆盖范围。 您可以反汇编二进制文件以查看检测代码。 如果您想查看 gcc 源文件,这里有一些文件可供参考:

      toplev.c 覆盖率.c 个人资料.c libgcov.c gcov.c gcov-io.c

      编辑:一些已知的 gcov 错误仅供参考:

      http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49484

      http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28441

      http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44779

      http://gcc.gnu.org/bugzilla/show_bug.cgi?id=7970

      【讨论】:

      • 谢谢!!你是如何追踪这些文件的覆盖率的?
      • 我曾经使用过 gcov 并且遇到了一些问题,所以不得不研究它的实现。我添加了一些已知的错误,但它们可能会在最近的 gcc 中得到解决。
      【解决方案3】:

      您可以在编译时查看与 gcov 相关的代码可执行文件或 obj 文件,您可以使用以下步骤。

      nm executable/objfile
      

      下面是附上步骤和输出的图片:-

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多