【问题标题】:gcov warning: merge mismatch for summariesgcov 警告:摘要的合并不匹配
【发布时间】: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 文件中的标签是否匹配似乎是一个健全性检查,但我不确定。有谁知道如何解决这个问题?

【问题讨论】:

    标签: c gcc gcov


    【解决方案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 -&gt; main.ostuff.c -&gt; stuff.o,最后为stuff.o + main.o -&gt; testexe。如果我们使用-fprofile-arcs -ftest-coverage 选项编译和链接这些C 文件,那么可执行文件具有分析功能。运行该可执行文件,您将获得 2 个输出文件,main.gcdastuff.gcda。到目前为止一切顺利。

    现在将#if 0 行更改为#if 1。 Makefile 应该只导致 stuff.c 重新编译,并且可执行文件重新链接。下次运行测试可执行文件时,您将收到 ma​​in.gcda 文件的“Merge mismatch”消息。 stuff.gcda 文件不受影响,因为它的目标文件已使用所有新的摘要信息重新创建。如果您重新编译 main.c 并重新链接可执行文件,那么错误消息就会消失。

    那么可以做些什么呢?我很想知道!目前,每当我需要重新检查覆盖率时,我都会运行find . -name '*.gcda' | xargs rm,这并不理想。另一种解决方案是在“以防万一”的情况下使用分析时重新编译所有内容,但这似乎有点矫枉过正。

    【讨论】:

    • 太好了,感谢您提供的信息!很高兴终于了解这里发生了什么。解释也很棒。我有一个类似的解决方法 - 在运行之前删除所有生成的文件。我现在明白为什么会这样了,但我认为错误消息可以有所改进。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 2018-04-20
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    相关资源
    最近更新 更多