2010-04-07 14 views

risposta

32

Ciò accade quando uno degli oggetti che si collega a un eseguibile cambia in modo significativo. Ad esempio, guadagna o perde alcune linee di codice profilabile.

Il caso minimo per produrre l'errore è con 2 file di origine. Qui ci sono 2 file di esempio source chiamato main.c ...

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

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

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

Quello che fanno non è importante. Per costruire loro, ecco un semplice Makefile:

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

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

Il Makefile è impostato in modo che la compilazione è main.c -> main.o, stuff.c -> stuff.o e infine stuff.o + main.o -> testexe. Se compiliamo e colleghiamo questi file C con le opzioni -fprofile-arcs -ftest-coverage, il file eseguibile ha il profilo. Esegui quello eseguibile e otterrai 2 file di output, main.gcda e stuff.gcda. Fin qui tutto bene.

Ora modificare la riga #if 0 a #if 1. Il Makefile dovrebbe solo ricompilare stuff.c e l'eseguibile da ricollegare. La prossima volta che eseguirai il test eseguirai il messaggio "Unisci mismatch" per il file main.gcda principale. Il file stuff.gcda non è interessato dal momento che il suo file oggetto è stato ricreato con tutte le nuove informazioni di riepilogo. Se si ricompila main.c e ricollega l'eseguibile, il messaggio di errore scompare.

Quindi cosa si può fare? Mi piacerebbe saperlo! Al momento eseguo find . -name '*.gcda' | xargs rm ogni volta che ho bisogno di ricontrollare la copertura, che non è proprio l'ideale. Un'altra soluzione sarebbe quella di ricompilare tutto quando si utilizza la profilatura "just in case", ma sembra eccessivo.

+1

Grande, grazie per l'informazione! È bello capire finalmente che cosa sta succedendo qui. Ottima spiegazione anche. Ho avuto una soluzione simile: per eliminare tutti i file generati prima dell'esecuzione. Ora capisco perché funziona, ma penso che il messaggio di errore potrebbe essere leggermente migliorato. – mikelong

Problemi correlati