ऐसा तब होता है जब आप किसी ऑब्जेक्टिव में परिवर्तन करने वाले ऑब्जेक्ट्स में से एक महत्वपूर्ण रूप से परिवर्तन करते हैं। उदाहरण के लिए यह लाभदायक कोड की कुछ पंक्तियों को प्राप्त या खो देता है।
त्रुटि उत्पन्न करने के लिए न्यूनतम मामला 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
चलाता हूं जब भी मुझे कवरेज को दोबारा जांचना पड़ता है, जो वास्तव में आदर्श नहीं है। "बस मामले में" प्रोफाइलिंग का उपयोग करते समय एक और समाधान सबकुछ फिर से सम्मिलित करना होगा, लेकिन यह ओवरकिल जैसा लगता है।
ग्रेट, जानकारी के लिए धन्यवाद! अंत में यह समझना अच्छा लगता है कि यहां क्या हो रहा है। उत्कृष्ट स्पष्टीकरण भी। मेरे पास एक समान कामकाज था - चलने से पहले सभी जेनरेट की गई फ़ाइलों को हटाने के लिए। अब मैं समझता हूं कि यह क्यों काम करता है लेकिन मुझे लगता है कि त्रुटि संदेश कुछ हद तक सुधार किया जा सकता है। – mikelong