J'essaye de détecter si un bloc de mémoire n'a pas été libéré. Bien sûr, le gestionnaire me dit cela par boîte de dialogue ou fichier journal, mais que faire si je souhaite stocker les résultats dans une base de données? Par exemple, je voudrais avoir dans une table de base de données des noms de routines qui allouent des blocs donnés.
Après avoir lu une documentation de FastMM, je sais que depuis la version 4.98, nous avons la possibilité d'être averti par le gestionnaire des allocations de mémoire, des libérations et des réallocations au fur et à mesure qu'elles se produisent. Par exemple, l' OnDebugFreeMemFinish
événement nous transmet un PFullDebugBlockHeader
qui contient des informations utiles. Il PFullDebugBlockHeader
manque une chose : les informations si le bloc donné a été libéré par l'application.
À moins que ne OnDebugFreeMemFinish
soit appelé uniquement pour les blocs non libérés? C'est ce que je ne sais pas et que j'aimerais découvrir.
Le problème est que même en OnDebugFreeMemFinish
me connectant à un événement, je n'ai pas pu savoir si le bloc était libéré ou non.
Voici un exemple:
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.
Ce qui me manque, c'est le rappel comme:
procedure OnMemoryLeak(APointer: PFullDebugBlockHeader);
Après avoir parcouru la source de FastMM, j'ai vu qu'il y avait une procédure:
procedure LogMemoryLeakOrAllocatedBlock(APointer: PFullDebugBlockHeader; IsALeak: Boolean);
qui pourrait être annulé, mais peut-être existe-t-il un moyen plus simple?
OnDebugFreeMemFinish
est appelé, cela signifie que le bloc a été libéré. Il n'y a pas d'OnMemoryLeak
événement. Il ne pourrait jamais y avoir un tel événement. Lors de l'arrêt, FastMM détermine que tous les blocs qui n'ont pas été libérés doivent être des fuites. Il ne peut pas détecter une fuite avant cela.AppendEventLog
mais vous devrez modifier la source FastMM que je soupçonne.Réponses:
Même si un tel gestionnaire existait, il serait presque inutile, car tout, y compris la base de données, serait arrêté au moment où FastMM signale des fuites.
Donc, je vous suggère d'activer
LogErrorsToFile
avec lesFullDebugMode
conditionsFastMM4Options.inc
. Cela vous donnera un fichier texte avec des fuites, que vous pourrez ensuite analyser et mettre dans DB.la source