2012-01-09 21 views
102

मैं यह पता लगाने की कोशिश कर रहा हूं कि स्मृति का एक ब्लॉक मुक्त नहीं हुआ था या नहीं। बेशक, प्रबंधक मुझे बताता है कि संवाद बॉक्स या लॉग फ़ाइल द्वारा, लेकिन यदि मैं डेटाबेस में परिणाम संग्रहीत करना चाहता हूं तो क्या होगा? उदाहरण के लिए, मैं डेटाबेस तालिका में रूटीन के नामों को नामित करना चाहता हूं जो दिए गए ब्लॉक आवंटित किए गए हैं।प्रोग्रामेटिक रूप से यह बताने का कोई तरीका है कि क्या फास्टएमएम द्वारा स्मृति का विशेष ब्लॉक मुक्त नहीं किया गया था?

फास्टएमएम के दस्तावेज़ीकरण को पढ़ने के बाद मुझे पता है कि संस्करण 4.9 8 के बाद से हमें स्मृति आवंटन, फ्री और पुनर्वितरण के बारे में प्रबंधक द्वारा अधिसूचित होने की संभावना है। उदाहरण के लिए OnDebugFreeMemFinish घटना हमें PFullDebugBlockHeader पास कर रही है जिसमें उपयोगी सूचनाएं हैं। एक बात यह है कि PFullDebugBlockHeader गुम है - जानकारी अगर दिए गए ब्लॉक को एप्लिकेशन द्वारा मुक्त किया गया था।

जब तक OnDebugFreeMemFinish को केवल मुक्त नहीं किया गया ब्लॉक कहा जाता है? यह वह है जिसे मैं नहीं जानता और जानना चाहता हूं।

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

procedure LogMemoryLeakOrAllocatedBlock(APointer: PFullDebugBlockHeader; IsALeak: Boolean); 
:

procedure OnMemoryLeak(APointer: PFullDebugBlockHeader); 

FastMM के स्रोत मैंने देखा कि एक प्रक्रिया है कि वहाँ ब्राउज़िंग करने के बाद:

program MemLeakTest; 

{$APPTYPE CONSOLE} 

uses 
    FastMM4, ExceptionLog, SysUtils; 


procedure MemFreeEvent(APHeaderFreedBlock: PFullDebugBlockHeader; AResult: Integer); 
begin 
//This is executed at the end, but how should I know that this block should be freed 
//by application? Unless this is executed ONLY for not freed blocks. 
end; 

procedure Leak; 
var 
    MyObject: TObject; 
begin 
    MyObject := TObject.Create; 
end; 

begin 
    OnDebugFreeMemFinish := MemFreeEvent; 
    Leak; 
end. 

क्या मुझे याद आ रही है जैसे कॉलबैक है:

यहाँ एक उदाहरण है

जो अतिरंजित हो सकता है, लेकिन शायद एक आसान तरीका है?

+0

उपयुक्त सेटिंग्स के साथ पूर्ण फास्टएमएम का उपयोग करें और आपको शटडाउन पर सभी लीक किए गए ब्लॉक की एक विस्तृत रिपोर्ट प्राप्त होगी। क्या यह आपकी आवश्यकताओं के लिए पर्याप्त नहीं है? –

+0

नहीं, जैसा कि मैंने लिखा था: "आवेदन को बंद करने पर लीक की अपेक्षा की जाती है" और यह मैं नहीं चाहता हूं। मैं इसे अपने आप से लॉग करना चाहता हूं। – Wodzu

+7

मैंने हमेशा यह समझा है कि फास्टएमएम केवल इस चेक को बहुत ही आखिरी कार्रवाई के रूप में कर सकता है जिसे प्रोग्राम परिभाषित करना चाहिए - इसलिए जब तक फास्टएमएम अपनी रिपोर्ट बनाता है तो आपका कोड समाप्त हो गया है। आंशिक समाधान प्राप्त करने के लिए आप यह देखने के लिए हमेशा अपने स्रोत में एक नज़र डाल सकते हैं कि आवंटित स्मृति कैसे ध्वजांकित की जाती है। –

उत्तर

1

भले ही ऐसे हैंडलर मौजूद हों, यह लगभग बेकार होगा, क्योंकि डीबी समेत सब कुछ बंद हो जाएगा जब फास्टएमएम की रिपोर्ट लीक हो जाएगी।

तो, मैं आपको LogErrorsToFileFastMM4Options.inc में सशर्त के साथ चालू करने का सुझाव देता हूं। यह आपको लीक के साथ एक टेक्स्ट फ़ाइल देगा, जो बाद में आप पार्स कर सकते हैं और डीबी में डाल सकते हैं।