Difference between revisions of "Logging exceptions"

From Lazarus wiki
Jump to navigationJump to search
Line 2: Line 2:
  
 
'''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.
 
'''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
 +
  
  
Line 11: Line 18:
 
function ExceptFrameCount: Longint;
 
function ExceptFrameCount: Longint;
 
function ExceptFrames: PPointer;</delphi>
 
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>
 +
 +
FPC help:
 +
* [http://www.freepascal.org/docs-html/rtl/system/dumpexceptionbacktrace.html DumpExceptionBackTrace]
 +
* [http://www.freepascal.org/docs-html/rtl/system/dump_stack.html dump_stack]
  
  
Line 50: Line 66:
  
 
==Using map file==
 
==Using map file==
 +
 +
Use compiler switch -Xm to generate map file.
  
 
==Exceptions in DLL==
 
==Exceptions in DLL==
  
 
=Getting stacktrace=
 
=Getting stacktrace=
 
 
=Compiler parameters=
 
 
*-gl - generate line numbers for debug informations
 
  
  
Line 65: Line 78:
 
* [[Profiling]]
 
* [[Profiling]]
 
* [[Creating a Backtrace with GDB]]
 
* [[Creating a Backtrace with GDB]]
 +
 +
=External links=
 +
 +
* [http://www.ciuly.com/tools/programming/esprinter/index.html esprinter] - tool to get stacktrace from running FreePascal program specified by process id and thread id (for Win32)
  
  
 
[[Category:Debugging]]
 
[[Category:Debugging]]

Revision as of 21:02, 2 September 2010

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>

FPC help:


Handling exceptions

Application.OnException

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