প্রোগ্রামেমেটিকভাবে বলতে কি উপায় আছে যে যদি মেমোরির নির্দিষ্ট ব্লকটি ফাস্টএমএম দ্বারা মুক্তি না দেওয়া হয়?


103

মেমোরির একটি ব্লক মুক্ত না হয়েছিল কিনা তা সনাক্ত করার চেষ্টা করছি। অবশ্যই, পরিচালক আমাকে ডায়লগ বাক্স বা লগ ফাইলের মাধ্যমে বলছেন, তবে আমি যদি কোনও ডাটাবেজে ফলাফল সঞ্চয় করতে চাই তবে কী হবে? উদাহরণস্বরূপ আমি একটি ডাটাবেস টেবিলের মধ্যে রুটিনের একটি নাম রাখতে চাই যা প্রদত্ত ব্লকগুলিকে বরাদ্দ দিয়েছে।

ফাস্টএমএম-এর একটি ডকুমেন্টেশন পড়ার পরে আমি জানি যে সংস্করণ 4.98 সাল থেকে আমাদের মেমরির দ্বারা মেমরির বরাদ্দ, ফ্রি এবং রিলোকেশনগুলি ঘটে থাকে সে সম্পর্কে অবহিত করার সম্ভাবনা রয়েছে। উদাহরণস্বরূপ OnDebugFreeMemFinishইভেন্টটি আমাদের কাছে চলে যাচ্ছে PFullDebugBlockHeaderযার মধ্যে দরকারী তথ্য রয়েছে। একটি জিনিস PFullDebugBlockHeaderঅনুপস্থিত রয়েছে - প্রদত্ত ব্লকটি যদি অ্যাপ্লিকেশনটির মাধ্যমে মুক্তি দেয় তবে তথ্যটি।

যদি না OnDebugFreeMemFinishশুধুমাত্র না মুক্ত ব্লক জন্য বলা হয়? এটি আমি জানি না এবং এটি অনুসন্ধান করতে চাই।

সমস্যাটি হ'ল এমনকি OnDebugFreeMemFinishইভেন্টটির দিকে ঝুঁকতেও আমি ব্লকটি মুক্তি পেয়েছি কিনা তা জানতে সক্ষম হয়েছি।

এখানে একটি উদাহরণ:

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.

আমি যা মিস করছি তা কলব্যাকের মতো:

procedure OnMemoryLeak(APointer: PFullDebugBlockHeader);

ফাস্টএমএমের উত্স ব্রাউজ করার পরে আমি দেখেছি যে একটি পদ্ধতি রয়েছে:

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

যা ওভাররেড করা যেতে পারে, তবে এর থেকে সহজ উপায় কি আছে?


7
আমি সর্বদা বুঝতে পেরেছি যে প্রোগ্রামটি করা উচিত - সংজ্ঞা অনুসারে - ফাস্টএমএম কেবল এই চেকটিকে প্রোগ্রামের সবচেয়ে শেষ কর্ম হিসাবে তৈরি করতে পারে - সুতরাং আপনার কোডটি শেষ হওয়ার পরে ফাস্টএমএম এর প্রতিবেদন তৈরির সময়টি করে। আংশিক সমাধান পেতে আপনি কীভাবে বরাদ্দ মেমরিটিকে পতাকাঙ্কিত করা হয় তা দেখতে সর্বদা তাদের উত্সে একবার দেখে নিতে পারেন।
ব্রায়ান ফ্রস্ট

6
প্রত্যাশিত ফাঁস হিসাবে রিপোর্ট? আপনি এটি প্রত্যাশিত হিসাবে নিবন্ধন করেছেন? এছাড়াও আপনি সিদ্ধান্ত নিতে পারবেন না যে মেমরিটি শাটডাউন অবধি অবধি প্রকাশিত হয়েছে, যদি না আপনি যদি এমন জটিল যুক্তি সরবরাহ করেন যা প্রত্যাশিত জীবনকাল বোঝে
ডেভিড হেফারনান

6
যদি OnDebugFreeMemFinishতাকে বলা হয় যে ব্লকটি মুক্ত হয়েছিল। কোনও OnMemoryLeakঅনুষ্ঠান নেই। এমন ঘটনা আর কখনও হতে পারে না। শাটডাউন করার পরে ফাস্টএমএম যা করে তা হ'ল নির্ধারণ করা হয় যে যে কোনও ব্লককে মুক্তি দেওয়া হয়নি তা অবশ্যই ফাঁস হওয়া উচিত। এটি এর আগে আর কোনও ফুটো সনাক্ত করতে পারে না।
ডেভিড হেফারনান

12
যখনই ফাস্টএমএম আমাকে বলে মেমোরি ফাঁস হয়, আমি সরঞ্জামগুলি ডাউন করে তাৎক্ষণিকভাবে ঠিক করে ফেলি। যদি আপনি এটি না করেন তবে আপনার ফাঁসের পুনরুত্পাদন করা কঠিন হবে। আপনি যদি সত্যিই ডাটাবেসে লগইন করতে চান তবে আপনাকে চেকব্লকসঅনশটডাউন ফাংশনটি দেখতে হবে। আর একটি সম্ভাব্য এক্সটেনশন পয়েন্টটি AppendEventLogকিন্তু আপনার সন্দেহ হওয়া ফাস্টএমএম উত্সটি সংশোধন করা দরকার।
ডেভিড হেফারনান

12
এর্ম শুধু ফাইলটি তুলে নিয়েছে, পার্স করে ডিবিতে রাখবে?
টনি হপকিনসন

উত্তর:


2

এমনকি যদি এই ধরনের হ্যান্ডলার উপস্থিত থাকে তবে এটি প্রায় অকেজো হবে কারণ ফাস্টএমএম ফাঁস হওয়ার সময় ডিবি সহ সমস্ত কিছু বন্ধ হয়ে যাবে।

সুতরাং, আমি আপনাকে পরামর্শ দিয়েছি শর্তাবলীর LogErrorsToFileপাশাপাশি চালু করুন । এটি আপনাকে ফাঁসযুক্ত একটি পাঠ্য ফাইল দেবে, যা পরে আপনি বিশ্লেষণ করে ডিবিতে রেখে দিতে পারেন।FullDebugModeFastMM4Options.inc

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.