vložil Radek Červinka
4. července 2012 16:01
Pravidelní čtenáři snad chápou, že se tématu ladění věnuji dost podrobně.
Schopnost najít chybu je podle mne to, co odlišuje vynikajícího programátora od zbytku. Postupně jsem se snažil ukazovat různé nástroje a finty jak si práci v této oblasti zjednodušit (počínaje fulldebug mode u FastMM, přes seriál o debuggeru atd).
Dnes ukáži zajímavou možnost a tou je SafeMM.
SafeMM je správce paměti (podobně jako FastMM), ale s tím, že není určen pro normální nasazení, ale jen pro odchycení problémů.
Mějme následující kód:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, Classes;
var
ls: TStringList;
begin
try
ls := TStringList.Create;
ls.Add('Hello boys');
ls.Free;
ls.Add('and girls');
writeln(ls.Text);
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
end.
Je na první pohled vidět co je špatně, ale přesto bude program s velkou pravděpodobností fungovat, jelikož objekt je sice uvolněn, ale nikdo ten jeho flák paměti zatím nepoužil (a kdyby použil tak tím hůře). Samozřejmě se vzdáleností mezi Free a pokračováním pravděpodobnost problémů narůstá - takové chyby se špatně hledají.
Pokud nasadíme SafeMM tak se situace změní. SafeMM funguje tak, že vrácená paměť je označena pomocí ochrany OS jako protected a není dále přidělována! To znamená, že spotřeba velmi narůstá (a proto se nesmí používat v reálném provozu), ale na druhou stranu, jakýkoliv přístup k takovému protected bloku způsobí AV.
Instalace je podobná jako u FastMM - první unit v projektu musí být
uses
SafeMMInstall, ….
A to je vše. Program nyní po spuštění zahlásí AV na řádku s ls.Add('and girls'); tak jak by to v ideálním světě mělo být.