मैं यह पता लगाने की कोशिश कर रहा हूं कि स्मृति का एक ब्लॉक मुक्त नहीं हुआ था या नहीं। बेशक, प्रबंधक मुझे बताता है कि संवाद बॉक्स या लॉग फ़ाइल द्वारा, लेकिन यदि मैं डेटाबेस में परिणाम संग्रहीत करना चाहता हूं तो क्या होगा? उदाहरण के लिए, मैं डेटाबेस तालिका में रूटीन के नामों को नामित करना चाहता हूं जो दिए गए ब्लॉक आवंटित किए गए हैं।प्रोग्रामेटिक रूप से यह बताने का कोई तरीका है कि क्या फास्टएमएम द्वारा स्मृति का विशेष ब्लॉक मुक्त नहीं किया गया था?
फास्टएमएम के दस्तावेज़ीकरण को पढ़ने के बाद मुझे पता है कि संस्करण 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.
क्या मुझे याद आ रही है जैसे कॉलबैक है:
यहाँ एक उदाहरण है
जो अतिरंजित हो सकता है, लेकिन शायद एक आसान तरीका है?
उपयुक्त सेटिंग्स के साथ पूर्ण फास्टएमएम का उपयोग करें और आपको शटडाउन पर सभी लीक किए गए ब्लॉक की एक विस्तृत रिपोर्ट प्राप्त होगी। क्या यह आपकी आवश्यकताओं के लिए पर्याप्त नहीं है? –
नहीं, जैसा कि मैंने लिखा था: "आवेदन को बंद करने पर लीक की अपेक्षा की जाती है" और यह मैं नहीं चाहता हूं। मैं इसे अपने आप से लॉग करना चाहता हूं। – Wodzu
मैंने हमेशा यह समझा है कि फास्टएमएम केवल इस चेक को बहुत ही आखिरी कार्रवाई के रूप में कर सकता है जिसे प्रोग्राम परिभाषित करना चाहिए - इसलिए जब तक फास्टएमएम अपनी रिपोर्ट बनाता है तो आपका कोड समाप्त हो गया है। आंशिक समाधान प्राप्त करने के लिए आप यह देखने के लिए हमेशा अपने स्रोत में एक नज़र डाल सकते हैं कि आवंटित स्मृति कैसे ध्वजांकित की जाती है। –