2010-04-07 16 views
21

क्या कोई मुझे बता सकता है कि gcov संदेश "सारांश के लिए मेल नहीं मिला" का अर्थ क्या है? मैं जीसीसी स्रोत यहाँ में संदेश मिल गया है:gcov चेतावनी: सारांश के लिए विसंगति विलय

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

यह एक मानसिक स्वास्थ्य की जांच कि .gcda फाइलों में टैग से मेल हो रहा है, लेकिन मुझे यकीन है कि नहीं हूँ। किसी को पता है कि इस के आसपास कैसे काम करना है?

उत्तर

32

ऐसा तब होता है जब आप किसी ऑब्जेक्टिव में परिवर्तन करने वाले ऑब्जेक्ट्स में से एक महत्वपूर्ण रूप से परिवर्तन करते हैं। उदाहरण के लिए यह लाभदायक कोड की कुछ पंक्तियों को प्राप्त या खो देता है।

त्रुटि उत्पन्न करने के लिए न्यूनतम मामला 2 स्रोत फ़ाइलों के साथ है। यहाँ 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; 
} 

वे क्या महत्वपूर्ण नहीं है कर रहे हैं।

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

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

Makefile की स्थापना की है ताकि संकलन main.c -> main.o, stuff.c -> stuff.o और अंत में stuff.o + main.o -> testexe है: उन्हें बनाने के लिए, यहाँ एक सरल Makefile है। अगर हम -fprofile-arcs -ftest-coverage विकल्पों के साथ उन सी फ़ाइलों को संकलित और लिंक करते हैं तो निष्पादन योग्य फ़ाइल प्रोफाइलिंग कर रही है। निष्पादन योग्य चलाएं और आपको 2 आउटपुट फाइलें मिलेंगी, main.gcda और stuff.gcda। अब तक सब ठीक है।

अब #if 0 से #if 1 पर लाइन बदलें। मेकफ़ाइल को केवल re.c को recompile करने के लिए, और निष्पादन योग्य करने के लिए कारण होना चाहिए। अगली बार जब आप परीक्षण निष्पादन योग्य हो जाएंगे तो आपको main.gcda फ़ाइल के लिए "विलय विसंगति" संदेश मिलेगा। Stuff.gcda फ़ाइल प्रभावित नहीं होती है क्योंकि इसकी ऑब्जेक्ट फ़ाइल को सभी नई सारांश जानकारी के साथ पुनर्निर्मित किया गया है। यदि आप main.c को पुन: संकलित करते हैं और निष्पादन योग्य रिलिकिंक करते हैं, तो त्रुटि संदेश दूर हो जाता है।

तो क्या किया जा सकता है? मुझे जानना अच्छा लगेगा! फिलहाल मैं find . -name '*.gcda' | xargs rm चलाता हूं जब भी मुझे कवरेज को दोबारा जांचना पड़ता है, जो वास्तव में आदर्श नहीं है। "बस मामले में" प्रोफाइलिंग का उपयोग करते समय एक और समाधान सबकुछ फिर से सम्मिलित करना होगा, लेकिन यह ओवरकिल जैसा लगता है।

+1

ग्रेट, जानकारी के लिए धन्यवाद! अंत में यह समझना अच्छा लगता है कि यहां क्या हो रहा है। उत्कृष्ट स्पष्टीकरण भी। मेरे पास एक समान कामकाज था - चलने से पहले सभी जेनरेट की गई फ़ाइलों को हटाने के लिए। अब मैं समझता हूं कि यह क्यों काम करता है लेकिन मुझे लगता है कि त्रुटि संदेश कुछ हद तक सुधार किया जा सकता है। – mikelong

संबंधित मुद्दे