दिलचस्प पोस्ट
स्विंग में देरी कैसे बनाएं मैं Vb.NET या C # का उपयोग कर एक प्रक्रिया को कैसे मारूं? एक अवतल सीमा त्रिज्या संभव है? मैं जावास्क्रिप्ट के साथ चयन विकल्प कैसे छिपा सकता हूं? (क्रॉस ब्राउज़र) पायथन लॉगर को लॉग करने के अलावा सभी संदेशों को stdout में आउटपुट करना एक बैच फ़ाइल के माध्यम से एक txt फ़ाइल में कुछ पंक्तियों को हटा दें मैं डीजेंगो में उपयोगकर्ता आईपी पता कैसे प्राप्त करूं? कैसे धागा पूल से बेहतर कांटा / फ्रेमवर्क शामिल है? GetUserMedia – फ़ेमिंगमोड जावास्क्रिप्ट सिर टैग में होना चाहिए? एकाधिक कॉलम एक साथ पेस्ट करें रेल में एक ही मॉडल के साथ कई-से-कई रिश्ते हैं? कैसे PHP में स्कैंडर का उपयोग केवल छवियों को पाने के लिए? निर्दिष्ट DSN में ड्राइवर और अनुप्रयोग के बीच एक वास्तुकला बेमेल शामिल है। जावा एक पैटर्न के सामने एक नई पंक्ति कैसे डालें?

जब लीक उपकरण उन्हें नहीं दिखाता है तो स्मृति लीक को डीबग कैसे करें?

मेरे पास एक आईओएस ऐप है जो स्विफ्ट में लिखा है जो कि स्मृति लीक कर रहा है – कुछ स्थिति में कुछ ऑब्जेक्ट्स को रिलीज़ किया जाना चाहिए, लेकिन वे नहीं हैं I मैं इस तरह से deinit डीबग संदेशों को जोड़कर इस मुद्दे के बारे में सीखा है:

 deinit { println("DEINIT: KeysProvider released") } 

इसलिए, ऐसी घटनाओं के बाद डिनिट संदेश को सांत्वना में मौजूद होना चाहिए, जिससे ऑब्जेक्ट को रिलीज़ करना चाहिए। हालांकि, कुछ वस्तुओं के लिए जिन्हें रिलीज़ किया जाना चाहिए, संदेश अनुपलब्ध है। फिर भी, लीक डेवलपर उपकरण कोई लीक नहीं दिखाता है। मैं ऐसी स्थिति कैसे सुलझाऊँ?

वेब के समाधान से एकत्रित समाधान "जब लीक उपकरण उन्हें नहीं दिखाता है तो स्मृति लीक को डीबग कैसे करें?"

Xcode 8 में, आप "डीबग मेमोरी ग्राफ़" बटन पर क्लिक कर सकते हैं, debugmemorygraphbutton डिबग टूलबार में (स्क्रीन के नीचे दिखाया गया):

डिबग मेमोरी ग्राफ़

