Ladění za pomoci SafeMM

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.


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

Tagy: , ,

Komentáře

18.7.2012 2:13:42 #

Safrad

Tady je novejsi verze 0.6 pro Delphi XE2:
http://cc.embarcadero.com/item/28681

Pri pouziti s Indy v Delphi XE nastava "Runtime error". Opravit to lze dodefinovanim SafeRegisterExpectedMemoryLeak a SafeUnregisterExpectedMemoryLeak.

http://code.google.com/p/sx-library/source/diff?spec=svn295&r=295&format=side&path=/trunk/ExtLib/SafeMM/SafeMM.pas

Safrad

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