在使用`--coverage`时,如何在`gcc` 11中更改`.gcno`文件的前缀,使其与`gcov`期望的匹配?

3

我正在为我的C项目添加代码覆盖率。 我遵循的过程如下:

# compile a .c file, expecting two new files "a.out" and "main.gcno"
gcc --coverage main.c

# run executable to get coverage data, expecting to create a new "main.gcda" file
./a.out

# use `gcov` to get formatted reports
gcov main.c

当我使用版本为10.3.0的gcc时,所有这些都按预期工作,没有问题。然而,当我使用版本为11.1.0的gcc时,main.gcnomain.gcda文件的名称不同,这会破坏下面解释的流程。
使用gcc --coverage main.c生成两个文件:a.outa-main.gcno。然后运行可执行文件./a.out会创建一个新文件a-main.gcda。请注意覆盖文件上的前缀a-。在运行下一个命令gcov main.c时,我会得到以下错误:
main.gcno:cannot open notes file
main.gcda:cannot open data file, assuming not executed

因为它正在寻找文件 main.gcnomain.gcda,但是找不到这些文件。
为什么新版本的 gcc 会这样做呢?我在网上阅读的所有内容都假定编译器的输出应该与同一源文件上运行的 gcov 同步。我找不到任何更改覆盖率文件的输出名称的方法。
如果有帮助的话,我还注意到 a- 前缀取决于输出名称。因此,如果指定了输出名称 (gcc --coverage main.c -o test),则覆盖率文件将具有该前缀 (test-main.gcnotest-main.gcda)。
我还尝试手动重命名文件以删除前缀,gcov 似乎对此很满意。问题是,我正在尝试自动化这个过程,我需要比尝试猜测编译器用于覆盖率文件的输出名称更稳健的方法。
参考资料,我也在使用版本 11.1.0gcov。我不清楚这是否与相同版本的 gcc 有关。

我会检查11.1的错误报告和11.2的发布说明。这似乎是一个简单的疏忽,很快就会被报告并修复。 - user3386109
@user3386109 我看了一下GCC 11 Release Series,关于代码覆盖率,我只发现了一些优化,除非我漏掉了什么。我会找出最好的报告方式。 - TomTsagk
1个回答

4
新版本的gcc为什么会这样做?
请参阅GCC 11的发行说明,特别是注意事项的第三个项目,其中开始写着“辅助和转储输出文件的命名和位置已更改”。
我在网上阅读的所有内容都假定编译器的输出应与在同一源文件上运行时的gcov保持同步。我找不到任何更改覆盖文件输出名称的方法。
如发行说明所述,您需要使用-dumpbase选项。要删除任何前缀,请使用-dumpbase''。
我不确定gcov是否应该进行更新,或者gcc-11的更改是否不应影响覆盖文件。编辑:这是预期的行为。
另一个解决方案是分别进行编译和链接两个步骤。
gcc --coverage main.c -c
gcc --coverage main.o

这样覆盖率数据文件就不会有前缀,gcov 会按预期找到它们。

这正是我一直在寻找的。我已经测试过它,它按照描述的方式工作。如果您不介意我问一下,使用“-dumpbase''”会影响不同/旧编译器吗?例如,我尝试了clang,它忽略了它,但仍然按预期工作。我之所以问这个问题,是因为这计划成为CD/CI流程的一部分,并且可能在许多不同的机器上运行。 - TomTsagk
不确定,抱歉。 - Jonathan Wakely

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接