2013-12-15 12 views
6

मैं प्रोफाइलर मेमोरी लीक के लिए बाहर देखने के लिए उपयोग किया और इस मुद्दे में आए हैआईओएस: एक्सकोड उपकरणों से रिसाव की पहचान कैसे करें?

enter image description here

मैं ट्री फोन करने लगे।

तो मैं इसके बारे में अधिक जानने के लिए उस पर क्लिक करें सकता है:

enter image description here

लेकिन यह वास्तव में मुझे किसी भी सुराग नहीं देता है। मुझे कैसे पता होना चाहिए कि रिसाव का कारण क्या था?

enter image description here

अद्यतन:

  • ऊपर अद्यतन किया जाता है पता चला प्रणाली पुस्तकालयों के साथ कॉल पेड़।
  • वस्तुओं के बारे में जानकारी लीक:

enter image description here

  • क्या आप अनुप्रयोग में क्या इस रिसाव पुन: पेश करने के कुछ विवरण:

हमारे एप्लिकेशन हमारे बाकी के साथ समन्वयन कर रहा है ऐप के प्रारंभ (अग्रभूमि) पर एपीआई। यह हमेशा मेरे आईओएस 7/आईफोन 4 एस पर काम करता है। लेकिन एक और डेवलपर के पास आईओएस 7/आईफोन 5 है और शायद ही कभी इस समस्या में चलता है कि यह सिंक नहीं होता है।

Dec 15 03:18:58 appname[4801] <Warning>: A gateway to the host server is working via WWAN. 
Dec 15 03:18:58 appname[4801] <Warning>: Syncing... 
Dec 15 03:18:58 appname[4801] <Warning>: Eventname to be fired: f11-reachability 
Dec 15 03:18:58 appname[4801] <Warning>: Sync event IOS_REACHABILITY reached. 
Dec 15 03:18:58 appname[4801] <Warning>: Sync: IOS_SYNC_WITH_SERVER is true 
Dec 15 03:18:58 appname[4801] <Warning>: Animating indicator... 
Dec 15 03:18:58 appname[4801] <Warning>: Getting last timestamp: 1387003344.407783 then calling syncWithServerWithDate 
Dec 15 03:19:27 com.apple.launchd[1] <Notice>: (UIKitApplication:com.apple.mobilecal[0x45fb]) Exited: Killed: 9 
Dec 15 03:19:27 com.apple.launchd[1] <Notice>: (com.apple.afcd) Idle-exit job was jettisoned. Will bypass throttle interval for next on-demand launch. 
Dec 15 03:19:27 com.apple.launchd[1] <Error>: (com.apple.afcd) assertion failed: 11B554a: launchd + 35697 [3C91C465-EFA6-32C7-A677-DD0B5FDEE0DC]: 0x9 
Dec 15 03:19:27 com.apple.launchd[1] <Notice>: (com.apple.absd) Idle-exit job was jettisoned. Will bypass throttle interval for next on-demand launch. 

एक तीसरा सिंक करने के लिए प्रयास (घर बटन दबाने और वापस अग्रभूमि करने के लिए आ रहा है) हमें इस है, जो एक कम स्मृति संकेत दिया दिया::

अवलोकन और NSLogs हर जगह डाल के 10 दिनों के बाद, हम इस कल रात पाया
Dec 15 03:25:18 C1 appname[4801] <Warning>: Getting last timestamp: 1387003344.407783 then calling syncWithServerWithDate 
Dec 15 03:25:29 C1 profiled[6244] <Notice>: (Note) profiled: Service stopping. 
Dec 15 03:25:40 C1 crash_mover[6248] <Notice>: (Warn) <crash_mover.m mv_recursive:98> Moving './LowMemory-2013-12-14-160222.plist' -> '/var/mobile/Library/Logs/CrashReporter/LowMemory-2013-12-14-160222.plist' 

तो मैंने सोचा कि मैं प्रोफाइलर को जाता हूं और देखता हूं कि मुझे कुछ मिल रहा है या नहीं।

इसे पुन: पेश करने के लिए, मैंने ऐप शुरू किया है, होम स्क्रीन पर गया है, फिर Simulate a Low Memory दबाया और फिर अग्रभूमि पर वापस आने के लिए ऐप पर क्लिक किया। यह वह जगह है जहां मुझे लाल स्पाइक मिलता है।

  • आप जो एक्सकोड संस्करण चला रहे हैं।

एक्सकोड 5.02। आईफोन 4 एस (आईओएस) पर आईओएस 7.04, आईफोन 5 (दुर्लभ एज केस)

