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 -&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,这并不理想。另一种解决方案是在“以防万一”的情况下使用分析时重新编译所有内容,但这似乎有点矫枉过正。

【讨论】:

太好了,感谢您提供的信息!很高兴终于了解这里发生了什么。解释也很棒。我有一个类似的解决方法 - 在运行之前删除所有生成的文件。我现在明白为什么会这样了,但我认为错误消息可以有所改进。

以上是关于gcov 警告:摘要的合并不匹配的主要内容,如果未能解决你的问题,请参考以下文章

C++ 使用 gcov 和 lcov 的问题?

警告 Prop `href` 不匹配

我该如何处理这个警告:哈希不匹配?

警告:UICollectionViewFlowLayout 已缓存索引路径“abc”的帧不匹配

警告 MSB3270:项目的处理器架构不匹配

react-select:如何解决“警告:道具`id`不匹配”