предупреждение gcov: объедините несоответствие для сводок

Кто-либо может сказать мне, что означает несоответствие слияния "Сообщения gcov для сводок"? Я нашел сообщение в gcc источнике здесь:

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

Это, кажется, проверка работоспособности что теги в .gcda соответствие файлов, но я не уверен. Кто-либо знает, как работать вокруг этого?

21
задан Michael Mrozek 15 July 2010 в 14:54
поделиться

1 ответ

Это происходит, когда один из объектов, которые вы связываете в исполняемый файл, значительно изменяется. Например, он получает или теряет несколько строк профилируемого кода.

Минимальный случай возникновения ошибки - 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 всякий раз, когда мне нужно перепроверить покрытие, что не совсем идеально. Другое решение - перекомпилировать все при использовании профилирования «на всякий случай», но это кажется излишним.

35
ответ дан 29 November 2019 в 20:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: