问题描述
|
我已在项目中成功使用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。