GCOV版本不匹配-期望700e,得到408R。

5

在一个安装有GCC 4.4.7/GCOV 4.4.7的服务器上,我成功地运行了测试。然而,在另一台安装有GCC 4.8.5/GCOV 4.8.5的服务器上,运行测试会导致以下错误:

profiling:/path/to/foo.gcda:Version mismatch - expected 700e got 408R

以下是版本输出:

$ gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36)

$ gcov --version
gcov (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36)

在寻找此错误时,似乎经常是由于gcc和gcov之间版本不匹配引起的,但我的版本是相同的。

我们最近将该服务器上的gcc从4.4.7升级到4.8.5,这个问题似乎是由升级引起的。

我应该提到我正在测试Python C扩展,我认为这与测试普通的C应用程序有点不同。

我执行以下操作:

export CFLAGS="--coverage"
python setup.py build_ext --inplace
python tests.py

在两台服务器上,第二个命令会适当地创建 .gcno 文件。
在版本为 4.4.7 的服务器上,第三个命令将成功创建 .gcda 文件。但是版本为 4.8.5 的服务器会打印出错误信息。

1
既然你说最近升级了工具链,那么你的测试是否有可能针对部分或全部由旧工具链构建的对象运行? - John Bollinger
@JohnBollinger,Python3的安装显然是由之前版本的GCC构建的 - 我应该重新安装它吗? - Matthew Moisen
@JohnBollinger 我已经删除并重新安装了带有当前版本gcc的python3,但是没有成功。 - Matthew Moisen
1
除非 Python 解释器是正在测试的代码,但我不认为是这种情况。这不排除 Python 会有所影响,但我所说的是您正在构建和测试的扩展,该扩展配备了覆盖率分析工具。确保从源代码中干净地构建它。为此,请注意它可能依赖的任何静态库。 - John Bollinger
@JohnBollinger,明白了,谢谢。这个C扩展所依赖的主要静态库在此服务器上还没有重新编译。我会尝试在另一台已经编译好的升级过的服务器上进行测试,并告诉你结果。 - Matthew Moisen
@JohnBollinger 在另一台服务器上它可以工作,我知道那里的库已经使用新版本的GCC重新编译过。我非常确定你是正确的- 你能否发表一个答案? - Matthew Moisen
1个回答

7
一些GCC版本中生成的覆盖率工具不完全兼容,因此进行版本控制。错误信息似乎表明您正在使用一种工具链版本对至少部分由不同版本构建的工件和工具进行覆盖率分析。
要解决此问题,您应确保所有有关覆盖相关构件(包括任何库)以及其他构建产物都是通过同一版本的工具链生成的。完全干净的重建被测试组件的源代码,包括任何已经过仪器化的库(无论是否属于相同的构建),就可以解决这个问题。但是,重新构建未用于覆盖率测试的二进制文件可能是不必要的。

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