Jak v Delphi najít přesné místo úniku paměti pomocí FastMM knihovny

1. 12. 2016, Vladimír Klaus, přečteno 520x

Delphi

Pokud chcete programovat opravdu poctivě, jednu z věcí, na kterou byste měli dbát, je ošetření úniků paměti. V Delphi je možné hlídání zapnout velmi jednoduše. Jen je vhodné ji mít zapnutou, jen když pracujete z Delphi.

if DebugHook<>0 then ReportMemoryLeaksOnShutdown:=True;

 A když pak ukončujete aplikaci, může se objevit takováto hláška.

Jak v Delphi najít přesné místo úniku paměti pomocí FastMM knihovny, obr. 1

U menší aplikace se dá poměrně lehce najít v čem a kde je problém. U rozsáhlejší nebo u příliš dlouhého seznamu úniků už to je o dost horší.

Velmi nám může pomoci knihovna FastMM a postup popsaný níže v odkazovaných zdrojích. Já ho zde uvedu krátce, přehledně a na konkrétním příkladu, kde jsem to opravdu sám využil.

Nejprve je třeba stáhnout plnou verzi FastMM knihovny, protože ta, co je součástí Delphi nedostačuje. Pak je třeba se na ni odkázat v projektu a to hned z prvního místa.

program ADC2012;

uses
  FastMM4, //<<<<<<< zde to je
  Forms,
  Windows,
  Main in 'Main.pas' {MainForm},

Knihovnu si rozbalte někam, kam na ní bude z projektu vidět. Nejdůležitější jsou tyto 3 soubory:

  • FastMM4Options.inc
  • FastMM4.pas
  • FastMM4Messages.pas

Pak ještě otevřete FastMM4Options.inc, v něm najděte {.$define FullDebugMode} a odstraňte tečku před dolarem, aby se tento parametr při překladu aplikoval.

Také je potřeba, aby se překládalo s parametrem Map file = Detailed.

Jak v Delphi najít přesné místo úniku paměti pomocí FastMM knihovny, obr. 2

Poslední věcí, kterou je potřeba udělat, je umístit FastMM_FullDebugMode.dll do systémové složky Windows, což v případě x64 verze je do c:\Windows\SysWOW64\.

Nyní, když spustíme a ukončíme aplikaci, objeví se trochu detailnější informace, která nám stále ale moc nepomůže.

Jak v Delphi najít přesné místo úniku paměti pomocí FastMM knihovny, obr. 3

To hlavní co ale vzniká, je soubor ADC2012_MemoryManager_EventLog.txt, který je umístěn přímo u aplikace. V něm po chvilce objevíte řádku, která zřejmě má něco společného s naším problémem.

Jak v Delphi najít přesné místo úniku paměti pomocí FastMM knihovny, obr. 4

Pak už stačí najít příslušný soubor ADCConvertor.pas a v něm řádek 224 a je nám hned jasné, jaký že objekt jsme asi zapomněli uvolnit.

Jak v Delphi najít přesné místo úniku paměti pomocí FastMM knihovny, obr. 5

Pochopitelně je třeba připomenout, že nejlepší je, když ke krokům zde uvedeným nikdy nebudete muset sáhnout. Správná praxe je vždy taková, že spolu s vytvářením objektu je třeba ihned psát jeho uvolňování. Ale když se někdy spěchá... :-)

Zdroje: