有谁能告诉我gcov消息“合并错误摘要”是什么意思?我在gcc源代码中找到了这条消息:
http://www.opensource.apple.com/source/gcc/gcc-5646/gcc/libgcov.c
.gcda
文件中的标签似乎是一个完整性检查,但我不确定。任何人都知道如何解决这个问题?
答案 0 :(得分:33)
当您链接到可执行文件的其中一个对象发生显着变化时,就会发生这种情况。例如,它会获得或丢失一些可用的代码。
产生错误的最小情况是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.o
,stuff.c -> stuff.o
,最后为stuff.o + main.o -> testexe
。如果我们使用-fprofile-arcs -ftest-coverage
选项编译和链接这些C文件,则可执行文件具有分析功能。运行该可执行文件,您将获得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
,这不是很理想。另一种解决方案是在使用“以防万一”的分析时重新编译所有内容,但这似乎有些过分。