gcov为C语言生成的覆盖率为空

5

我正在尝试在Ubuntu上收集既包含C++又包含C代码的项目的代码覆盖率。

我使用'-fprofile-arcs'和'-ftest-coverage'作为CXXFLAGS和CFLAGS的值;使用'-lgcov'作为LINKFLAGS。

C语言项目的通用结构如下:

c_code\
     src
     unit_tests

src包含静态库的源代码。

unit_tests目录包含使用googletest框架编写的测试,例如各种类型的测试。

TEST_F(test_case_name, test_name) {
    some_gtest_assertions;
}

制作包含测试静态库的googletest二进制文件后启动。

构建并运行项目二进制文件将导致生成*.gcno和*.gcda文件。然而,我的C覆盖率结果为空(C++生成良好)。

lcov命令的格式如下:

lcov --capture --directory my_c_gcda_location --output-file c_coverage.info

通过lcov的日志,我们可以看到关于C相关的gcda文件的如下信息:

对于"my_c_gcda_location/*.gcda",gcov没有创建任何文件

还有一些错误信息如下:

*.gcda:与notes文件不匹配

我需要指定一些额外的参数或执行一些其他操作才能获得C的覆盖率结果吗?或者是什么原因导致了这些问题?


你需要提供“最小可验证代码”,展示my_c_gcda_location如何进行文件处理/创建,否则除了猜测之外,没有人能做任何事情。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建一个最小、完整和可验证的示例 - David C. Rankin
1个回答

7
当.gcda文件新于.gcno文件时,可能会出现“戳不匹配”的情况。
这通常有两个原因: 1. 在运行测试并生成跟踪文件之前重新构建了代码。 2. 二进制文件在一台机器上构建,而测试在另一台时间比构建机器早的机器上运行。
对于这两种情况,您只需要确保.gcda文件的创建时间大于.gcno和.c*文件即可。
您可以通过执行“touch *.gcda”,然后运行lcov命令来实现。

最终我找到了第二次重建被触发的地方(静态和共享库都被构建了)。关闭构建共享库(因为静态覆盖已经足够满足我的需求)解决了这个问题。 - Evgeny
2
触摸屏不起作用,看起来时间戳在实际文件内容中(而不是inode时间戳)。即hexdump -e'"%x \ n"'-s8-n4 myclass.gcda。请参见http://bobah.net/d4d/tools/code-coverage-with-gcov-Troubleshooting。 - Colby Blair

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