Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么GCC中的代码覆盖率需要传递两个编译器标志_C_Gcc_Code Coverage_Gcov - Fatal编程技术网

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

为什么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

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

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

如果检查
-fprofile弧
,您将看到它生成的数据可以用于两种不同的事情,具体取决于其他选项:
-ftest coverage
-fbranch probability

因此,
-fprofile arcs
将生成用于检测和保存数据的代码。然后使用
-ftest coverage
-fbranch probabilities
根据要执行的分析对数据进行专门化


它没有说任何地方,但根据您的经验,如果没有提供任何专门化标志,GCC默认为
-ftest coverage

如果您想使用Gcov工具在GCC中获得代码覆盖率,请参阅其中明确说明:

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

更确切地说,通过参考,我对这两面旗帜的理解如下:

  • -fprofile arcs
    生成指示程序的每个分支执行多少次的信息;换句话说,这会使程序生成与其执行相关的额外数据。信息存储在.gcda文件中
  • -ftest coverage
    使用
    -fprofile arcs
    生成的信息,并生成包含控制流信息的.gcno文件,Gcov可使用该文件生成人类可读的.Gcov文件。如果没有通过
    -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
进行覆盖率测试。