【问题标题】:What are your tips for interpreting gcov output in order to improve coverage?您对解释 gcov 输出以提高覆盖率有什么建议?
【发布时间】:2011-09-02 15:59:23
【问题描述】:

我在我的项目中成功使用了 gcov:

  • 我可以使用 gcov 标志构建我的项目:-fprofile-arcs -ftest-coverage
  • 我使用-lgcov 选项链接
  • 我运行我的单元测试程序,并生成了很多 gcdagcno 文件。
  • 我运行 gcov 很多次,生成了很多 gcov 文件。
  • 我总结了结果并生成了如下行列表:
    • #####: 42: virtual double run_time() const { return 0; }

然后我会去'doh!'并编写一个调用该缺失方法的测试。

上面的示例行很容易诊断 - gcov 告诉我我没有调用的确切方法。

我也有一个复制构造函数被 gcov 标记的示例,但我可以使用我的 Visual Studio 调试器逐步完成它。那里的解决方案是意识到 gcov 患有 RVO,它忽略了副本,但是编写了一个强制副本的测试来解决这个问题。

我还有其他几个我想不通的例子:

1.
File.cpp
#####: 78:}

gcov 似乎在标记命名空间的右括号,它是文件的最后一行。

2.
File.h
#####: 33:  class FooBase: public IResult {

gcov 想在这里告诉我什么?我想不出在这里进行调用。
更新 1:我检测到 FooBase 有一个默认构造函数,如果仅由子类“调用”则不是就gcov而言,与通过实例化它来调用它一样。

更新 2:我一直在使用djgpp/gcc 4.4.4,它产生了上述结果。但是,通过使用MinGW/gcc 4.5.2,“异常”消失了,并且通过更多的工作,我已经能够达到 100% 的线路覆盖率。

请为粗心的 gcov 用户提供一个提示,或者对我的一个示例进行回答。

【问题讨论】:

    标签: c++ gcc gcov


    【解决方案1】:

    正如gcov.c中所说的那样

      /* For lines which don't exist in the .bb file, print '-' before
         the source line.  For lines which exist but were never
         executed, print '#####' before the source line.  Otherwise,
         print the execution count before the source line.  There are
         16 spaces of indentation added before the source line so that
         tabs won't be messed up.  */
    

    我建议您在尝试获得覆盖率时为 gcov 和 VS 使用调试版本。

    【讨论】:

    • 什么是 gcc 的调试版本?
    • 优化禁用-O0,添加调试信息-g。另外,还有一些-f...风格的优化选项,也应该关闭。
    • 我现在使用了 '-g','-O','--coverage','-fno-elide-constructors','-fno-default-inline' 我还有更多标记为未覆盖的行! (即-g和-O是额外的)
    • 不是-O,而是-O0。 -O 是 -O1,第一级优化。您应该使用零级或禁用优化。
    【解决方案2】:

    您所说的行将在发布模式下内联。这意味着该行本身永远不会被计算(虽然坦率地说,计数器的增量可能已经移动到函数被内联的地方......但 g++ 还没有这样做。)

    为了解决问题,将-g 添加到您的 g++ 命令行以保持所有调试。您可能还想确保您定义了-D_DEBUG。实际上,文档通常会告诉您使用-g

    最后,您要避免使用 -O0 进行优化。

    就我而言,我也喜欢使用-fprofile-arcs-ftest-coverage

    正如另一个答案的评论中提到的,使用-fno-elide-constructors-fno-default-inline 也可能有助于覆盖“缺失”的构造函数和内联函数。

    关于被标记的左大括号,g++ 可能会创建一个构造函数(可能是复制构造函数)并在第一个类声明行上显示它。可能还有其他像这样创建的特定于编译器的函数,有时如果没有极其复杂的测试用例就不可能命中它们……我一直遇到这个问题。

    根据climatizer 的建议,您可以使用lcov。这为您提供了 HTML 作为输出,并带有易于阅读的表格,您可以快速浏览这些表格。我这里有这样一个例子:

    http://lcov.csspp.org/csspp-1.0.5/lib/index.html

    正如我们所见,库 100% 被所有测试覆盖。但是不知何故 assembler.cpp 文件说没有涵盖一个功能。我不知道是哪个函数,因为我写的代码 100% 都被覆盖了……所以我就忽略了。

    【讨论】:

    • 有时间对assembler.cpp 中的“缺失功能”提供任何见解吗?我有类似的情况,除了它发生在我的每个接口标题上,所以看起来我缺少很多功能,但我实际上找不到它们......
    • 到目前为止,我看到的那部分并没有得到改善。
    • 在生成的 lcov HTML 报告中,您可以看到未涵盖的方法/功能。例如:http://lcov.csspp.org/csspp-1.0.5/lib/assembler.cpp.func.html。但不知何故,为虚拟析构函数导出了两个不同的符号。
    • @AmeyaVS 有趣的是,我从来没有点击过那个链接!这使它更清晰。
    【解决方案3】:

    最近我一直在使用 cmake+"make Experimental"+lcov。 我强烈推荐这种组合。即使不使用cmake,也可以看看lcov。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-01
      • 2018-07-08
      • 2013-09-03
      • 2012-05-26
      • 2012-11-22
      • 1970-01-01
      • 2014-04-17
      • 1970-01-01
      相关资源
      最近更新 更多