2013-01-18 14 views
6

का उपयोग करके स्मृति को आवंटित किया जा रहा है यह जानकर मैं डेल्फी 7 का उपयोग करके बड़े एप्लिकेशन में मेमोरी उपयोग को डीबग करने का प्रयास कर रहा हूं। मैं फास्टम डीबग पूर्ण डीएलएल स्थापित करने में सक्षम था और इसके साथ कुछ रिसाव समस्याओं को हल करता था।फास्टएमएम

मैंने मेमोरी उपयोग ट्रैकर भी स्थापित किया, जिससे मुझे यह देखने की इजाजत दी गई कि कौन से ब्लॉक आवंटित किए गए थे और वे किस आकार के हैं।

मेरा सवाल है, क्या यह पता लगाने का कोई तरीका है कि ब्लॉक कहां आवंटित किए गए थे? मुझे पता है कि यह संभव है क्योंकि अगर स्मृति को मुक्त नहीं किया गया था तो एक स्टैक ट्रेस मुद्रित हो जाता है। क्या किसी दिए गए आवंटन के लिए स्टैक ट्रेस प्रिंट करने के लिए फास्टम पर 'पोक' करने का कोई तरीका है?

साइड प्रश्न: यदि आवंटन का प्रारंभ पता ज्ञात है, तो यह पता लगाने का कोई तरीका है कि ऑब्जेक्ट कौन सा वर्ग है? (यह मानते हुए कि आवंटन एक वस्तु के लिए किया गया था।

उत्तर

4

आप कर सकते हैं:

  • कोशिश LogAllocatedBlocksToFile प्रक्रिया का उपयोग करें। अगर अपने ALastAllocationGroupToLog परम AFirstAllocationGroupToLog से कम या शून्य है है तो उनके आवंटन कॉल के ढेर के साथ सभी ब्लॉक लॉग इन हैं। हालांकि, अगर आपके ऐप में कई मेमोरी आवंटन हैं, तो प्रतीक्षा करने के लिए तैयार रहें। मैंने लगभग 4 बजे प्रतीक्षा समय और 1.5 जीबी परिणामी फाइल का अनुभव किया।(साइड-नोट: ऐसी बड़ी फ़ाइलों को देखने के लिए glogg का उपयोग करें)
  • FastMM4.pas संशोधित करें ताकि कार्यान्वयन LogCallStack इंटरफ़ेस में दिखाई दे। या आप सीधे इसे FastMM_FullDebugMode.dll

पक्ष प्रश्न पर: DetectClassInstance फ़ंक्शन का उपयोग करने का प्रयास करें।

2

आप FullDebugMode का उपयोग करें और सशर्त, कि एक फाइल करने के लिए डेटा लिखेंगे सक्षम करते हैं, तो आप आप के लिए वास्तव में क्या कह रहे हैं मिलना चाहिए। यह पता एक स्टैक ट्रेस लिखेंगे जब कार्यक्रम बंद हो जाता है तो प्रत्येक लीक आवंटन के लिए। (यदि आप बहुत मेमोरी लीक वाले प्रोग्राम को डिबग कर रहे हैं, तो इसमें कुछ समय लग सकता है। मुझे लगता है कि लीकिंग आइटम एक है तो यह बंद होने पर 10 मिनट या उससे अधिक के लिए बंद हो जाता है कंटेनर कि अन्य वस्तुओं की बहुत सारी रखती है)

+0

हाँ, मुझे अब यह मिल गया है, लेकिन जब मैं एप्लिकेशन बंद करता हूं तो समस्या यह है कि सभी मेमोरी अच्छी तरह से साफ हो जाती हैं - मैं उस जानकारी को समय पर किसी निश्चित बिंदु पर जानना चाहता हूं - जब सब कुछ एप्लिकेशन में लोड होता है । – wmercer

2

ध्यान में रखते हुए आप एक टिप्पणी ऐप की स्मृति एप्लिकेशन के समापन पर अच्छी तरह से साफ हो जाता है मुझे लगता है के लिए आप तार्किक मेमोरी लीक के लिए देख रहे में कहा - दूसरे शब्दों में:। ऑब्जेक्ट आवश्यक बी से अधिक समय जीवित हैं जब समय ऐप खत्म करने के लिए आता है तो उन्हें साफ़ कर दिया जाता है क्योंकि उन्हें साफ़ करने के लिए कोड मौजूद होता है।

उदाहरण:

  • एक TForm मालिक और चर है कि यह वैश्विक एक है कि डेल्फी से उत्पन्न होने वाला प्रपत्र की इकाई बनाने है संदर्भ के रूप में आवेदन का उपयोग कर बनाएँ।
  • कॉन्फ़िग Cahide को फार्म के CloseAction (OnClose घटना में)
  • रूप दिखाएं, उस पर काम करते हैं
  • प्रपत्र को बंद करें और अधिक कभी नहीं होने तक उसका उपयोग एप्लिकेशन
  • बंद कर देता है अनुप्रयोग है, जो आवेदन बनाता है बंद स्पष्ट सभी वस्तुओं यह मालिक

तो तुम एक तार्किक स्मृति रिसाव नहीं बल्कि एक भौतिक स्मृति रिसाव है - किस तरह का है कि FastMM आसानी से पता लगा सकते हैं है। चूंकि आप का इरादा नहीं है कि हमारे काल्पनिक टीफॉर्म एप्लिकेशन खत्म होने तक लाइव रहते हैं, यह अर्थात् लीक हो जाता है लेकिन चूंकि इसका संदर्भ दिया जाता है और वहां कोड है जो इसे एप्लिकेशन के अंत में नष्ट कर देता है, फास्टएमएम सामान्य आवंटन होता है।

ऐसा कहा जाता है कि आपको मेमोरी मैनेजर की मेमोरी डंप की आवश्यकता नहीं है, लेकिन एक मेमोरी प्रोफाइलर है। या तो

+0

विस्तृत उत्तर के लिए धन्यवाद, क्या डेल्फी के लिए मेमोरी प्रोफाइलर जैसी कोई चीज है? – wmercer

+1

@emuduguntar: [AQTime] (http://smartbear.com/products/qa-tools/application-performance-profiling) डेल्फी के लिए एकमात्र स्मृति प्रोफाइलर है, मुझे पता है, फास्टएमएम को छोड़कर –