มีวิธีที่จะบอกได้โดยทางโปรแกรมหรือไม่ว่า FastMM บล็อกหน่วยความจำบางส่วนไม่ได้เป็นอิสระหรือไม่?


103

ฉันกำลังพยายามตรวจสอบว่าบล็อกหน่วยความจำไม่ได้รับการปลดปล่อยหรือไม่ แน่นอนผู้จัดการบอกฉันโดยใช้กล่องโต้ตอบหรือไฟล์บันทึก แต่ถ้าฉันต้องการเก็บผลลัพธ์ในฐานข้อมูลล่ะ? ตัวอย่างเช่นฉันต้องการมีชื่อของรูทีนในตารางฐานข้อมูลที่จัดสรรบล็อกที่กำหนดไว้ในตารางฐานข้อมูล

หลังจากอ่านเอกสารของ FastMM ฉันรู้ว่าตั้งแต่เวอร์ชัน 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);

หลังจากเรียกดูแหล่งที่มาของ FastMM ฉันเห็นว่ามีขั้นตอน:

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

ซึ่งสามารถลบล้างได้ แต่อาจมีวิธีที่ง่ายกว่านี้


7
ฉันเข้าใจมาตลอดว่า FastMM สามารถทำการตรวจสอบนี้เป็นการดำเนินการที่รวดเร็วมากที่โปรแกรมควรทำ - ตามคำจำกัดความ - ดังนั้นเมื่อ FastMM รายงานรหัสของคุณเสร็จสิ้น หากต้องการรับโซลูชันบางส่วนคุณสามารถดูในแหล่งที่มาเพื่อดูว่าหน่วยความจำที่จัดสรรถูกตั้งค่าสถานะอย่างไร
Brian Frost

6
รายงานว่ารั่วไหล? คุณลงทะเบียนตามที่คาดไว้หรือไม่ นอกจากนี้คุณไม่สามารถตัดสินใจได้ว่าหน่วยความจำจะรั่วไหลจนกว่าจะปิดเครื่องเว้นแต่คุณจะระบุตรรกะที่ซับซ้อนที่เข้าใจอายุการใช้งานที่คาดไว้
เดวิดเฮฟเฟอร์แนน

6
ถ้าOnDebugFreeMemFinishถูกเรียกนั่นหมายความว่าบล็อกนั้นถูกปลดปล่อย ไม่มีOnMemoryLeakเหตุการณ์ใดๆ ไม่เคยมีเหตุการณ์เช่นนี้ สิ่งที่ FastMM ทำคือในการปิดระบบตรวจสอบว่าบล็อกใด ๆ ที่ไม่ได้รับการปลดปล่อยจะต้องมีการรั่วไหล ไม่สามารถตรวจพบการรั่วไหลเร็วกว่านั้น
David Heffernan

12
เมื่อใดก็ตามที่ FastMM แจ้งว่ามีหน่วยความจำรั่วฉันจะลงเครื่องมือและแก้ไขทันที หากคุณไม่ทำเช่นนั้นคุณจะพบว่าการรั่วไหลเกิดขึ้นใหม่นั้นทำได้ยาก หากคุณต้องการเข้าสู่ฐานข้อมูลจริงๆคุณจะต้องดูที่ฟังก์ชัน CheckBlocksOnShutdown จุดขยายอื่นที่เป็นไปได้คือAppendEventLogแต่คุณจะต้องแก้ไขแหล่ง FastMM ที่ฉันสงสัย
David Heffernan

12
เอิ่มแค่หยิบไฟล์แยกวิเคราะห์แล้วใส่ลงใน DB?
Tony Hopkinson

คำตอบ:


2

แม้ว่าตัวจัดการดังกล่าวจะมีอยู่ แต่ก็แทบจะไร้ประโยชน์เนื่องจากทุกอย่างรวมถึง DB จะปิดตัวลงเมื่อรายงาน FastMM รั่วไหล

ดังนั้นผมขอแนะนำให้คุณเปิดLogErrorsToFileพร้อมกับเงื่อนไขในFullDebugMode FastMM4Options.incสิ่งนี้จะให้ไฟล์ข้อความที่มีการรั่วไหลซึ่งคุณสามารถแยกวิเคราะห์และใส่ลงในฐานข้อมูลได้ในภายหลัง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.