메모리 블록이 해제되지 않았는지 감지하려고합니다. 물론 관리자는 대화 상자 나 로그 파일로 알려주지 만 결과를 데이터베이스에 저장하려면 어떻게해야합니까? 예를 들어, 주어진 블록을 할당 한 루틴의 이름을 데이터베이스 테이블에 갖고 싶습니다.
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);
재정의 할 수 있지만 더 쉬운 방법이 있을까요?
답변
이러한 핸들러가 존재하더라도 FastMM이 누출을보고하면 DB를 포함한 모든 것이 종료되므로 거의 쓸모가 없습니다.
따라서에서 조건부 LogErrorsToFile
와 함께 켜는 것이 좋습니다 . 이렇게하면 누수가있는 텍스트 파일이 제공되며 나중에 파싱하여 DB에 넣을 수 있습니다.FullDebugMode
FastMM4Options.inc