Snad už naposledy malá poznámka ohledně využití FastMM4 při ladění. Tentokráte jak na detekci zápisu mimo alokovanou paměť.
O FullDebugMode jsem již psal - pro jistotu: stačí v inc souboru povolit FullDebugMode (je tam na to řádek). Pokud to uděláme, bude náš správce paměti každý alokovaný blok ohraničovat na začátku a na konci kontrolním součtem a tento součet bude kontrolován při každé operaci (jako je realokace nebo uvolnění paměti).
Kromě toho lze ještě přitvrdit a donutit FastMM ke kontrole všech alokací při každé operaci, ale to už je opravdu zbytečné - je to opravdu, ale opravdu pomalé.
Uvedu malé demo: alokace dynamického pole o velikosti 10 byte a jeho naplnění 11 byte s hodnotou 23 (17h) - tj. překročení o 1byte. Ve výpisu je těch 11 byte vidět a "footer" nám označuje, že je porušena oblast za.
program Project1;
{$APPTYPE CONSOLE}
uses
FastMM4,
SysUtils, Classes;
var
ai: array of byte;
begin
//lze i FullDebugModeScanMemoryPoolBeforeEveryOperation := True;
// ale je to hrozne pomale a jen pro extremni pripady
SetLength(ai, 10);
FillChar(ai[0], 11, 23);
writeln(ai[0]);
SetLength(ai, 5); // FastMM (fulldebugmode) detect problem
finalize(ai);
end.
Pokud máme FastMM v módu fulldebug, zobrazí se při provádění řádku 14 následují hláška (pokud by nebyla realokace, došlo by k zobrazení při uvolňování nebo při ukončování programu).

Pokud zároveň má program dostupnou knihovnu FastMM_FullDebugMode.dll dostaneme trošku šťavnatější výstup:

Lze zde najít informaci o tom kde byla provedena původní alokace (Q:\boundary\Project1.dpr - řádek 10) a kde vznikla vlastní chyba (Q:\boundary\Project1.dpr - řádek 13). Pozn. řádky odpovídají původnímu programu - ne výpisu, který jsem musel zalomit.
Navíc je následně vyhozena výjimka EOutOfMemory jako indikace problému a ukončení provádění akce.

Tato detekce podle mne nefunguje pro nedynamická data, tj. statické pole a spol.
Původní správce paměti (tj. do verze Delphi 2005 bez instalace FastMM) nebo FastMM bez debug módu informaci o přepsání paměti nedávají. Pokud máme FastMM bez debug módu tak se o alokaci starají vysoce optimalizované funkce a takové kontroly tam nepatří.