2010-04-07 11 views

Respuesta

32

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

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

/* main.c */ 
int do_stuff(int value); 

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

y 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; 
} 

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

CFLAGS := -fprofile-arcs -ftest-coverage 
LDFLAGS := -fprofile-arcs -ftest-coverage 

testexe: main.o stuff.o 
    $(CC) $(LDFLAGS) -o [email protected] $^ 

El Makefile está configurado de modo que la compilación es main.c -> main.o, stuff.c -> stuff.o y finalmente stuff.o + main.o -> testexe. Si compilamos y vinculamos esos archivos C con las opciones -fprofile-arcs -ftest-coverage, el archivo ejecutable tiene perfiles. Ejecute ese archivo ejecutable y obtendrá 2 archivos de salida, main.gcda y stuff.gcda. Hasta aquí todo bien.

Ahora cambie la línea #if 0 a #if 1. El archivo Makefile debe causar simplemente stuff.c para volver a compilar, y el ejecutable para volver a vincular. La próxima vez que ejecute el ejecutable de prueba, obtendrá 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 vuelto a crear con toda la nueva información de resumen. Si vuelve a compilar main.c y vuelve a vincular el ejecutable, el mensaje de error desaparece.

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

+1

Genial, gracias por la información! Es agradable finalmente entender qué está pasando aquí. Excelente explicación también. Tuve una solución similar: eliminar todos los archivos generados antes de ejecutar. Ahora entiendo por qué funciona esto, pero creo que el mensaje de error podría mejorar algo. – mikelong

Cuestiones relacionadas