|
@@ -78,6 +78,7 @@ Const
|
|
|
|
|
|
Procedure HandleError (Errno : Longint); forward;
|
|
|
Procedure HandleErrorFrame (Errno : longint;frame : Pointer); forward;
|
|
|
+Procedure HandleErrorAddrFrame (Errno : longint;addr,frame : Pointer); forward;
|
|
|
|
|
|
{$ifdef FPC_HAS_FEATURE_TEXTIO}
|
|
|
type
|
|
@@ -668,33 +669,43 @@ End;
|
|
|
Miscellaneous
|
|
|
*****************************************************************************}
|
|
|
|
|
|
+{$ifndef FPC_SYSTEM_HAS_GET_ADDR}
|
|
|
+ { This provides a dummy implementation
|
|
|
+ of get_addr function, for CPU's that don't need
|
|
|
+ the instruction address to walk the stack. }
|
|
|
+function get_addr : pointer;
|
|
|
+begin
|
|
|
+ get_addr:=nil;
|
|
|
+end;
|
|
|
+{$endif ndef FPC_SYSTEM_HAS_GET_ADDR}
|
|
|
+
|
|
|
procedure fpc_rangeerror;[public,alias:'FPC_RANGEERROR']; compilerproc;
|
|
|
begin
|
|
|
- HandleErrorFrame(201,get_frame);
|
|
|
+ HandleErrorAddrFrame(201,get_addr,get_frame);
|
|
|
end;
|
|
|
|
|
|
|
|
|
procedure fpc_divbyzero;[public,alias:'FPC_DIVBYZERO']; compilerproc;
|
|
|
begin
|
|
|
- HandleErrorFrame(200,get_frame);
|
|
|
+ HandleErrorAddrFrame(200,get_addr,get_frame);
|
|
|
end;
|
|
|
|
|
|
|
|
|
procedure fpc_overflow;[public,alias:'FPC_OVERFLOW']; compilerproc;
|
|
|
begin
|
|
|
- HandleErrorFrame(215,get_frame);
|
|
|
+ HandleErrorAddrFrame(215,get_addr,get_frame);
|
|
|
end;
|
|
|
|
|
|
|
|
|
procedure fpc_threaderror; [public,alias:'FPC_THREADERROR'];
|
|
|
begin
|
|
|
- HandleErrorFrame(6,get_frame);
|
|
|
+ HandleErrorAddrFrame(6,get_addr,get_frame);
|
|
|
end;
|
|
|
|
|
|
|
|
|
procedure fpc_invalidpointer; [public,alias:'FPC_INVALIDPOINTER'];
|
|
|
begin
|
|
|
- HandleErrorFrame(216,get_frame);
|
|
|
+ HandleErrorAddrFrame(216,get_addr,get_frame);
|
|
|
end;
|
|
|
|
|
|
|
|
@@ -708,7 +719,7 @@ begin
|
|
|
begin
|
|
|
l:=HInOutRes^;
|
|
|
HInOutRes^:=0;
|
|
|
- HandleErrorFrame(l,get_frame);
|
|
|
+ HandleErrorAddrFrame(l,get_addr,get_frame);
|
|
|
end;
|
|
|
end;
|
|
|
|
|
@@ -737,7 +748,7 @@ begin
|
|
|
begin
|
|
|
if assigned(SafeCallErrorProc) then
|
|
|
SafeCallErrorProc(res,get_frame);
|
|
|
- HandleErrorFrame(229,get_frame);
|
|
|
+ HandleErrorAddrFrame(229,get_addr,get_frame);
|
|
|
end;
|
|
|
result:=res;
|
|
|
end;
|
|
@@ -1024,15 +1035,15 @@ Procedure HandleError (Errno : longint);[public,alias : 'FPC_HANDLEERROR'];
|
|
|
Internal function should ALWAYS call HandleError instead of RunError.
|
|
|
}
|
|
|
begin
|
|
|
- HandleErrorFrame(Errno,get_frame);
|
|
|
+ HandleErrorAddrFrame(Errno,get_frame,get_addr);
|
|
|
end;
|
|
|
|
|
|
|
|
|
procedure RunError(w : word);[alias: 'FPC_RUNERROR'];
|
|
|
begin
|
|
|
errorcode:=w;
|
|
|
- erroraddr:=get_caller_addr(get_frame);
|
|
|
- errorbase:=get_caller_frame(get_frame);
|
|
|
+ erroraddr:=get_caller_addr(get_frame,get_addr);
|
|
|
+ errorbase:=get_caller_frame(get_frame,get_addr);
|
|
|
Halt(errorcode);
|
|
|
end;
|
|
|
|
|
@@ -1055,10 +1066,11 @@ begin
|
|
|
end;
|
|
|
|
|
|
|
|
|
-Procedure dump_stack(var f : text;bp : Pointer);
|
|
|
+Procedure dump_stack(var f : text;bp,addr : Pointer);
|
|
|
var
|
|
|
i : Longint;
|
|
|
prevbp : Pointer;
|
|
|
+ prevaddr : pointer;
|
|
|
is_dev : boolean;
|
|
|
caller_frame,
|
|
|
caller_addr : Pointer;
|
|
@@ -1067,12 +1079,13 @@ Begin
|
|
|
try
|
|
|
{$endif FPC_HAS_FEATURE_EXCEPTIONS}
|
|
|
prevbp:=bp-1;
|
|
|
+ prevaddr:=nil;
|
|
|
i:=0;
|
|
|
is_dev:=do_isdevice(textrec(f).Handle);
|
|
|
while bp > prevbp Do
|
|
|
Begin
|
|
|
- caller_addr := get_caller_addr(bp);
|
|
|
- caller_frame := get_caller_frame(bp);
|
|
|
+ caller_addr := get_caller_addr(bp,addr);
|
|
|
+ caller_frame := get_caller_frame(bp,addr);
|
|
|
if (caller_addr=nil) then
|
|
|
break;
|
|
|
Writeln(f,BackTraceStrFunc(caller_addr));
|
|
@@ -1082,7 +1095,9 @@ Begin
|
|
|
If ((i>max_frame_dump) and is_dev) or (i>256) Then
|
|
|
break;
|
|
|
prevbp:=bp;
|
|
|
+ prevaddr:=addr;
|
|
|
bp:=caller_frame;
|
|
|
+ addr:=caller_addr;
|
|
|
End;
|
|
|
{$ifdef FPC_HAS_FEATURE_EXCEPTIONS}
|
|
|
except
|
|
@@ -1268,16 +1283,17 @@ procedure fpc_AbstractErrorIntern;compilerproc;[public,alias : 'FPC_ABSTRACTERRO
|
|
|
begin
|
|
|
If pointer(AbstractErrorProc)<>nil then
|
|
|
AbstractErrorProc();
|
|
|
- HandleErrorFrame(211,get_frame);
|
|
|
+ HandleErrorAddrFrame(211,get_addr,get_frame);
|
|
|
end;
|
|
|
|
|
|
|
|
|
-Procedure fpc_assert(Const Msg,FName:Shortstring;LineNo:Longint;ErrorAddr:Pointer); [Public,Alias : 'FPC_ASSERT']; compilerproc;
|
|
|
+Procedure fpc_assert(Const Msg,FName:Shortstring;LineNo:Longint;
|
|
|
+ ErrorAddr:Pointer); [Public,Alias : 'FPC_ASSERT']; compilerproc;
|
|
|
begin
|
|
|
if pointer(AssertErrorProc)<>nil then
|
|
|
AssertErrorProc(Msg,FName,LineNo,ErrorAddr)
|
|
|
else
|
|
|
- HandleErrorFrame(227,get_frame);
|
|
|
+ HandleErrorAddrFrame(227,get_addr,get_frame);
|
|
|
end;
|
|
|
|
|
|
|