我在我的项目中成功使用了gcov:
-fprofile-arcs -ftest-coverage
-lgcov
选项gcda
和gcno
个文件。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用户的单一提示或者我的一个示例的答案来撰写您的答案。
答案 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。