6

我在我的项目中成功使用了 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产生上述结果的方法。然而,通过使用MinGW/gcc 4.5.2“像差”消失,并通过更多的工作,我已经能够达到 100% 的线路覆盖率。

请为粗心的 gcov 用户写下您的答案,或者为我的一个示例提供答案。

4

3 回答 3

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 使用调试版本。

于 2011-05-26T19:37:12.210 回答
2

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

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

最后,您要避免使用-O0.

就我而言,我也喜欢使用-fprofile-arcsand -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% 都被覆盖了……所以我就忽略了。

于 2015-08-02T02:47:04.293 回答
1

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

于 2013-09-17T00:54:51.650 回答