vložil Radek Červinka
3. ledna 2011 22:17
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.
1program Project1;
2
3uses
4 FastMM4,
5 SysUtils, Classes;
6var
7 ai: array of byte;
8begin
9
10
11 SetLength(ai, 10);
12 FillChar(ai[0], 11, 23);
13 writeln(ai[0]);
14 SetLength(ai, 5);
15 finalize(ai);
16end.
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ří.