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.

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).

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

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

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).

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.

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.

Poslední komentáře

Comment RSS

Dle měsíců