对于gcov的输入,.cpp / .gcda / .gcno之间的任何差异

问题描述

gcov foo.gcdagcov foo.gcnogcov foo.cpp之间有区别吗?

根据official guide,我们必须将源文件foo.cppfoo.gcdafoo.gcno放在一起,然后使用gcov foo.cpp生成报告。 / p>

但是在CMake项目中,目标文件gcdagcno与源文件放在一个不同的文件夹中,如Question所示。因此,有时候很难找到源文件并移动它们(因为我正在计算 Pytorch项目的覆盖率)。然后,我尝试跳过.cpp,只是

gcov -i foo.gcda
CMake文件夹中的

,其中有foo.gcdafoo.gcnofoo.o。结果也显示出来。我想知道这个结果是否正确,还是我必须将相应的foo.cpp复制到此文件夹并按照官方文档的建议进行操作?

解决方法

运行此gcov -i foo.gcda时,将仅获得覆盖范围的输出。

例如: File 'foo.c' Lines executed:92.86% of 14 Creating 'foo.c.gcov'

您获得的覆盖率是完全正确的。唯一的区别是,当您不将源文件放在相同的目录命令中时:

gcov -a foo.gcda将失败,并显示Cannot open source file foo.c

这是因为使用-a标志,您可以获得每个基本块的单独执行计数,并且输出包含源代码以及每行执行的次数。如果只希望将coverage作为输出获取,则可以正常工作,但是如果您希望使用lcov之类的工具基于HTML的输出,那么该方法将不起作用,因为您将无法获取源代码。