Logging exceptions

From Lazarus wiki
Revision as of 08:55, 3 September 2010 by Chronos (talk | contribs)
Jump to navigationJump to search

Introduction

Stacktrace is sometimes called Backtrace or Call stack and have meaning of list of stack frames placed on stack containing return address and local variables. Stacktrace is useful to trace back path of execution of nesting procedures.


Compiler have to be directed to get debug information by switches.

  • -g - generate debug informations
  • -gl - generate line numbers for debug informations


Unit SysUtils

Contains some routines useful for debugging exceptions.

<delphi>{ Exception handling routines } function ExceptObject: TObject; function ExceptAddr: Pointer; function ExceptFrameCount: Longint; function ExceptFrames: PPointer;</delphi>

Unit System

Contains some stack related routines: <delphi>function SysBackTraceStr(Addr:Pointer): ShortString; // Default address to string converter assigned to BackTraceStrFunc procedure Dump_Stack(var f : text;bp:pointer); // Dump stack to text file procedure DumpExceptionBackTrace(var f:text); // Dump backtrace to text file</delphi>

Unit LCLProc

<delphi>// Debugging procedure RaiseGDBException(const Msg: string); procedure RaiseAndCatchException; procedure DumpExceptionBackTrace; procedure DumpStack; function GetStackTrace(UseCache: boolean): string; procedure GetStackTracePointers(var AStack: TStackTracePointers); function StackTraceAsString(const AStack: TStackTracePointers;

                           UseCache: boolean): string;

function GetLineInfo(Addr: Pointer; UseCache: boolean): string;</delphi>

Unit LineInfo

Is automatically included to application if -gl debug line number info is activated.

<delphi>function GetLineInfo(addr:ptruint;var func,source:string;var line:longint) : boolean;</delphi>

It also replace address to line info function BackTraceStrFunc by StabBackTraceStr.


FPC help:


Handling exceptions

Application.OnException

This event can be used to override default application wide exceptions handling. Custom logging mechanism could provide show custom dialog, log to file, console, sending report to mail, logging to HTTP server, e.g.

<delphi>procedure TMainForm.CustomExceptionHandler(Sender: TObject; E: Exception); const

 NewLine = #13#10;

var

 I: Integer;
 Frames: PPointer;
 Report: string;

begin

 Report := 'Program exception! ' + NewLine +
   'Stacktrace:' + NewLine + NewLine;
 if E <> nil then begin
   Report := Report + 'Exception class: ' + E.ClassName + NewLine +
   'Message: ' + E.Message + NewLine;
 end;
 Report := Report + BackTraceStrFunc(ExceptAddr);
 Frames := ExceptFrames;
 for I := 0 to ExceptFrameCount - 1 do
   Report := Report + NewLine + BackTraceStrFunc(Frames);
 ShowMessage(Report);
 Halt; // End of program execution

end;

procedure TMainForm.FormCreate(Sender: TObject); begin

 Application.OnException := @CustomExceptionHandler;

end;

procedure TMainForm.ButtonClick(Sender: TObject); begin

 raise Exception.Create('Test');

end;</delphi>

Using map file

Use compiler switch -Xm to generate map file.

Exceptions in DLL

Getting stacktrace

See also

External links

  • esprinter - tool to get stacktrace from running FreePascal program specified by process id and thread id (for Win32)