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
예상 누출로보고 되었습니까? 예상대로 등록 했습니까? 또한 예상 수명을 이해하는 복잡한 논리를 제공하지 않는 한 종료 할 때까지 메모리 누수를 결정할 수 없습니다.
David Heffernan 2012-01-09

6
경우 OnDebugFreeMemFinish그 수단이라고 블록은 해제되었다. OnMemoryLeak이벤트 가 없습니다 . 그런 이벤트는있을 수 없습니다. FastMM이하는 일은 종료시 해제되지 않은 모든 블록이 누출되어야 함을 결정하는 것입니다. 그 이전에는 누출을 감지 할 수 없습니다.
David Heffernan 2012-01-09

12
FastMM이 메모리 누수가 있다고 말할 때마다 도구를 다운시키고 즉시 수정합니다. 그렇게하지 않으면 누출을 재현하기가 어렵습니다. 정말로 데이터베이스에 기록하고 싶다면 CheckBlocksOnShutdown 함수를 살펴 봐야합니다. 또 다른 잠재적 인 확장 점은 AppendEventLog내가 의심하는 FastMM 소스를 수정해야한다는 것입니다.
David Heffernan 2012-01-09

12
음 그냥 파일을 가져 와서 파싱하고 DB에 넣을까요?
Tony Hopkinson 2012

답변:


2

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

따라서에서 조건부 LogErrorsToFile와 함께 켜는 것이 좋습니다 . 이렇게하면 누수가있는 텍스트 파일이 제공되며 나중에 파싱하여 DB에 넣을 수 있습니다.FullDebugModeFastMM4Options.inc

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.