2012-01-09 5 views
102

메모리 블록이 해제되지 않았는지 감지하려고합니다. 물론 관리자가 대화 상자 나 로그 파일을 통해 나에게 결과를 데이터베이스에 저장하고 싶다면 어떻게할까요? 예를 들어 주어진 테이블을 할당 한 루틴의 이름을 데이터베이스 테이블에 갖고 싶습니다.특정 블록의 메모리가 FastMM에 의해 해제되지 않았는지 프로그래밍 방식으로 알 수 있습니까?

FastMM에 대한 문서를 읽은 후 버전 4.98부터 관리자가 메모리 할당, 해제 및 재 할당에 대한 알림을받을 수 있음을 알고 있습니다. 예를 들어 OnDebugFreeMemFinish 이벤트는 유용한 정보가 포함 된 PFullDebugBlockHeader으로 전달됩니다. PFullDebugBlockHeader이 누락 된 한 가지가 있습니다. 해당 블록이 응용 프로그램에 의해 해제 된 경우의 정보입니다.

해제되지 않은 블록에만 OnDebugFreeMemFinish이 호출되지 않으면? 이것은 내가 모르고 알아 내고 싶습니다.

문제는 심지어 OnDebugFreeMemFinish 이벤트에 연결되어있어 차단 해제 여부를 확인할 수 없었습니다.

procedure LogMemoryLeakOrAllocatedBlock(APointer: PFullDebugBlockHeader; IsALeak: Boolean); 
: 나는 과정이 있음을 보았다 FASTMM의 원인을 탐색 한 후

procedure OnMemoryLeak(APointer: PFullDebugBlockHeader); 

:

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

적절한 설정으로 전체 FastMM을 사용하면 시스템 종료시 유출 된 모든 블록에 대한 자세한 보고서를 받게됩니다. 이것이 당신의 필요에 충분하지 않습니까? –

+0

아니오, 필자가 썼습니다. "누출은 응용 프로그램을 닫을 때 예상대로보고됩니다."그리고 이것은 원하지 않습니다. 나 혼자서 기록하고 싶다. – Wodzu

+7

필자는 항상 FastMM이 프로그램이 정의해야하는 매우 최종적인 작업으로 만이 검사를 수행 할 수 있음을 이해했습니다. 따라서 FastMM이 보고서 작성을 마칠 때까지 코드가 완료됩니다. 부분적인 해결책을 얻으려면 할당 된 메모리에 플래그가 지정되었는지 확인하기 위해 항상 소스를 살펴볼 수 있습니다. –

답변

1

그런 핸들러가 존재하더라도 FastMM이 누수를보고 할 때 DB를 포함한 모든 것이 종료되므로 거의 쓸모가 없습니다.

조건을 FastMM4Options.inc과 함께 LogErrorsToFile과 함께 설정하는 것이 좋습니다. 이렇게하면 나중에 누수가있는 텍스트 파일이 파싱되어 DB에 저장됩니다.