code-coverage - 如何将 gcovr 与 current/build/run 目录之外的源文件一起使用?

标签 code-coverage gcov gcovr

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 .

最佳答案

我从您的代码中了解到,您制作了所有内容并运行了程序,但您仍在目标文件所在的构建目录中。

所以,你需要明白的是:

gcovr -v -r <path>

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

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

希望它有所帮助。 :)

更新:
回来工作
您可以将覆盖数据位置作为纯 arg(无选项)提供,并将根指向您的源。
gcovr .../path/To/GCDA -r .../path/to/src/ [rest desired flags]

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

关于code-coverage - 如何将 gcovr 与 current/build/run 目录之外的源文件一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43934862/

相关文章:

visual-studio-2013 - Visual Studio 和 gtest 的代码覆盖率

gcovr - 如果cpp,gcno和gcda文件不在同一文件夹中,则GCovr会生成0%的覆盖率报告

javascript - 未收集覆盖信息, Istanbul 尔覆盖。 (页面中类似问题的答案对我不起作用)

android - 如何获取 android 仪器测试的代码覆盖率报告

C++使用gcov和lcov问题?

linux - gcov 过滤结果和文件

html - 当源文件位于其他目录中时,gcovr 不会创建详细报告

c++ - googletest移动构造函数覆盖

flutter - 如何忽略 `dart-lang/coverage` 中的一行

c# - 通过跳过代码覆盖的库函数进行单元测试