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

Why two compiler flags needs to be passed for code coverage in GCC

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

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

如果您在 the documentation 中检查 -fprofile-arcs,您会发现它生成的数据可用于两种不同的用途,具体取决于其他选项:-ftest-coverage-fbranch-probabilities .

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

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

如果您想使用 Gcov 工具来获取 GCC 中的代码覆盖率,请参阅 this documentation,其中明确指出:

When using gcov, you must first compile your program with two special GCC options: ‘-fprofile-arcs -ftest-coverage’. This tells the compiler to generate additional information needed by gcov (basically a flow graph of the program) and also includes additional code in the object files for generating the extra profiling information needed by 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 时自动启用(这是执行 Profile-Guided Optimisation 的标准方式海湾合作委员会)。

希望对您有所帮助!