21

谁能告诉我 gcov 消息“合并不匹配摘要”是什么意思?我在这里的 gcc 源代码中找到了该消息:

http://www.opensource.apple.com/source/gcc/gcc-5646/gcc/libgcov.c

文件中的标签是否匹配似乎是一个健全性检查.gcda,但我不确定。有谁知道如何解决这个问题?

4

1 回答 1

35

当您链接到可执行文件的对象之一发生重大变化时,就会发生这种情况。例如,它获得或失去了一些可分析的代码行。

产生错误的最小情况是使用 2 个源文件。以下是 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.ostuff.c -> stuff.o最后stuff.o + main.o -> testexe。如果我们使用选项编译并链接这些 C 文件,-fprofile-arcs -ftest-coverage则可执行文件具有分析功能。运行该可执行文件,您将获得 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每当我需要重新检查覆盖率时,我都会运行,这并不是很理想。另一种解决方案是在“以防万一”的情况下使用分析时重新编译所有内容,但这似乎有点矫枉过正。

于 2010-04-20T20:25:19.693 回答