103 votes

Y a-t-il un moyen de dire par programme si un bloc particulier de mémoire n’est pas libéré par FastMM ?

Je suis en train d'essayer de détecter si un bloc de mémoire n'était pas libérée. Bien sûr, le gestionnaire m'a dit que par la boîte de dialogue ou un fichier journal, mais si je voudrais stocker les résultats dans une base de données? Pour exemple, j'aimerais avoir dans une table de base de données un des noms de routines qui a alloué donné des blocs.

Après la lecture d'une documentation de FastMM je sais que depuis la version 4.98 nous avons une possibilité d'être informé par le gestionnaire sur les allocations de mémoire, libère et réaffectations à mesure qu'ils surviennent. Par exemple OnDebugFreeMemFinish événement est de passage pour nous un PFullDebugBlockHeader qui contient des informations utiles. Il y a une chose qu' PFullDebugBlockHeader manque de l'information si le bloc a été libéré par l'application.

À moins d' OnDebugFreeMemFinish n'est appelé que pour ne pas libéré des blocs? C'est que je ne sais pas et que vous souhaitez trouver.

Le problème, c'est que même l'accrochage en OnDebugFreeMemFinish événement que j'étais incapable de savoir si le bloc a été 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 que je suis en manque, c'est le rappel comme:

procedure OnMemoryLeak(APointer: PFullDebugBlockHeader);

Après avoir profité de la source de FastMM, j'ai vu qu'il y a une procédure à suivre:

procedure LogMemoryLeakOrAllocatedBlock(APointer: PFullDebugBlockHeader; IsALeak: Boolean);

ce qui pourrait être changé, mais peut-être il ya un moyen plus facile?

3voto

2voto

Sergiy Kheylyk Points 576

Même si ce gestionnaire existe, il serait presque inutile, car tout, y compris DB serait fermée à l’époque, lorsque FastMM fait état de fuites.

Donc, je suggère que vous transformiez avec conditionnels dans `` . Cela vous donnera un fichier de texte avec des fuites, qui par la suite, vous pouvez analyser et mettre en DB.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X