सिर्फ बाएं पैनल में मौजूद ऑब्जेक्ट की पहचान करें, जिसे आपको लगता है कि उसे हटाया जाना चाहिए था, और यह आपको ऑब्जेक्ट ग्राफ दिखाएगा (ऊपर की मुख्य कैनवास में दिखाया गया है)। प्रश्न में वस्तु पर मजबूत संदर्भ स्थापित किए जाने के बारे में यह बहुत जल्दी पहचानने में बहुत उपयोगी है। यहां से, आप अपने शोध को शुरू कर सकते हैं, यह पता लगा सकते हैं कि उन मजबूत संदर्भों का समाधान क्यों नहीं किया गया है (उदाहरण के लिए यदि प्रश्न में ऑब्जेक्ट को किसी अन्य चीज़ से एक मजबूत संदर्भ दिया गया है जिसे डिलोकेट किया जाना चाहिए, उस ऑब्जेक्ट के आलेख को भी देखें, और आपको मुद्दा (जैसे मजबूत संदर्भ चक्र, दोहराए जाने वाले टाइमर आदि)।

ध्यान दें, सही पैनल में, मैं कॉल ट्री को देख रहा हूं। मुझे योजना सेटिंग्स में "malloc stack" लॉगिंग विकल्प को बदल कर मिला है:

मॉलोक स्टैक

वैसे भी, ऐसा करने के बाद, एक ऊपर दिए गए पहले स्क्रीन स्नैपशॉट के दाएं पैनल के स्टैक ट्रेस में दिखाए गए प्रासंगिक विधि कॉल के बगल में तीर पर क्लिक कर सकते हैं, और आप देख सकते हैं कि यह मजबूत संदर्भ मूल रूप से स्थापित किया गया था:

कोड

उपरोक्त स्मृति निदान तकनीक (और अधिक) एक्सडोड के साथ WWDC 2016 दृश्य डिबगिंग के उत्तरार्द्ध में प्रदर्शित की गई है।


पारंपरिक औजार तकनीक (विशेषकर Xcode के पुराने संस्करणों का उपयोग करते समय उपयोगी है) को नीचे वर्णित किया गया है, मेरे मूल उत्तर में।


मैं "रिकॉर्ड संदर्भ गणना" सुविधा के साथ उपकरण '' आवंटन '' उपकरण का उपयोग करने का सुझाव देता हूं:

रिकॉर्ड संदर्भ मायने रखता है

फिर आप उपकरण में ऐप चला सकते हैं और फिर तीर पर क्लिक करके अपने वर्ग की खोज कर लीजिए और ड्रिल कर सकते हैं:

यहां छवि विवरण दर्ज करें

इसके बाद आप विवरण में ड्रिल कर सकते हैं और दाईं ओर "विस्तारित विवरण" पैनल का उपयोग करके स्टैक ट्रेस को देख सकते हैं:

विस्तृत विवरण

उस "विस्तारित विवरण" पैनल में, ग्रे में सिस्टम कॉल की बजाय आपके कोड पर ध्यान केंद्रित करें। फिर भी, "विस्तारित विवरण" पैनल से, आप फिर अपने स्रोत कोड में ड्रिल कर सकते हैं, सही उपकरण में ::

तुम्हारा कोड

स्मृति समस्याओं को ट्रैक करने के लिए इंस्ट्रूमेंट्स का उपयोग करने में अधिक जानकारी और प्रदर्शन के लिए, कृपया देखें:

  • WWDC 2013 वीडियो मेमोरी मुद्दे फिक्सिंग
  • WWDC 2012 वीडियो IOS ऐप प्रदर्शन: मेमोरी

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

कैसे मेमोरी क्रैप को खोजने के लिए हेपशॉट का उपयोग करें, देखें: बीबीएम ब्लॉग

मूल रूप से विधि उपकरण को आवंटित उपकरण को चलाने के लिए, एक हेपशॉट लेते हैं, अपने कोड का पुनरावृत्त चलाते हैं और 3 या 4 बार दोहराते हुए एक और हाइपशॉट लेते हैं। यह मेमोरी को इंगित करेगा जो पुनरावृत्तियों के दौरान आवंटित और जारी नहीं किया गया है।

व्यक्तिगत आबंटन को देखने के लिए परिणामों का खुलासा करने के लिए

यदि आपको यह देखने की आवश्यकता है कि ऑब्जेक्ट के इस्तेमाल के साधनों के लिए कहां रखे, रिलीज़ और ऑटोरेलेज़ होते हैं:

उपकरणों में चलाएं, आवंटन में "रिकॉर्ड संदर्भ गणना" पर सेट करें (Xcode 5 और कम करने के लिए आपको विकल्प सेट करने के लिए रिकॉर्डिंग को बंद करना होगा)। ऐप को चलाने के लिए, रिकॉर्डिंग रोकें, नीचे ड्रिल करें और आप यह देख पाएंगे कि कहां से सभी को बरकरार रखता है, रिलीज हो जाती है और ऑटोरेलेज़ हो जाते हैं।