GCOV:为什么sample.gcda 和 sample.gcno 可能不同

  • 本文关键字:sample gcno gcda GCOV gcov
  • 更新时间 :
  • 英文 :


起初我把消息sample.gcda:stamp mismatch with graph file

  1. 遵守编译和运行的顺序
  2. hexdump -e '"%xn"' -s8 -n4 sample.gcno -> aaa1aaaa hexdump -e '"%xn"' -s8 -n4 sample.gcda -> bbb2bbbb

图章与图形文件不匹配

表示图形文件在构建二进制文件后已再次编译。

如果编译顺序正确,则可以尝试检查是否存在示例的编译.cpp在构建规则中的某处两次。

例如,我们有这样的东西:

G++ ...样品.cpp -o 样品

g++ ... -共享示例.cpp -o sample2.o

因此,一个文件被编译两次。这将导致 gcno 文件将被新的时间戳更新,该时间戳将不再与 gcda 文件匹配。

如果您彻底和手动地执行了产品或应用程序测试,并花费了大量精力。如果您的目标是使用 lcov 和 gcov 获取代码覆盖率报告,但错误地删除了 gcno 文件。您可以通过重新编译代码来重新生成 gcno 文件,但它将使用新的时间戳和 gcov 报告错误,指出"图章与图形文件不匹配",并且不会生成代码覆盖率报告。这将导致您的所有测试工作被浪费。

有一个快捷方式可以仍然生成代码覆盖率报告。这只是一种解决方法,不应一直依赖。建议保留 *.gcno 文件,直到测试完成。

记下您的 gcc 版本(gcc -v) 并从其中一个镜像站点下载其源代码例如 - ftp://gd.tuwien.ac.at/gnu/sourceware/gcc/releases/gcc-4.4.6/gcc-4.4.6.tar.bz2

解压缩下载的文件后,gcc的文件夹结构将如下所示GCC-4.4.6GCC-4.4.6/GCC

如果您直接进入 gcc-4.4.6/gcc 并尝试从那里执行 ./configure 和编译(make),那么您会遇到以下问题build/genmode -h> tmp-modes.h/bin/sh: build/genmodes: 没有这样的文件或目录

解决方案是从 gcc-4.4.6 进行 ./configure 和制造,不会显示与 genmode 相关的错误。这将编译包括 gcc 在内的所有模块。您可能需要安装 gcc 需要的 mpfr 和 gmp 模块,如果 ./configure 显示任何错误

转到 gcc-4.4.6/gcc/gcov.c 并在行下注释,然后使用上述命令重新编译

/*  if (tag != bbg_stamp)
    {
      fnotice (stderr, "%s:stamp mismatch with graph filen", da_file_name);
      goto cleanup;
    }*/

编译后新 gcov 二进制文件的示例路径是 gcc-4.4.6/host-x86_64-unknown-linux-gnu/gcc/gcov

将此二进制文件放在/usr/bin 中,并使用命令重新生成代码覆盖率报告,如以下示例所示lcov --capture --directory ./--output-file coverage.info ;Genhtml coverage.info --output-directory/var/www/html/coverage

现在,您不应该收到"图章与图形文件不匹配"错误,您将正确获得代码覆盖率报告

最新更新