为什么需要为GCC中的代码覆盖传递两个编译器标志
我了解两个编译器标志: -ftest-coverage -fprofile-arcs需要传递给GCC中的代码覆盖。 我的问题是,有2个编译器标志获得覆盖的原因是什么? 另外,如果我们独立使用它们,我们会得到什么?
我试着用-fprofile-arcs标志编译ac程序。 我没有注意到任何差异。 能够生成.gcno .gcda和gcov文件
如果您查看-fprofile-arcs
的文档,您将看到它生成的数据可以用于两种不同的事情,具体取决于其他选项: -ftest-coverage
和-fbranch-probabilities
。
所以-fprofile-arcs
是生成检测和保存数据的代码。 然后,您可以使用-ftest-coverage
或-fbranch-probabilities
来根据您要执行的分析对数据进行专门化。
它没有说任何地方,但从你的经验看,如果没有提供专门化标志,GCC似乎默认为-ftest-coverage
。
如果您想使用Gcov工具获取GCC中的代码覆盖范围,请参阅本文档,其中明确指出:
使用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
(这里有更多信息)。 通常,在使用此标志时,编译器将根据.gcda文件中包含的分析信息执行优化以改善分支预测。 使用-fprofile-generate
和-fprofile-use
(这是使用GCC执行配置文件引导优化的标准方式)时,会自动启用-fprofile-arcs
和-fbranch-probabilities
。
希望这可以帮助!
链接地址: http://www.djcxy.com/p/37971.html上一篇: Why two compiler flags needs to be passed for code coverage in GCC