Urmărirea stivei de apeluri în timpul execuției cu Delphi

TMS Software Componente Delphi

Suntem obișnuiți să inspectăm o stivă de apeluri atunci când ceva nu merge bine în aplicația noastră și se blochează. Delphi are instrumente suplimentare excelente care înregistrează informații detaliate despre stiva de apeluri atunci când o aplicație se blochează.

Dar nu întotdeauna când o aplicație se blochează informațiile din stiva de apeluri pot fi utile. Din când în când, simțim că, având informații detaliate despre stiva de apeluri în timpul unei aplicații care rulează obișnuit, ne poate ajuta să urmărim situații nedorite. Recent, s-a întâmplat ca, în cazuri rare, o proprietate a unei componente să aibă o valoare neașteptată. În aplicația în care a fost utilizată componenta, această proprietate a fost setată din multe părți ale codului și cadrul VCL însuși și a fost mai ales o chestiune de a ști de unde exact a fost setată valoarea neașteptată. Odată ce am știut, am putea înțelege și rezolva problema. Capacitatea de a face doar în timpul executării un instantaneu al stivei de apeluri atunci când a fost setată o anumită valoare a fost suficientă pentru a găsi vinovatul.

Așadar, deși această capacitate ne-a salvat deja pentru mai multe cazuri o perioadă enormă de timp, ne-am gândit că este interesant să o punem la dispoziție și pentru dvs. în TMS MemInsight .

În timp ce TMS MemInsight vă va oferi, în timpul executării, o perspectivă asupra stivei de apeluri atunci când apar excepții, acum există o metodă simplă GetCallStack(sl: TStrings) pe care o puteți apela de oriunde și de câte ori doriți și va reveni informații detaliate despre stiva de apeluri. Singura cerință este să vă conectați aplicația cu o informație detaliată a hărții (consultați Opțiuni de linker sub Opțiuni de proiect)

Cum functioneaza?

Imaginați-vă că există o clasă TMyClass cu o proprietate Text:

 TMyClass = clasa (TPersistent)
protejat
procedura SetText(const Value: string);
public
text de proprietate: șir citire FText scrie SetText;
Sfârşit;

Acum, vrem să știm de unde exact în aplicația noastră, această proprietate Text de clasă ar fi setată cu o valoare de șir goală.

Putem scrie setter-ul proprietăților în felul următor:

 utilizări
TMS.MI.Core;

interfata

tip
TMyClass = clasa (TPersistent)
protejat
procedura SetText(const Value: string);
public
text de proprietate: șir citire FText scrie SetText;
Sfârşit;

implementare

proceduer TMyClass.SetText(const Value: string);
var
sl: TStringList;
ÎNCEPE
FText := Valoare;
dacă FText = '' atunci
ÎNCEPE
sl := TStringList.Create;
încerca
GetCallStack(sl);
sl.SaveToFile('c:tempcallstack.log');
in cele din urma
sl.Gratuit;
Sfârşit;
Sfârşit;
Sfârşit;

Acum, la nivel de aplicație, putem folosi această clasă de exemplu ca:

 MyClass.Text := Edit1.Text;

iar când proprietatea text este setată cu un șir gol, vom obține un raport frumos de urmărire a stivei care ne oferă informațiile pe care le doream.

Pentru acest exemplu, creăm la nivelul clasei TForm metoda pentru a seta myClass.Text prin:

 TForm1 = clasa (TForm)
privat
{ Declarații private }
procedura SetClassText(s: string);
Sfârşit;

implementare

procedura TForm1.SetClassText(s: string);
ÎNCEPE
  clasa mea.Text := s;
Sfârşit;

și când numim acest lucru atât din evenimentul OnChange al unui control de editare, cât și din evenimentul OnClick al butonului de formular:

 procedura TForm1.Button1Click(Expeditor: TObject);
ÎNCEPE
SetClassText(Edit1.Text);
Sfârşit;

procedura TForm1.Edit1Change(Expeditor: TObject);
ÎNCEPE
SetClassText(Edit1.Text);
Sfârşit;

Acum, obținem un jurnal frumos de urmărire a stivei când proprietatea clasei Text este setată cu o valoare de șir goală:

 TMyClass.SetText (57)
TForm1.SetClassText (77)
TForm1.Button1Click (43)
TControl.Click (7443)
TWinControl.WndProc (10162)
TButtonControl.WndProc (2617)
....

indicând că acest lucru a fost apelat de la butonul OnClick.

Disponibil acum în TMS MemInsight v1.1

TMS MemInsight v1.1 este lansat și include acum această caracteristică în plus față de multele capacități de inspecție a utilizării memoriei în timpul executării pe care le includea deja. Pentru utilizatorii activi cu licență, această actualizare este gratuită și are și alte optimizări de performanță. Verifică! Ar putea fi foarte valoros atunci când întâmpinați următoarea provocare de a depana o problemă rară/dificil de găsit în aplicația dvs.