2010-04-07 18 views

cevap

32

Bir yürütülebilir dosyaya bağlandığınız nesnelerden biri önemli ölçüde değiştiğinde gerçekleşir. Örneğin, kârlı kodun bazı satırlarını kazanır veya kaybeder.

Hatayı üretmenin en küçük boyutu 2 kaynak dosyadadır. İşte 2 örnek kaynak main.c denilen dosyalar ...

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

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

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

Yaptıkları önemli değil bulunmaktadır. derleme main.c -> main.o, stuff.c -> stuff.o ve son olarak stuff.o + main.o -> testexe böylece

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

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

Makefile kurulur: Burada, onları oluşturmak için basit bir Makefile olduğunu. Bu C dosyalarını -fprofile-arcs -ftest-coverage seçenekleriyle derler ve bağlarsak, yürütülebilir dosyanın profil oluşturması sağlanır. Bu çalıştırılabilir çalıştırın ve 2 çıktı dosyaları, main.gcda ve stuff.gcda alırsınız. Çok uzak çok iyi.

Şimdi #if 0 hattını #if 1 olarak değiştirin. Makefile, sadece stuff.c'nin yeniden derlenmesine ve yeniden bağlanmaya uygun çalıştırılabilir olmasına neden olmalıdır. Bir dahaki sefere, test çalıştırılabilir çalıştırıldığında, main.gcda dosyası için "Birleştirme uyuşmazlığı" iletisini alırsınız. Nesne dosyası tüm yeni özet bilgileri ile yeniden oluşturulduğundan stuff.gcda dosyası etkilenmez. main.c'u yeniden derler ve yürütülebilir dosyayı yeniden bağlarsanız, hata iletisi gider.

Peki ne yapılabilir? Bilmek isterim! Şu anda, kapsama alanını yeniden kontrol etmem gerektiğinde, gerçekten ideal olmayan find . -name '*.gcda' | xargs rm'u çalıştırıyorum. Başka bir çözüm, "sadece durumda" profillemeyi kullanırken her şeyi yeniden derlemek olurdu, ama bu aşırı bir şey gibi görünüyor.

+1

Harika, bilgi için teşekkürler! Sonunda neler olup bittiğini anlamak güzel. Çok iyi bir açıklama. Benzer bir geçici çözümüm vardı - çalıştırılmadan önce oluşturulan tüm dosyaları silmek. Şimdi bunun neden işe yaradığını anlıyorum ama hata mesajının bir miktar geliştirilebileceğini düşünüyorum. – mikelong

İlgili konular