FastMM4 a detekce přepisu paměti

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{$APPTYPE CONSOLE}
    3uses
    4  FastMM4,
    5  SysUtils, Classes;
    6var
    7  ai: array of byte;
    8begin
    9//lze i FullDebugModeScanMemoryPoolBeforeEveryOperation := True;
   10// ale je to hrozne pomale a jen pro extremni pripady
   11    SetLength(ai, 10);
   12    FillChar(ai[0], 11, 23);
   13    writeln(ai[0]);
   14    SetLength(ai, 5); // FastMM (fulldebugmode) detect problem
   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).

realloc FastMM4

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

realloc FastMM4 FastMM_FullDebugMode.dll

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.

EOutOfMemory

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ří.


Nabízíme Delphi školení a konzultace na různá témata, primárně ve Vaší firmě.

Tagy: , ,

Praxe

Komentáře

3.1.2011 23:45:11 #

pingback

Pingback from topsy.com

Twitter Trackbacks for
        
        Delphi.cz | FastMM4 a detekce pĹ™episu pamÄ›ti
        [delphi.cz]
        on Topsy.com

topsy.com

Komentování ukončeno

Naše nabídka

Partial English version.

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy nebo burzy práce).

Pokud chcete podpořit tento server libovolnou částkou, můžete použít PayPal. Moc děkuji.

Delphi Certified Developer

O Delphi.cz

Delphi je jediný moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64 , Mac OSX a na iPhone a Android (s výhledem na další platformy díky FireMonkey) na současném trhu (včetně Windows 8.1).

V současnosti je světová komunita přes dva miliónů vývojářů.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Anketa

Poslední komentáře

Comment RSS