मुझे उम्मीद है कि इससे मदद मिलती है। धन्यवाद

+0

"कॉल ट्री" शीर्षक के नीचे बाईं ओर उन सभी छोटे बक्से .. मुझे आम तौर पर उन सभी को क्लिक करने पर अधिक पढ़ने योग्य परिणाम मिलते हैं। –

+0

जब आपने मैन्युअल चेतावनी को मैन्युअल रूप से अनुकरण किया, तो क्या आपने अपने सहकर्मी को सिंक विफलता प्रकट की? – Rob

उत्तर

2

लीक्स में लाल स्पाइक के रूप में खतरनाक होने के कारण, कुल स्मृति लीक 1.06 केबी है, जो आपकी समस्या का स्रोत होने (और यहां तक ​​कि इससे संबंधित) होने की संभावना नहीं है।

आपके ऐप के संदर्भ में अन्य ऐप्स के जेटिसनिंग के परिणामस्वरूप, यह स्वयं कोई समस्या नहीं है और मैं इसके बारे में कम चिंतित नहीं हूं (हालांकि, एक अच्छा नागरिक होने के लिए, आपको वास्तव में इसे कम करने की कोशिश करनी चाहिए)।अधिक तत्काल कार्यात्मक मुद्दा यह है कि आपका ऐप सिंक करने में विफल क्यों है और क्या यह वास्तव में ऐप के भीतर स्मृति चेतावनी का परिणाम है (या अधिक सटीक रूप से, स्मृति ऐप के जवाब में पर्याप्त रूप से मुक्त संसाधनों के लिए आपके ऐप की विफलता, जिसके परिणामस्वरूप बाद में स्मृति आवंटन विफल करने के लिए)।

मेरे दिमाग में, पहला सवाल यह है कि क्या आपको वास्तव में आपके ऐप में स्मृति चेतावनियां मिल रही हैं या नहीं। आम तौर पर, मैं कंसोल में निम्नलिखित अगर एप्लिकेशन वास्तव में एक स्मृति चेतावनी था की तरह कुछ देखना चाहते हैं:

 
Dec 15 11:12:26 Robs-iPad myapp[2224] : Received memory warning. 

लेकिन मैं, अपने कंसोल डंप में ऊपर नहीं दिख रहा है, तो यह मुझे आप चाहे आश्चर्य बनाता है ' वास्तव में स्मृति चेतावनियां प्राप्त कर रहे हैं।

मैं अपने अनुप्रयोग प्रतिनिधि में स्पष्ट लॉगिंग डालने का सुझाव दे सकता:

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application 
{ 
    NSLog(@"%s", __FUNCTION__); 

    // free whatever caches or other temporary resources you can here 
} 

या दृश्य नियंत्रक में विशेष हैंडलिंग में डाल:

- (void)didReceiveMemoryWarning 
{ 
    NSLog(@"%s", __FUNCTION__); 

    [super didReceiveMemoryWarning]; 

    // do whatever you want to free resources here 

    [[[UIAlertView alloc] initWithTitle:nil 
           message:@"didReceiveMemoryWarning" 
           delegate:nil 
         cancelButtonTitle:@"OK" 
         otherButtonTitles:nil] show]; 
} 

यह मेरा कंसोल में निम्नलिखित देखने में परिणाम होगा:

 
Dec 15 11:12:26 Robs-iPad myapp[2224] : -[AppDelegate applicationDidReceiveMemoryWarning:] 
Dec 15 11:12:26 Robs-iPad myapp[2224] : -[ViewController didReceiveMemoryWarning] 

लेकिन मुख्य लक्ष्य यह पुष्टि करना है कि आप वास्तव में ar ई स्मृति चेतावनियां प्राप्त करना और क्या यह वास्तव में आपके ऐप की सिंक करने में विफलता से संबंधित है।

लेकिन आइए एक सेकंड के लिए मान लें कि समस्या वास्तव में स्मृति चेतावनी का परिणाम है। उसके बाद दो प्रश्नों की ओर अग्रसर होता है: सबसे पहले, आप पहले स्थान पर मेमोरी चेतावनियों को कम करने के लिए क्या कर रहे हैं (उदाहरण के लिए @autoreleasepool का उपयोग उच्च-पानी के निशान को कम करने के लिए करते हैं, अगर imageWithContentsOfFile का उपयोग करके स्मृति में बड़े संसाधन को एक ही समय में नहीं रखा जाता है imageNamed के बजाय)? दूसरा, स्मृति चेतावनियों के जवाब में आप क्या कर रहे हैं (उदाहरण के लिए, क्या आप कैश को शुद्ध कर रहे हैं आदि)?

