为什么需要为GCC中的代码覆盖传递两个编译器标志

时间:2016-08-31 05:57:15

标签: c gcc code-coverage gcov

我理解两个编译器标志:需要传递 -ftest-coverage -fprofile-arcs 以获取GCC中的代码覆盖率。 我的问题是,有2个编译器标志来获得覆盖的原因是什么。另外,如果我们独立使用它们,我们能得到什么呢?

我尝试用-fprofile-arcs标志编译一个c程序。我没有发现任何差异。能够生成.gcno .gcda和gcov文件

2 个答案:

答案 0 :(得分:3)

如果您想使用 Gcov 工具在GCC中获取代码覆盖率,请参阅明确说明的this documentation

  

使用gcov时,必须首先使用两个特殊的GCC选项编译程序:' - fprofile-arcs -ftest-coverage'。这告诉编译器生成gcov所需的附加信息(基本上是程序的流程图),还包括目标文件中的附加代码,用于生成gcov所需的额外分析信息。

更确切地说,通过引用Instrumentation Options,我对这两个标志的理解如下:

  • -fprofile-arcs生成指示您的程序的每个分支被占用多少次的信息;换句话说,这使您的程序生成与其执行相关的额外数据。该信息存储在 .gcda 文件中。
  • -ftest-coverage使用-fprofile-arcs生成的信息,并生成包含控制流信息的 .gcno 文件,Gcov可以使用这些文件生成人类可读的。 gcov 文件。如果没有使用-fprofile-arcs获得的测试覆盖率数据,您将无法获得任何有意义的信息。

-fprofile-arcs也可以与其他标记结合使用,例如-fbranch-probabilities(更多信息here)。通常,在使用此标志时,编译器会根据 .gcda 文件中包含的分析信息执行优化以改进分支预测。使用-fprofile-arcs-fbranch-probabilities时,系统会自动启用-fprofile-generate-fprofile-use(这是使用GCC执行配置文件引导优化的标准方法)。

希望这有帮助!

答案 1 :(得分:2)

如果您检查-fprofile-arcs -ftest-coverage,则会看到它生成的数据可用于两种不同的选项,具体取决于其他选项:-fbranch-probabilities-fprofile-arcs。< / p>

因此-ftest-coverage是生成执行检测和保存数据的代码。然后,您可以使用-fbranch-probabilities-ftest-coverage根据您要执行的分析来专门化数据。

它没有在任何地方说,但根据您的经验,如果没有提供专业化标志,GCC似乎默认为class A { public: virtual void Test() = 0; // abstract, has no implementation }; class B : public A { public: virtual void Test() {} // not abstract, has an implementation }; int main() { A a; // this will produce a compiler error. B b; // this is fine return 0; }