gcov警告:总结合并不匹配

21

有人能告诉我 "Merge mismatch for summaries" 这个 gcov 信息是什么意思吗?我在 gcc 源代码中找到了这个消息。

它似乎是一个检查,用于确保 .gcda 文件中的标记匹配,但我不确定。 有人知道如何解决这个问题吗?

1个回答

35

当您将一个对象链接到可执行文件中时,如果该对象发生了显著变化,例如增加或减少了一些可分析代码行,则会出现此问题。

产生错误的最小示例是使用2个源文件。以下是两个示例源文件,称为main.c...

/* main.c */
int do_stuff(int value);

int main(int argc, const char *argv[])
{
    do_stuff(argc);
    return 0;
}

还有 stuff.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.ostuff.c -> stuff.o,最终 stuff.o + main.o -> testexe。如果使用 -fprofile-arcs -ftest-coverage 选项编译和链接这些 C 文件,则可生成具有分析数据的可执行文件。运行该可执行文件将获得两个输出文件,main.gcdastuff.gcda。到此为止一切都很好。
现在将 #if 0 改为 #if 1。Makefile 应只重新编译 stuff.c 并重新链接可执行文件。下次运行测试可执行文件时,main.gcda 文件会出现“Merge mismatch”消息。 stuff.gcda 文件不受影响,因为其对象文件已经用所有新的摘要信息重新创建。如果重新编译 main.c 并重新链接可执行文件,则错误消息消失。
那么应该怎么做呢?我很想知道!目前,每当需要重新检查覆盖范围时,我就运行 find . -name '*.gcda' | xargs rm,但这并不是理想的解决方案。另一个解决方案是在使用分析数据时重新编译所有内容,“以防万一”,但这似乎有点过度了。

1
太好了,谢谢提供这些信息!终于明白这里发生了什么。解释得非常好。我之前也有类似的解决方法——在运行之前删除所有生成的文件。现在我明白了为什么这样做有效,但我认为错误信息还有改进的空间。 - mikelong

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