0

我在这里遇到问题,没有在 gcovr 输出中获取 cpp 文件。实际上,我的主项目包含许多子 cpp 文件,但是它们位于不同的目录路径中。

目录布局:

  • D:\selv_ar\GCovTest\ado\cic\rc_actuator_switch\ulf\src(源目录)
    • test\devices\puu_driver\sw(主项目目录)
    • core\devices\puu_driver(子文件)
    • test\testtools(子文件)
    • test\devices\puu_driver(工作区)

我有一个简单的 hello world 程序,其中的文件main.cpphelloworld.hhelloworld.cpp位于同一目录中。

笔记:

  • 我正在编译到嵌入式目标debgcov_qnx660_qcc_x86并将 gcda 文件复制到与源文件相同的目录中。
  • 我正在从主项目目录运行 gcovr。

问题:

  • 当我为 hello world 程序创建覆盖率报告时,为什么它不显示该helloworld.h文件?

  • 当我为我的实际软件创建覆盖率报告时,它会显示主项目目录中文件的覆盖率。为什么它不显示子文件的覆盖范围?

  • 我应该从哪个目录运行 gcvor?主目录?源码目录?工作区?

  • 我应该把 gcda 文件放在哪里?进入主项目目录?进入子文件目录?

4

1 回答 1

1

当我为 hello world 程序创建覆盖率报告时,为什么它不显示 helloworld.h 文件?

Gcovr 仅在文件包含可执行代码时才报告该文件。头文件通常只包含声明,而不包含函数定义。您可以通过在 --verbose 模式下运行 gcovr 来检查该文件是否被看到。

一些 GCC 版本有一个错误,因此即使它们包含可执行代码,也不会报告覆盖率为零的文件。有关修复此问题的编译器版本,请参阅gcvor FAQ [1]

[1]:抱歉,gcovr.com 主网站目前已关闭。

当我为我的实际软件创建覆盖率报告时,它会显示主项目目录中文件的覆盖率。为什么它不显示子文件的覆盖范围?

Gcovr 尝试过滤掉与您的项目无关的覆盖率数据,例如标准库的覆盖率数据。

  • -f如果文件路径与/匹配,Gcovr 仅保留覆盖率数据--filter
  • 如果没有给出过滤器,则路径必须在-r/--root目录中。
  • 如果没有--root明确提供,则使用当前工作目录。

因此,当您运行不带--filteror之类的参数--root的 gcovr 时,gcovr 将仅显示当前工作目录中文件的覆盖范围。

要解决此问题,请提供一个根路径,其中包含您想要覆盖的所有目录,例如--root ../--root D:/selv_ar/GCovTest/ado/cicrc_actuator_switch/ulf/src

或者,您可以提供与您感兴趣的所有文件匹配的过滤器。请注意,过滤器是正则表达式,因此您需要转义特殊字符,例如.. 此外,对正则表达式中的路径使用正斜杠。shell 语法示例:

$ gcovr --root . \
    -f 'D:/selv_ar/GCovTest/ado/cicrc_actuator_switch/ulf/src/(test|core)/devices/puu_driver/' \
    -f 'D:/selv_ar/GCovTest/ado/cicrc_actuator_switch/ulf/src/test/testtools/'

确保您使用的是 gcovr 版本 4 或更高版本,以便过滤器在 Windows 上正常工作。如果要使用--root ../样式路径,则应使用 gcovr 4.2(尚未发布,同时从 GitHub 安装开发版本)。

我应该从哪个目录运行 gcvor?主目录?源码目录?工作区?

在可能的情况下,gcovr 应该在运行 GCC 的同一目录中运行。这通常意味着您的构建目录。如果 GCC 在多个目录中运行,请尝试使用所有这些目录的父目录。使用--root--filter和 search path 参数为源代码和 gcda 文件提供合适的路径。

我应该把 gcda 文件放在哪里?进入主项目目录?进入子文件目录?

这些.gcda文件必须放在编译器生成的相应.o目标文件和文件旁边。.gcno这很重要,这样才能找到正确的源文件。

如果您使用交叉编译,则收集有效的覆盖数据可能会更加复杂。如果您遇到问题,请阅读 GCC 文档的“Cross-Profiling”一章中的GCOV_PREFIX和gcovr 问题 #259

Gcovr 在搜索路径中搜索 gcda 文件:您传递给 gcovr 的任何(未命名)参数。例如,gcovr --root foo bar qux指定两个搜索路径barqux. 默认情况下,gcovr 搜索当前工作目录的所有子目录。

于 2019-04-05T20:42:05.963 回答