为了提高覆盖率,您有哪些解释gcov输出的技巧?

时间:2011-05-26 14:22:37

标签: c++ gcc gcov

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

  • 我可以用gcov标志构建我的项目:-fprofile-arcs -ftest-coverage
  • 我与-lgcov选项
  • 相关联
  • 我运行单元测试程序,生成了大量gcdagcno个文件。
  • 我经常运行gcov,生成了很多gcov个文件。
  • 我总结了结果,并生成了这样的行列表:
    • #####: 42: virtual double run_time() const { return 0; }
然后我去'呃!'并编写一个调用该方法的测试。

以上示例行很容易诊断 - gcov告诉我我没有打电话的确切方法。

我还有一个由gcov标记的拷贝构造函数的例子,但是我可以使用我的Visual Studio调试器逐步完成它。那里的解决方案是要意识到gcov正在遭受RVO的侵害,这样就省略了副本,但写了一个强制复制的测试。

我还有其他一些我无法弄清楚的例子:

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

gcov似乎正在标记名称空间的紧密支撑,这是文件的最后一行。

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

gcov试图在这里告诉我什么?我想不出在这里打电话 更新1:我已经检测到FooBase有一个默认构造函数,如果只是子类'调用'与通过实例化它调用它是不一样的,就{gcov而言1}}关注。

更新2:我一直在使用产生上述结果的djgpp/gcc 4.4.4。然而,通过使用MinGW/gcc 4.5.2,'畸变'消失了,并且通过更多的工作,我已经能够达到100%的线覆盖率。

请使用针对粗心的gcov用户的单一提示或者我的一个示例的答案来撰写您的答案。

3 个答案:

答案 0 :(得分:2)

正如在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的调试版本。

答案 1 :(得分:2)

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

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

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

在我结束时,我还想使用-fprofile-arcs-ftest-coverage

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

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

正如climbatizer所建议的那样,你可以使用lcov。这为您提供HTML作为输出,具有易于阅读的表格,您可以快速浏览。我在这里有一个例子:

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

正如我们所看到的,所有测试都覆盖了图书馆。但不知何故,assembler.cpp文件说没有涵盖一个函数。我不知道是哪个函数,因为我写的100%的代码都被覆盖了...所以我只是忽略了这个。

答案 2 :(得分:1)

最近我一直在使用cmake +“make Experimental”+ lcov。 我强烈推荐这种组合。即使不使用cmake,也请查看lcov。