我理解两个编译器标志:需要传递 -ftest-coverage -fprofile-arcs 以获取GCC中的代码覆盖率。 我的问题是,有2个编译器标志来获得覆盖的原因是什么。另外,如果我们独立使用它们,我们能得到什么呢?
我尝试用-fprofile-arcs标志编译一个c程序。我没有发现任何差异。能够生成.gcno .gcda和gcov文件
答案 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;
}
。