Próbuję wykryć, czy blok pamięci nie został zwolniony. Oczywiście menedżer mówi mi o tym w oknie dialogowym lub pliku dziennika, ale co jeśli chciałbym przechowywać wyniki w bazie danych? Na przykład chciałbym mieć w tabeli bazy danych nazwy procedur, które przydzieliły dane bloki.
Po przeczytaniu dokumentacji FastMM wiem, że od wersji 4.98 mamy możliwość powiadamiania menedżera o alokacjach, zwolnieniach i realokacjach pamięci w momencie ich wystąpienia. Na przykład OnDebugFreeMemFinish
przekazuje nam zdarzenie, PFullDebugBlockHeader
które zawiera przydatne informacje. Brakuje tylko jednego PFullDebugBlockHeader
- informacji czy dany blok został zwolniony przez aplikację.
Chyba że OnDebugFreeMemFinish
jest wezwany tylko do niezwolnionych bloków? Tego nie wiem i chciałbym się dowiedzieć.
Problem polega na tym, że nawet podłączając się do OnDebugFreeMemFinish
zdarzenia nie byłem w stanie dowiedzieć się, czy blok został zwolniony, czy nie.
Oto przykład:
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.
Brakuje mi oddzwonienia takiego jak:
procedure OnMemoryLeak(APointer: PFullDebugBlockHeader);
Po przejrzeniu źródła FastMM zobaczyłem, że istnieje procedura:
procedure LogMemoryLeakOrAllocatedBlock(APointer: PFullDebugBlockHeader; IsALeak: Boolean);
które można by przesłonić, ale może istnieje prostszy sposób?
OnDebugFreeMemFinish
zostanie wywołane, oznacza to, że blok został zwolniony. Nie ma żadnegoOnMemoryLeak
wydarzenia. Nigdy nie mogło być takiego wydarzenia. To, co robi FastMM, polega na ustaleniu podczas zamykania, że wszelkie bloki, które nie zostały uwolnione, muszą być przeciekami. Nie może wykryć wycieku wcześniej.AppendEventLog
ale podejrzewam, że będziesz musiał zmodyfikować źródło FastMM.Odpowiedzi:
Nawet gdyby taki program obsługi istniał, byłby prawie bezużyteczny, ponieważ wszystko, łącznie z bazą danych, zostałoby wyłączone w momencie, gdy FastMM zgłasza wycieki.
Sugeruję więc włączenie
LogErrorsToFile
wraz zFullDebugMode
warunkami warunkowymiFastMM4Options.inc
. W ten sposób otrzymasz plik tekstowy z przeciekami, który później możesz przeanalizować i umieścić w DB.źródło