home *** CD-ROM | disk | FTP | other *** search
- Unit Debug;
-
- Interface
-
- Procedure print_call_stack (ebp, eip: dword; args: integer; skip: integer);
-
- Implementation
-
- Uses strings, errcodes;
-
- procedure runerr_call_stack_proc (code, ebp, eip: dword);
- begin
- writeln (hex (ebP), ' ', hex (eip));
- WriteLn ('RunError #', code, ' (', error_msg (code), ')');
- print_call_stack (ebp, eip, 7, 0);
- end;
-
- Procedure print_call_stack;
- procedure print_frame;
- var i: integer;
- begin
- write (hex (eip), ':');
- for i := 1 to args do begin
- if ebp = 0 then begin write (' ** unavailable **'); break; end;
- write (' ', hex (memd [ebp+4+i*4]));
- end;
- writeln;
- end;
-
- function next_frame: boolean;
- begin
- next_frame := false;
- if (ebp <> 0) and (memd [ebp] <> ebp) then begin
- eip := memd [ebp+4];
- ebp := memd [ebp];
- next_frame := true;
- end;
- end;
- Begin
- repeat
- if skip = 0 then begin
- writeln ('Calls stack:');
- writeln ('EIP Args:');
- end;
- dec (skip);
- if skip < 0 then print_frame;
- until not next_frame;
- End;
-
- Begin
- {$system}
- System.%runerr_call_stack_proc_addr := @runerr_call_stack_proc;
- End.
-