为什么GCC中的代码覆盖率需要传递两个编译器标志
我了解两个编译器标志:-ftest coverage-fprofile arcs需要传递才能在GCC中获得代码覆盖率。 我的问题是,使用2个编译器标志来获得覆盖率的原因是什么。另外,如果我们独立使用它们,我们能得到什么 我试着用-fprofile arcs标志编译一个c程序。我没有注意到任何差异。能够生成.gcno.gcda和gcov文件如果检查为什么GCC中的代码覆盖率需要传递两个编译器标志,c,gcc,code-coverage,gcov,C,Gcc,Code Coverage,Gcov,我了解两个编译器标志:-ftest coverage-fprofile arcs需要传递才能在GCC中获得代码覆盖率。 我的问题是,使用2个编译器标志来获得覆盖率的原因是什么。另外,如果我们独立使用它们,我们能得到什么 我试着用-fprofile arcs标志编译一个c程序。我没有注意到任何差异。能够生成.gcno.gcda和gcov文件如果检查-fprofile弧,您将看到它生成的数据可以用于两种不同的事情,具体取决于其他选项:-ftest coverage和-fbranch probabil
-fprofile弧
,您将看到它生成的数据可以用于两种不同的事情,具体取决于其他选项:-ftest coverage
和-fbranch probability
因此,-fprofile arcs
将生成用于检测和保存数据的代码。然后使用-ftest coverage
或-fbranch probabilities
根据要执行的分析对数据进行专门化
它没有说任何地方,但根据您的经验,如果没有提供任何专门化标志,GCC默认为
-ftest coverage
。如果您想使用Gcov工具在GCC中获得代码覆盖率,请参阅其中明确说明:
使用gcov时,必须首先使用两个特殊的GCC选项编译程序:'-fprofile arcs-ftest coverage'。这告诉编译器生成gcov所需的附加信息(基本上是程序的流程图),并在目标文件中包含用于生成gcov所需的附加分析信息的附加代码
更确切地说,通过参考,我对这两面旗帜的理解如下:
生成指示程序的每个分支执行多少次的信息;换句话说,这会使程序生成与其执行相关的额外数据。信息存储在.gcda文件中-fprofile arcs
使用-ftest coverage
生成的信息,并生成包含控制流信息的.gcno文件,Gcov可使用该文件生成人类可读的.Gcov文件。如果没有通过-fprofile arcs
获得的测试覆盖率数据,您将无法获得任何有意义的结果-fprofile arcs
-fprofile arcs
还可以与其他标志组合,例如-fbranch probabilities
(更多信息)。通常,使用此标志时,编译器会根据.gcda文件中包含的分析信息执行优化以改进分支预测<当使用-fprofile generate
和-fprofile use
时,会自动启用code>-fprofile arc和-fbranch probability
(这是使用GCC执行配置文件引导优化的标准方法)
希望这有帮助 你有没有想过这些选项,看看它们到底在做什么?是的,我已经看过这些文件了。。但不清楚为什么有两个标志,当一个标志(-fprofile arcs)起作用时,当
-fprofile arcs
和-ftest coverage
用于gcov
时,是否有义务使用g++
和-O0
(无优化)标志?对于这种情况,使用-O0
;但我不确定如果改用-O3
会有什么不同?很抱歉,我发现建议使用-O0
进行覆盖率测试。