c gcc gcov

Advertencia de gcov: fusionar desajustes para los resúmenes



gcc (1)

¿Alguien puede decirme qué significa el mensaje gcov "Combinar la falta de coincidencia con los resúmenes"? He encontrado el mensaje en la fuente de gcc aquí:

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

Parece ser una comprobación de que las etiquetas en los archivos .gcda coinciden, pero no estoy seguro. ¿Alguien sabe cómo solucionar esto?


Esto sucede cuando uno de los objetos que está vinculando en un ejecutable cambia significativamente. Por ejemplo, gana o pierde algunas líneas de código perfilable.

El caso mínimo para producir el error es con 2 archivos de origen. Aquí hay 2 ejemplos de archivos fuente llamados main.c ...

/* main.c */ int do_stuff(int value); int main(int argc, const char *argv[]) { do_stuff(argc); return 0; }

y esas cosas.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; }

Lo que hacen no es importante. Para construirlos, aquí hay un simple Makefile:

CFLAGS := -fprofile-arcs -ftest-coverage LDFLAGS := -fprofile-arcs -ftest-coverage testexe: main.o stuff.o $(CC) $(LDFLAGS) -o $@ $^

El Makefile está configurado para que la compilación sea main.c -> main.o , stuff.c -> stuff.o y finalmente stuff.o + main.o -> testexe . Si -fprofile-arcs -ftest-coverage y vinculamos esos archivos C con las opciones de -fprofile-arcs -ftest-coverage , entonces el archivo ejecutable tiene un perfil. Ejecute ese ejecutable y obtendrá 2 archivos de salida, main.gcda y stuff.gcda . Hasta ahora tan bueno.

Ahora cambie la línea #if 0 a #if 1 . El Makefile debería hacer que solo stuff.c se compile, y el ejecutable vuelva a vincularse. La próxima vez que se ejecute el ejecutable de prueba, aparecerá el mensaje "Combinar discrepancia" para el archivo main.gcda . El archivo stuff.gcda no se ve afectado ya que su archivo de objeto se ha recreado con toda la nueva información de resumen. Si recompila main.c y vuelve a vincular el archivo ejecutable, el mensaje de error desaparece.

Entonces, ¿qué puede hacerse? ¡Me encantaría saber! En el momento que corro find . -name ''*.gcda'' | xargs rm find . -name ''*.gcda'' | xargs rm find . -name ''*.gcda'' | xargs rm cada vez que necesito volver a verificar la cobertura, lo que no es realmente ideal. Otra solución sería recompilar todo cuando se usa el perfil "por si acaso", pero eso parece una exageración.