ios - Xcode 5 में कोड कवरेज चलाते समय दर्जनों "प्रोफाइलिंग: अमान्य आर्क टैग"




objective-c code-coverage (5)

Xcode 5 में सक्षम कोड कवरेज के साथ अपना टेस्ट लक्ष्य चलाते समय, मुझे बिल्ड आउटपुट में दर्जनों संदेश मिले:

profiling:invalid arc tag (0x...)

यह परीक्षणों को प्रभावित नहीं करता है, क्योंकि वे सफलतापूर्वक पूरा करते हैं, और जीसीडीए कवरेज फाइलें भी उत्पन्न होती हैं।

किसी भी विचार का अर्थ है कि संदेश का क्या अर्थ है, या संदेशों को कैसे दबाएं / समस्या को ठीक करें, क्योंकि वे निर्माण आउटपुट को अव्यवस्थित करते हैं और परीक्षण के परिणाम को खोजने के लिए कठिन बनाते हैं।


आप सभी व्युत्पन्न डेटा फ़ोल्डर को खाली करना चाह सकते हैं। खासकर यदि आप Xcode को अपग्रेड करते हैं या एक से अधिक Xcode संस्करणों का उपयोग करते हैं।

एक बार जब मैंने अपने एकीकरण सर्वर में 6.2 से 6.3 तक के Xcode को अपग्रेड करने के ठीक बाद यह अनुभव किया है और हमने इन संदेशों को लॉग्स के साथ-साथ frankencover.it द्वारा बनाई गई कवरेज रिपोर्ट में लापता कक्षाओं में देखा है । एकीकरण सर्वर के अंदर DerivedData फ़ोल्डर्स को DerivedData इसे ठीक करता है।

find /Library/Developer/XcodeServer -name DerivedData -print0 | xargs -0 rm -rf

पुराना प्रश्न है, लेकिन अब Xcode 7 GM बाहर है, और यह व्यवहार नहीं बदला है, मैंने एक गहरा रूप लिया। मुद्दा, मेरा मानना ​​है कि परीक्षण एप्लिकेशन लक्ष्य का कोड कवरेज मुख्य लक्ष्य के कोड कवरेज के साथ विरोधाभासी है।

यह मानते हुए कि आप वास्तव में अपने परीक्षण लक्ष्य के कोड कवरेज के बारे में परवाह नहीं करते हैं, ये सेटिंग्स मेरे लिए त्रुटियों को रोकती हैं, अतिरिक्त स्क्रिप्ट या फ़ाइलों को हटाने की कोई आवश्यकता नहीं है:

आपके मुख्य लक्ष्य में (यह एक ढांचा, या एक ऐप हो) सेट करें:

 Enable Code Coverage Support to YES
 Generage Legacy Test Coverage Files to YES
 Instrument Program Flow to YES

अपने उद्देश्यों के लिए मैंने केवल डिबग बिल्ड के लिए ऐसा किया था, लेकिन आपकी ज़रूरतें अलग-अलग हो सकती हैं।

फिर अपने टेस्ट टारगेट सेट में:

 Enable Code Coverage Support to NO
 Generage Legacy Test Coverage Files to NO
 Instrument Program Flow to NO

इसने त्रुटि संदेशों को हल कर दिया है, और अभी भी कोड कवरेज फ़ाइलों को उचित रूप से बनाने की अनुमति दी है।

फिर, सवाल पुराना है, लेकिन जैसा कि अभी भी XCode 7 में त्रुटि जारी की गई है, मैंने पाया कि यह समाधान विशेष स्क्रिप्ट के साथ फ़ाइलों को हटाने से बेहतर काम करता है।


बाहर Xcode 7 उपयोगकर्ताओं के लिए, आप सोच रहे होंगे कि इस तरह के संदेश प्राप्त करने के बाद आपका यूनिट टेस्ट क्रैश क्यों होता है। मैंने जो समाधान पाया वह यह था कि आपको यह सुनिश्चित करने की ज़रूरत है कि आपके बिल्ड फ़्लो में शामिल सभी संभावित लक्ष्य (सभी लाइब्रेरी सहित) में ये दो बिल्ड सेटिंग्स NO पर सेट होनी चाहिए:

GCC_GENERATE_TEST_COVERAGE_FILES = NO;
GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = NO;

यदि आप बिल्ड सेटिंग्स में "कोड जेनरेशन" सेक्शन खोजते हैं तो आपको "जेनरेट टेस्ट कवरेज फाइल्स" और "इंस्ट्रूमेंट प्रोग्राम फ्लो" के रूप में मिलेगा।

आगे के संदर्भ के लिए https://developer.apple.com/library/ios/qa/qa1514/_index.html


मैं एक ही मुद्दा रहा हूँ। __gcov_flush(); तहत मेरे __gcov_flush(); applicationWillTerminate: मेरे पास __gcov_flush(); । इसे टिप्पणी करने से मेरे बिल्ड आउटपुट में invalid arc tag संदेश निकल जाते हैं।

मैं यह पता लगाने के लिए आगे अनुसंधान कर रहा हूं कि ऐसा क्यों होता है। मुझे पता है कि अगर मैं अपनी परियोजना को पूरी तरह से साफ कर दूंगा और DerivedData निर्देशिका को हटा DerivedData ये संदेश मेरे परीक्षणों के कुछ ही DerivedData लिए रुक जाएंगे।

संपादित करें: मुझे लगता है कि यह मेरे लिए तय हो गया है। मेरे appDelegate में मेरे पास निम्नलिखित थे:

#ifdef DEBUG
+ (void)initialize {
    [[NSUserDefaults standardUserDefaults] setValue:@"XCTestLog,GcovTestObserver"
                                         forKey:@"XCTestObserverClass"];
    [super initialize];
}
#endif

मैंने GcovTestObserver गलत बताया, और इसे ठीक करने के बाद संदेश बंद हो गए। सुनिश्चित करें कि आपके पास अपने टेस्ट टारगेट में XCTestObserver उपवर्ग है जो XCTestObserver को ओवरराइड कर रहा है: निम्नलिखित के साथ योग्य:

- (void) stopObserving
{
    [super stopObserving];
    UIApplication* application = [UIApplication sharedApplication];
    [application.delegate applicationWillTerminate:application];
}

सबसे अधिक संभावना है कि यह बिल्ड टूल्स का परिणाम है जो मौजूदा परिणामों को मौजूदा .gcda कवरेज फ़ाइलों में विलय करने में विफल रहता है। जैसा कि डेव मेहान यहां बताते हैं , उत्पाद निर्माण फ़ोल्डर को साफ करके इससे निपटने का एक क्रूर बल तरीका है, लेकिन एक कम हार्ड कोर दृष्टिकोण उन्हें (मेरे लिए, बस परीक्षण लक्ष्य) उत्पन्न करने वाले लक्ष्य से .gcda फ़ाइलों को हटाने के लिए है। निर्माण प्रक्रिया के हिस्से के रूप में। डेव में एक निर्माण चरण के रूप में शामिल होने के लिए एक नमूना स्क्रिप्ट शामिल है - या, हाथ से प्रोजेक्ट रूट पर:

find . -name "*.gcda" -print0 | xargs -0 rm




code-coverage