====== HeapTrc et gestion de la mémoire ======
HeapTrc permet de détecter des éventuelles "fuites" de mémoire lors du débuggage.
===== HeapTrc =====
==== Activation=====
Dans ''Options pour le Projet'', partie ''Débogage'', cocher la case ''Utiliser l'unité HeapTrc''
{{:prog:lazarus:debug:heaptrc2.png|}}
==== Résultat ====
A la fin de l'execution du programme on obtient une fenetre de ce style
{{:prog:lazarus:debug:heaptrc1.png|}}
''O unfreed memory blocks : 0'' = OK tout va bien !
==== Améliorations ====
=== N'Afficher que si il y a des erreurs ===
Si vous ne voulez pas voir la fenêtre de sortie quand tout va bien, juste quand il y a des erreurs, il vous faudra mettre ce bout de code dans le fichier ''.lpr'' de votre projet
{$if declared(useHeapTrace)}
globalSkipIfNoLeaks := true;
{$endIf}
Vue d'ensemble :
program MonProg;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}
{$IFDEF UseCThreads}
cthreads,
{$ENDIF}
{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms,
uMainForm;
{$R *.res}
begin
{$if declared(useHeapTrace)}
globalSkipIfNoLeaks := true;
{$endIf}
RequireDerivedFormResource := True;
Application.Scaled := True;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
===== THeapStatus =====
THeapStatus sert a récuperer les infos sur la mémoire utilisée par le programme
==== Déclaration ====
dans l'unité (???) heaph.inc
THeapStatus = record
TotalAddrSpace: Cardinal;
TotalUncommitted: Cardinal;
TotalCommitted: Cardinal;
TotalAllocated: Cardinal;
TotalFree: Cardinal;
FreeSmall: Cardinal;
FreeBig: Cardinal;
Unused: Cardinal;
Overhead: Cardinal;
HeapErrorCode: Cardinal;
end;
==== Utilisation ====
Var
FHeap: THeapStatus;
procedure TForm1.WriteHeapStatus;
begin
FHeap := GetHeapStatus; // A appeler à chaque fois que l'on veut lire les données
writeln(format('TotalAllocated:%d (%d)', [FHeap.TotalAllocated, FHeap.TotalAllocated - FLastAllocated]));
writeln(format('TotalFree:%d (%d)', [FHeap.TotalFree, FHeap.TotalFree - FLastFree]));
FLastFree := FHeap.TotalFree;
FLastAllocated := FHeap.TotalAllocated;
end;
===== Voir aussi =====
* [[https://wiki.freepascal.org/heaptrc]]
* [[https://wiki.freepascal.org/leakview]]
* [[https://www.developpez.net/forums/blogs/600183-gvasseur58/b2107/gestion-fuites-memoire-lazarus/]]