【问题标题】:How to use gcovr with source files outside the current/build/run directory?如何将 gcovr 与当前/build/run 目录之外的源文件一起使用?
【发布时间】:2017-10-11 14:30:04
【问题描述】:
mkdir -p /tmp/build &&
cd /tmp/build &&
mkdir -p /tmp/src &&
echo "int main(){return 0;}" > /tmp/src/prog.c &&
gcc --coverage -o prog /tmp/src/prog.c &&
./prog &&
gcovr -v -r .

将输出一个空报告。

Scanning directory . for gcda/gcno files...
Found 2 files (and will process 1)
Processing file: /tmp/build/prog.gcda
Running gcov: 'gcov /tmp/build/prog.gcda --branch-counts --branch-probabilities --preserve-paths --object-directory /tmp/build' in '/tmp/build'
Finding source file corresponding to a gcov data file
  currdir      /tmp/build
  gcov_fname   #tmp#src#prog.c.gcov
               ['        -', '    0', 'Source', '/tmp/src/prog.c\n']
  source_fname /tmp/build/prog.gcda
  root         /tmp/build
  fname        /tmp/src/prog.c
Parsing coverage data for file /tmp/src/prog.c
  Filtering coverage data for file /tmp/src/prog.c
Gathered coveraged data for 0 files
------------------------------------------------------------------------------
                           GCC Code Coverage Report
Directory: .
------------------------------------------------------------------------------
File                                       Lines    Exec  Cover   Missing
------------------------------------------------------------------------------
------------------------------------------------------------------------------
TOTAL                                          0       0    --%
------------------------------------------------------------------------------

但是如果我手动运行

gcov /tmp/build/prog.gcda --branch-counts --branch-probabilities --preserve-paths --object-directory /tmp/build

我得到正确的结果

File '/tmp/src/prog.c'
Lines executed:100.00% of 1
No branches
No calls
Creating '#tmp#src#prog.c.gcov'

似乎gcovr 没有从其他正确的gcov 输出中提取覆盖范围。仅当源文件位于当前目录之外(与构建目录相同、与输出目录相同、与运行目录相同)并且使用源文件的绝对路径调用 gcc ics 时才会发生这种情况。

我该如何解决这个问题?

编辑

在上游 gcovr 中修复了相对路径,但看起来像绝对路径的错误。

https://github.com/gcovr/gcovr/issues/169

【问题讨论】:

  • 您应该直接在问题中解释目录结构,而不是提供所有这些mkdir。解释 obj 和源文件的放置位置
  • @Vikas 如果有可重现问题的可运行代码,我会更喜欢它。 (至少如果问题是这种“错误或用户错误?”)

标签: code-coverage gcov gcovr


【解决方案1】:

我从您的代码中了解到的是,您完成了所有工作并运行了程序,但您仍然位于目标文件所在的构建目录中。

所以,你需要了解的是:

gcovr -v -r <path>

这个-r 标志采用根目录,这意味着源目录和对象目录所在的父目录。这样它就可以同时跟踪它们并生成覆盖率数据以及您希望它生成的任何其他内容。
尝试这样做,它会工作。

为了您的理解:

编译后生成的.gcno 文件只是该特定源文件的流程图类型的数据。
然后稍后当您执行程序时,将为每个源文件生成一个.gcda 文件。该文件包含真实的覆盖率数据,但对于 gcovr,这三个文件都是必需的(.gcno、.gcda、sourceFile)

希望它有所帮助。 :)

更新:
回到工作中
您可以将覆盖数据位置作为纯 arg(无选项)提供,并将根指向您的源。

gcovr .../path/To/GCDA -r .../path/to/src/ [rest desired flags]

这肯定会解决您的问题。
在报道我的项目时为我工作。

【讨论】:

  • .gcno 文件已经包含可以找到源的路径。 (对 .gcno 文件执行 strings。)
  • 最好将源代码和构建目录分开,因此 gcovr 应该支持这一点。
  • 是的,我这里说的是根目录。其中包含构建和源目录。此外,始终在路径中的最后一个目录名称后添加一个额外的斜杠。
  • 我明白,但我想在 Makefile 中使用 gcovr,并且我不想对我正在构建的位置做出任何假设。 (如何计算那个公共根目录?如果它包含更多不相关的源和 gcov 文件怎么办?这里是/tmp/,我真的想提供所有/tmp/ int gcovr 吗?!?不!) - 虽然我正在这样做,lcov 似乎是解决我问题的最佳解决方案。 (在构建目录中工作,通过(有效地)检查 .gcno 文件来查找源代码。)
  • 我已经为几个使用cmake的大型项目完成了它。我通过在命令中传递--coverage 标志来进行构建,以便它与通常的构建cmake 文件一起使用。有数千个源文件,所以我必须给出最接近的父目录,其中包含 objsrc 目录。 gcovr 跟踪所有gcda 文件,然后只跟踪与所有gcda 相关的源文件
【解决方案2】:

Gcovr 只会为您项目中的源文件生成报告。这是为了排除库标题等的覆盖范围。

问题是,您的项目中有哪些文件?这是由-r 根路径决定的。

如果您在 /tmp/build 中并且 root 是 . aka /tmp/build 并且源文件是 /tmp/src/prog.c,那么该源文件显然在您的项目之外。在详细输出中,gcovr 将报告Filtering coverage data for file /tmp/src/prog.c

如果您在 /tmp/build 中并且 root 是 .. aka /tmp 并且源文件是 /tmp/src/prog.c,那么该源文件在项目中。

如果你在/tmp/build 并且root 是. 又名/tmp/build 并且源文件是../src/prog.c,那么gcovr 似乎做了一些有问题的事情:它将文件名与当前目录连接并检查它。所以我们实际上看到了/tmp/build/../src/prog.c。就 gcovr 而言,这在您的项目中。似乎这种行为对于包含符号链接到项目中的代码是必要的。

您可以禁用“是项目中的源吗?”通过提供您自己的更好的过滤器进行过滤。例如,您可以要求 gcovr 仅报告 /tmp/src 下来源的覆盖率:

gcovr -r . -f /tmp/src

【讨论】:

    猜你喜欢
    • 2012-04-18
    • 1970-01-01
    • 2011-03-10
    • 2021-10-22
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多