तो, यदि आप पुष्टि करते हैं कि स्मृति चेतावनी वास्तव में समस्या का स्रोत है (और पहले ऐसा करें), तो सिंक्रनाइज़ेशन प्रक्रिया के दौरान आपके आवंटन ग्राफ को देखना दिलचस्प हो सकता है (और चोटी की संख्या की पुष्टि करें लाइव बाइट्स, साथ ही लाइव बाइट्स की अंतिम संख्या)। आपके प्रश्न में आवंटन ग्राफ को देखते हुए, यह बहुत बुरा नहीं दिखता है (यानी कोई जंगली स्विंग नहीं), लेकिन फिर, आपने हमारे साथ "लाइव बाइट्स" की संख्या साझा नहीं की है, इसलिए यह कहना मुश्किल है।

लेकिन जब आप स्मृति चेतावनी अनुकरण करते हैं तो मैं निश्चित रूप से 1kb के इस रिसाव के बारे में चिंता नहीं करता। किसी भी गंभीर लक्षण की तुलना में यह एक परेशानी है जिसके बारे में आपको चिंता करने की ज़रूरत है। लीक के लिए नजर रखें, लेकिन (ए) बड़े रिसाव पर ध्यान केंद्रित करें; और (बी) आपके कोड में, ढांचे में नहीं।


मेरे मूल जवाब नीचे दिए गए, मूल प्रश्न जो केवल था "क्या इस रिसाव उपकरणों है कि मेरे कोड के अनुरूप प्रतीत नहीं होता है के द्वारा दिखाया है" के जवाब में था। मैं इसे यहाँ संदर्भ के लिए रखना होगा:


यह सुझाव देना चाहेंगे कि रिसाव अपने कोड में नहीं है, बल्कि प्रणाली चौखटे (जो अपने द्वारा छिपाए गए) में।

आप साझा करने के लिए चाहते हो सकता है:

  • दिखाया प्रणाली पुस्तकालयों के साथ कॉल पेड़;

  • लीक की गई वस्तुओं के बारे में जानकारी (इसलिए, न केवल "कॉल पेड़", बल्कि "लीक" सूची भी);

  • इस रिसाव को पुन: पेश करने के लिए आप ऐप में जो कुछ करते हैं उसके बारे में कुछ विवरण;

  • जो आईओएस संस्करण आप देखते हैं, यह समस्या स्वयं प्रकट होती है, और आप कौन से संस्करण नहीं करते हैं (ढांचे खुद को रिसाव के बिना नहीं हैं, लेकिन यह आईओएस लक्ष्य द्वारा भिन्न होता है); और

  • आप जो एक्सकोड संस्करण चला रहे हैं।

सचमुच, आप इस मुद्दे को अनदेखा कर सकते हैं (ए) रिसाव के नगण्य आकार; (बी) संकेत की कमी कि समस्या आपके कोड में है; और (सी) तथ्य यह है कि आईओएस ढांचे के आपके नियंत्रण के बाहर रिसाव है। लेकिन यदि आप चिंतित हैं, तो उपरोक्त कुछ जानकारी साझा करें और हम आगे के अवलोकन की पेशकश कर सकते हैं।

+0

धन्यवाद रॉब। मैंने प्रश्न अपडेट किया है और आपने जो भी मांग की है उसे प्रदान किया है। इस बग के लिए 10 दिनों के शिकार के बाद, हम निराशा की स्थिति में थोड़ा सा हैं। मुझे आशा है कि आप हमें यहां कुछ बता सकते हैं। :) – Houman

+0

@ हूमन मैंने अपना जवाब विस्तारित किया है, लेकिन संक्षेप में, यह मुझे स्पष्ट नहीं है कि समस्या स्मृति चेतावनी से संबंधित है (और यह लगभग 1kb रिसाव से लगभग असंबंधित है)। आपका ऐप स्पष्ट रूप से अन्य ऐप्स को जब्त कर रहा है, लेकिन आप स्मृति चेतावनी का कोई सबूत नहीं दिखाते हैं। और यहां तक ​​कि अगर यह स्मृति चेतावनी का परिणाम था, यदि आपने संसाधनों को मुक्त किया है, तो आपको आवंटन थोड़ा सा नीचे गिरना चाहिए (या फिर यदि आप उस स्थिति को हल नहीं कर रहे हैं जिसके परिणामस्वरूप स्मृति चेतावनी हुई है तो ऐप सबसे अधिक क्रैश होगा) । क्या ऐप क्रैश हो रहा है, या सिंकिंग नहीं कर रहा है? – Rob

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