Кто-либо может сказать мне, что означает несоответствие слияния "Сообщения gcov для сводок"? Я нашел сообщение в gcc источнике здесь:
http://www.opensource.apple.com/source/gcc/gcc-5646/gcc/libgcov.c
Это, кажется, проверка работоспособности что теги в .gcda
соответствие файлов, но я не уверен. Кто-либо знает, как работать вокруг этого?
Это происходит, когда один из объектов, которые вы связываете в исполняемый файл, значительно изменяется. Например, он получает или теряет несколько строк профилируемого кода.
Минимальный случай возникновения ошибки - 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
. Если мы скомпилируем и свяжем эти файлы C с параметрами -fprofile-arcs -ftest-охват
, тогда исполняемый файл будет профилирован. Запустите этот исполняемый файл, и вы получите 2 выходных файла, main.gcda
и stuff.gcda
. Все идет нормально.
Теперь измените строку #if 0
на #if 1
. Makefile должен вызывать перекомпиляцию только stuff.c и повторную компоновку исполняемого файла. В следующий раз, когда вы запустите исполняемый файл теста, вы получите сообщение «Несоответствие слияния» для файла main.gcda . На файл stuff.gcda это не повлияет, так как его объектный файл был воссоздан со всей новой сводной информацией. Если вы перекомпилируете main.c
и повторно подключите исполняемый файл, сообщение об ошибке исчезнет.
Итак, что можно сделать? Я бы хотел знать! На данный момент запускаю find. -name '* .gcda' | xargs rm
всякий раз, когда мне нужно перепроверить покрытие, что не совсем идеально. Другое решение - перекомпилировать все при использовании профилирования «на всякий случай», но это кажется излишним.