dinsdag 4 september 2007

Adv. Delphi debugging: Exception stack trace

Je kent het wel, je bent zelf je code aan het testen op een andere pc of door gebruikers c.q. testers,
en je krijgt allerlei ongrijpbare “acces violations”, ontraceerbare “index out of bounds” etc.
Normaal kun je in Delphi deze fouten debuggen, onder andere met de “stack view”, maar die heb
je niet op het test systeem staan.

Als oplossing hiervoor is de jclDebug unit van JEDI library:
http://sourceforge.net/projects/jcl

Met het volgende commando zet je “exception tracing” aan:
jclDebug.JclStartExceptionTracking

Om de stack trace bij een exception uit te lezen:
jclDebug.JclLastExceptStackListToStrings(str, True, True, True);

Bijvoorbeeld:
procedure TForm1.FormCreate(Sender: TObject);
begin
jclDebug.JclStartExceptionTracking;
Application.OnException := HandleException;
end;

procedure TForm1.HandleException(Sender: TObject; E: Exception);
var
str:TStrings;
begin
str := TStringList.Create;
jclDebug.JclLastExceptStackListToStrings(str, False, False, True);
MessageDlg( e.Message + #10#13 + str.Text, mtError, [mbOK], 0 );
str.free;
end;

Je zou dan bij een error het volgende kunnen krijgen:

EAccessViolation with message ‘Access violation at address 00403924. Read of address 2009FFD4′.
[00403924] System.TObject.ClassName (Line 8726, “sys\system.pas” + 3)
[0046A8AC] frmMain.TForm1.DoSomethingStupid (Line 77, “frmMain.pas” + 1)
[0046A88A] frmMain.TForm1.DoSomething (Line 72, “frmMain.pas” + 1)
[0046A877] frmMain.TForm1.btnTestClick (Line 67, “frmMain.pas” + 1)

Bij een stack trace is de bovenste altijd de laatste en nieuwste item, je moet dus van
onderen naar boven lezen. Dan zien we dat we op “btnTest” geklikt hebben (”btnTestClick”), waardoor
procedure “DoSomething” uitgevoerd werd. Deze voerde “DoSomethingStupid”, die de “ClassName” opvroeg
van een niet-bestaand object. Dit had een “acces violation” tot gevolg.

Dit geeft een duidelijk beeld wanneer en hoe de fout tot stand kwam. Zelf dump ik als deze informatie
in een log bestand en niet op het scherm (gebruikers schrikken daar zo van :-) ), zodat ik eenvoudig
alle stack traces van de fouten kan bekijken.

Dit is nog maar een enkele mogelijkheid van de jclDebug unit: het bevat nog meer handige debug functies,
maar die kan ik hier niet allemaal behandelen. Speel er eens mee, zou ik zeggen.

Geen opmerkingen: