代码之家  ›  专栏  ›  技术社区  ›  mikelong

gcov警告:摘要的合并不匹配

  •  21
  • mikelong  · 技术社区  · 14 年前

    有谁能告诉我gcov消息“merge mismatch for summaries”是什么意思吗?我在gcc的源代码中找到了消息:

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

    这似乎是一个明智的检查,在 .gcda 文件匹配,但我不确定。有人知道怎么解决这个问题吗?

    1 回复  |  直到 10 年前
        1
  •  32
  •   richq luc    14 年前

    当链接到可执行文件的某个对象发生显著更改时,就会发生这种情况。例如,它获得或丢失一些可盈利的代码行。

    产生错误的最小情况是2个源文件。下面是两个名为main.c的示例源文件…

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

    还有东西

    /* 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 $@ $^
    

    生成文件的设置使编译 main.c -> main.o , stuff.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重新编译,并重新链接可执行文件。下次运行测试可执行文件时,将收到 McGDA 文件。stuff.gcda文件不受影响,因为它的对象文件已使用所有新的摘要信息重新创建。如果你重新编译 main.c 并重新链接可执行文件,然后错误消息消失。

    那么我们能做些什么呢?我很想知道!在我跑步的那一刻 find . -name '*.gcda' | xargs rm 每当我需要重新检查覆盖率,这是不是真的很理想。另一个解决方案是在使用概要分析“以防万一”时重新编译所有内容,但这似乎有点过头了。