दिलचस्प पोस्ट
पायथन में परिपत्र (या चक्रीय) आयात ASP.NET MVC Html.ValidationSummary (सच) मॉडल त्रुटियों को प्रदर्शित नहीं करता है क्या इस प्रकार की स्मृति ढेर या ढेर पर आवंटित की जाती है? प्रिंट करने के तरीके (cout का उपयोग करके) किस प्रकार एक संख्या को स्मृति में संग्रहीत किया जाता है? iFrameExtractor के लिए ffmpeg संकलित करने की समस्या LocalDate को LocalDateTime या java.sql.Timestamp में कनवर्ट करें स्विंग में देरी कैसे बनाएं सरणी सूची के एक हैशप बनाने का सर्वोत्तम तरीका अजगर मॉड्यूल पथ को पुनर्प्राप्त करना आईओएस ऐप संग्रह को एक्सकोड में नहीं बनाया जा सकता जब विधि को स्थैतिक होना चाहिए? फ़ोल्डर में हर फाइल कैसे खोलें? सिस्टम के विकल्प। ASP.NET के साथ उपयोग के लिए छोड़ना? जावा प्रदर्शन परीक्षण jQuery वस्तु समानता

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

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

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

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

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

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

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

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

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

मॉलोक स्टैक

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

कोड

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


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


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

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

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

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

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

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

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

तुम्हारा कोड

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

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

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

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

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

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

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

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