您对解释gcov输出以提高覆盖率有什么建议?

问题描述

| 我已在项目中成功使用gcov: 我可以使用gcov标志构建项目:
-fprofile-arcs -ftest-coverage
我用
-lgcov
选项链接 我运行我的单元测试程序,并生成了许多
gcda
gcno
文件。 我运行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
产生以上结果。但是,通过使用ѭ11,“像差”消失了,并且通过做更多的工作,我已经能够达到100%的线路覆盖率。 请为不熟练的gcov用户一个提示,或者给出我的示例之一的答案。     

解决方法

就像在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使用调试版本。     ,您谈论的行将以发布模式内联。这意味着该行本身将永远不会被计数(尽管坦白地说,计数器的增量可能已移至函数被内联的位置...但是g ++尚未这样做。) 为了解决该问题,请在您的g ++命令行中添加
-g
以保留所有调试信息。您可能还想确保定义了“ 14”。实际上,文档通常会告诉您使用
-g
。 最后,您想避免使用
-O0
进行优化。 最后,我也喜欢使用
-fprofile-arcs
-ftest-coverage
。 如另一个答案的注释中所述,使用
-fno-elide-constructors
-fno-default-inline
也可能有助于覆盖\“ missing \”构造函数和内联函数。 关于标记的大括号,g ++可能会创建一个构造函数(可能是复制构造函数)并将其显示在该第一类声明行上。可能还会创建其他特定于编译器的函数,并且有时如果没有极其复杂的测试用例就无法实现它们……我一直都遇到这个问题。 正如climatizer所建议的,您可以使用lcov。这样就可以将HTML作为输出,并具有易于阅读的表格,您可以快速浏览这些表格。我在这里有这样一个例子: http://lcov.csspp.org/csspp-1.0.5/lib/index.html 我们可以看到,所有测试都覆盖了该库的100%。但是不知何故,assembler.cpp文件说一个功能没有涵盖。我不知道哪个函数是正确的,因为我编写的代码中有100%被覆盖了...所以我只是忽略了这一点。     ,最近,我一直在使用cmake +“ make Experiment” + lcov。 我强烈推荐这种组合。即使不使用cmake,也请查看lcov。