gcov 警告:摘要的合并不匹配
Posted
技术标签:
【中文标题】gcov 警告:摘要的合并不匹配【英文标题】:gcov warning: merge mismatch for summaries 【发布时间】:2011-02-05 03:44:17 【问题描述】:谁能告诉我 gcov 消息“Merge mismatch for summaries”是什么意思?我在这里的 gcc 源代码中找到了该消息:
http://www.opensource.apple.com/source/gcc/gcc-5646/gcc/libgcov.c
.gcda
文件中的标签是否匹配似乎是一个健全性检查,但我不确定。有谁知道如何解决这个问题?
【问题讨论】:
【参考方案1】:当您链接到可执行文件的对象之一发生重大变化时,就会发生这种情况。例如,它获得或失去了一些可分析的代码行。
产生错误的最小情况是使用 2 个源文件。以下是两个名为 main.c 的示例源文件...
/* main.c */
int do_stuff(int value);
int main(int argc, const char *argv[])
do_stuff(argc);
return 0;
还有东西.c
/* stuff.c */
#include <stdio.h>
#if 0
int more_stuff()
int i;
i = 0;
return i;
#endif
int do_stuff(int value)
if (value > 1)
printf("Value > 1\n");
else
printf("Value <= 1\n");
return 0;
他们做什么并不重要。要构建它们,这里有一个简单的 Makefile:
CFLAGS := -fprofile-arcs -ftest-coverage
LDFLAGS := -fprofile-arcs -ftest-coverage
testexe: main.o stuff.o
$(CC) $(LDFLAGS) -o $@ $^
Makefile 设置为编译为main.c -> main.o
、stuff.c -> stuff.o
,最后为stuff.o + main.o -> testexe
。如果我们使用-fprofile-arcs -ftest-coverage
选项编译和链接这些C 文件,那么可执行文件具有分析功能。运行该可执行文件,您将获得 2 个输出文件,main.gcda
和 stuff.gcda
。到目前为止一切顺利。
现在将#if 0
行更改为#if 1
。 Makefile 应该只导致 stuff.c 重新编译,并且可执行文件重新链接。下次运行测试可执行文件时,您将收到 main.gcda 文件的“Merge mismatch”消息。 stuff.gcda 文件不受影响,因为它的目标文件已使用所有新的摘要信息重新创建。如果您重新编译 main.c
并重新链接可执行文件,那么错误消息就会消失。
那么可以做些什么呢?我很想知道!目前,每当我需要重新检查覆盖率时,我都会运行find . -name '*.gcda' | xargs rm
,这并不理想。另一种解决方案是在“以防万一”的情况下使用分析时重新编译所有内容,但这似乎有点矫枉过正。
【讨论】:
太好了,感谢您提供的信息!很高兴终于了解这里发生了什么。解释也很棒。我有一个类似的解决方法 - 在运行之前删除所有生成的文件。我现在明白为什么会这样了,但我认为错误消息可以有所改进。以上是关于gcov 警告:摘要的合并不匹配的主要内容,如果未能解决你的问题,请参考以下文章