111 lines
3.0 KiB
ObjectPascal
111 lines
3.0 KiB
ObjectPascal
unit StackTrackDemoMain;
|
|
|
|
interface
|
|
|
|
uses
|
|
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
|
|
StdCtrls, AppEvnts, ActnList;
|
|
|
|
type
|
|
TMainForm = class(TForm)
|
|
ExceptionLogMemo: TMemo;
|
|
Button1: TButton;
|
|
Button2: TButton;
|
|
Button3: TButton;
|
|
ListBox1: TListBox;
|
|
Button4: TButton;
|
|
ApplicationEvents: TApplicationEvents;
|
|
Label1: TLabel;
|
|
ActionList1: TActionList;
|
|
procedure Button1Click(Sender: TObject);
|
|
procedure Button2Click(Sender: TObject);
|
|
procedure Button3Click(Sender: TObject);
|
|
procedure Button4Click(Sender: TObject);
|
|
procedure ApplicationEventsException(Sender: TObject; E: Exception);
|
|
private
|
|
{ Private declarations }
|
|
public
|
|
{ Public declarations }
|
|
end;
|
|
|
|
var
|
|
MainForm: TMainForm;
|
|
|
|
implementation
|
|
|
|
{$R *.DFM}
|
|
|
|
uses
|
|
JclDebug;
|
|
|
|
{ TMainForm }
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
// Simulation of various unhandled exceptions
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
procedure TMainForm.Button1Click(Sender: TObject);
|
|
begin
|
|
PInteger(nil)^ := 0;
|
|
end;
|
|
|
|
procedure TMainForm.Button2Click(Sender: TObject);
|
|
begin
|
|
ListBox1.Items[1] := 'a';
|
|
end;
|
|
|
|
procedure AAA;
|
|
begin
|
|
PInteger(nil)^ := 0;
|
|
end;
|
|
|
|
procedure TMainForm.Button3Click(Sender: TObject);
|
|
begin
|
|
AAA;
|
|
end;
|
|
|
|
procedure TMainForm.Button4Click(Sender: TObject);
|
|
begin
|
|
ActionList1.Actions[0].Execute;
|
|
end;
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
// Simple VCL application unhandled exception handler using JclDebug
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
procedure TMainForm.ApplicationEventsException(Sender: TObject; E: Exception);
|
|
begin
|
|
// Log time stamp
|
|
ExceptionLogMemo.Lines.Add(DateTimeToStr(Now));
|
|
|
|
// Log unhandled exception stack info to ExceptionLogMemo
|
|
JclLastExceptStackListToStrings(ExceptionLogMemo.Lines, False, True, True, False);
|
|
|
|
// Insert empty line
|
|
ExceptionLogMemo.Lines.Add('');
|
|
|
|
// Display default VCL unhandled exception dialog
|
|
Application.ShowException(E);
|
|
end;
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
// JclDebug initialization and finalization for VCL application
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
initialization
|
|
|
|
// Enable raw mode (default mode uses stack frames which aren't always generated by the compiler)
|
|
Include(JclStackTrackingOptions, stRawMode);
|
|
// Disable stack tracking in dynamically loaded modules (it makes stack tracking code a bit faster)
|
|
Include(JclStackTrackingOptions, stStaticModuleList);
|
|
|
|
// Initialize Exception tracking
|
|
JclStartExceptionTracking;
|
|
|
|
finalization
|
|
|
|
// Uninitialize Exception tracking
|
|
JclStopExceptionTracking;
|
|
|
|
end.
|