gcov和gcovr:编译后不生成.gcno文件



我正在尝试在我的windows系统单元测试项目中获得代码覆盖率。

描述使用-fprofile-arcs -ftest-coverage编译后,我发现生成了执行文件并且工作正常。但是,文件夹中没有任何.gcno文件。所以我不能通过gcovr正确输出覆盖率报告。

软件版本gcc 8.1.0/gcov 8.1.0/gcovr 5.1/python 3.10.2

步骤这是我在整个过程中所做的。如果有什么问题,请帮帮我。

  1. 一个文件夹中只有。c和。h文件

  2. 使用gcc编译我的项目

gcc -Wall -Wno-unknown-pragmas -fcompare-debug-second -fprofile-arcs -ftest-coverage -DUTEST AllTests.c CuTest.c BZR2.c BZR2_test.c -o beta.exe

  1. 然后在文件夹中找到beta.exe

  2. 运行beta.exe后,在命令行窗口中显示了我的测试结果(所有测试都通过了)。此外,还有。gcda文件与我的。c文件具有相同的文件名。

  3. 然后我运行gcovr -r .,结果如下所示。我认为gcovr不能显示覆盖信息的原因是我的项目编译后没有生成任何。gcno文件。但我不明白为什么和如何解决这个问题。

------------------------------------------------------------------------------
GCC Code Coverage Report
Directory: .
------------------------------------------------------------------------------
File                                       Lines    Exec  Cover   Missing
------------------------------------------------------------------------------
------------------------------------------------------------------------------
TOTAL                                          0       0    --%
------------------------------------------------------------------------------

谢谢你的时间!

删除-fcompare-debug-second选项。它用于调试编译器本身,并导致编译器

沉默警告,并省略其他可能导致编译器产生输出到文件或标准输出作为副作用的选项。

(参见:https://gcc.gnu.org/onlinedocs/gcc-8.5.0/gcc/Developer-Options.html)

创建gcno文件就是这样一个副作用。


一般提示:

您可以简单地使用--coverage选项来代替-fprofile-arcs -test-coverage

当您一次编译多个源文件时,GCC会尝试找出中间文件的文件名,并自动为次要输出(如gcno文件)派生一些名称。这曾经有点不直观,至少在GCC 11中实现了合理的行为之前是这样。

要单独编译所有文件,我们将使用结构:

OPTIONS="-Wall -Wno-unknown-pragmas --coverage -DUTEST"
# compile the individual compilation units
gcc -c $OPTIONS AllTests.c -o AllTests.o
gcc -c $OPTIONS BZR2.c -o BZR2.o
gcc -c $OPTIONS BZR2_test.c -o BZR2_test.o
# we should now have three gcno files
ls *.gcno
# link the final executable
gcc $OPTIONS CuTest.o BZR2.o BZR2_test.o -o beta.exe
在这一点上,通常使用构建系统是合适的,例如通过编写Makefile:
CFLAGS += -Wall -Wno-unknown-pragmas --coverage -DUTEST
SOURCES = AllTests.c BZR2.c BZR2_tests.c
OBJECTS = $(SOURCES:.c=.o)
beta.exe: $(OBJECTS)
$(CC) $(CFLAGS) $^ -o $@

最新更新