使用gcvor获取其他目录中文件的覆盖率

时间:2019-03-29 15:36:43

标签: gcovr

我在这里遇到问题,在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文件放在哪里?进入主项目目录?进入子文件目录?

1 个答案:

答案 0 :(得分:0)

  

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

Gcovr仅在文件包含可执行代码的情况下报告。头文件通常仅包含声明,但不包含函数定义。您可以通过在--verbose模式下运行gcovr来检查该文件是否可见。

某些GCC版本存在错误,因此即使包含可执行代码,也不报告覆盖率为零的文件。有关解决此问题的编译器版本,请参见the gcvor FAQ [1]

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

  

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

Gcovr尝试过滤出与项目无关的coverage数据,例如标准库的coverage数据。

  • 仅当文件路径由-f / --filter匹配时,Gcovr才会保留coverage数据。
  • 如果未提供过滤器,则该路径必须位于-r / --root目录中。
  • 如果未明确提供--root,则使用当前工作目录。

因此,当您运行不带--filter--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?主目录?源目录?工作区?

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

  

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

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

如果使用交叉编译,则收集有效的覆盖率数据可能会更加复杂。如果遇到问题,请阅读“Cross-Profiling” chapter of the GCC docsgcovr issue #259中的有关GCOV_PREFIX的信息。

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