gcov 为 c 生成空覆盖

Evg*_*eny 4 c linux code-coverage gcov lcov

我正在尝试为在 Ubuntu 上同时具有 c++ 和 c 代码的项目收集代码覆盖率。

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

常见的C项目结构是:

c_code\
     src
     unit_tests
Run Code Online (Sandbox Code Playgroud)

src 包含静态库的来源。

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

TEST_F(test_case_name, test_name) {
    some_gtest_assertions;
}
Run Code Online (Sandbox Code Playgroud)

在构建 googletest 二进制文件之后,该二进制文件应该包含要在其中进行测试的静态库。

项目二进制文件的构建和运行会生成 *.gcno 和 *.gcda 文件。但是我的 C 覆盖结果是空的(C++ 生成良好)。

lcov 命令具有以下格式:

lcov --capture --directory my_c_gcda_location --output-file c_coverage.info
Run Code Online (Sandbox Code Playgroud)

lcov 的日志显示了与 C 相关的 gcda 文件的以下内容:

gcov 没有为“my_c_gcda_location/*.gcda”创建任何文件

也有种类错误:

*.gcda:邮票与笔记文件不匹配

Should I specify some additional parameters or perform some additional actions to get coverage results for C? Or what can be the reason of these issues?

Bal*_*san 6

当 .gcda 文件比 .gcno 文件新时,您可能会遇到“标记不匹配”。

发生这种情况主要有两个原因: 1. 您可能在运行测试之后和生成跟踪文件之前重新构建了代码。2. 二进制文件可能在一台机器上构建,而测试在另一台机器上运行,其时间比构建机器早。

对于这两种情况,您只需确保 .gcda 的文件创建时间大于 .gcno 和 .c* 文件。

您可以通过执行“touch *.gcda”然后运行 ​​lcov 命令来做到这一点。

  • touch 不起作用,看起来时间戳在实际文件内容中(相对于 inode 时间戳)。即`hexdump -e '"%x\n"' -s8 -n4 myclass.gcda`。请参阅 http://bobah.net/d4d/tools/code-coverage-with-gcov - 故障排除。 (2认同)