c - gcov 警告 : merge mismatch for summaries

标签 c gcc gcov

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

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

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

最佳答案

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

产生错误的最小情况是有 2 个源文件。这里有 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 文件,那么可执行文件就会进行分析。运行该可执行文件,您将获得 2 个输出文件,main.gcdastuff.gcda。到目前为止一切顺利。

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

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

关于c - gcov 警告 : merge mismatch for summaries,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2590794/

相关文章:

c - UNIX 域套接字 (PF_UNIX) 上的 send() 失败并出现 ENOBUFS 错误

c - 如何改变C程序中SIGTERM的含义

c - fscanf 上的段错误(核心已转储)

c++ - 在 Eclipse 上安装 pdcurses

c++ - 如何正确设置SonarQube cfamil.gcov?

c - 如何使用 swapcontext() 恢复函数的执行(而不是再次启动)?

c++ - Gcc 扩展或宏,用于在编译时检查某些基本类型所使用的位

c - gcc 检查文件是否是主文件 (#if __BASE_FILE__ == __FILE__)

gcov - lcov 无法正常覆盖

objective-c - 如何在已安装的 Cocoa 应用程序上运行 Gcov?