[fpc-devel] Assert and calling frame / address
Martin
lazarus at mfriebe.de
Sun Feb 17 23:22:18 CET 2013
If the RTL is compiled with optimization then same functions may not
have a stackframe. Of course that is intended. But...
Within the list of those is at least one (probably both of the following:
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)
...
Procedure AssertErrorHandler (Const Msg,FN : ShortString;LineNo:longint;
TheAddr : pointer);
...
S:=Msg;
Raise EAssertionFailed.Createfmt(SAssertError,[S,Fn,LineNo]) at
get_caller_addr(theAddr), get_caller_frame(theAddr);
This leads to get_caller_addr/get_caller_frame getting the address and
frame of the wrong function.
Instead of the function containing the assert, they will get the caller
of that function.
This is unconvincing if debugging.
I was wondering what the options are? Not even sre if that really is due
to the missing frame
the code calling ASSERT
006F30AB 55 push %ebp // ErrorAddr:
006F30AC b969030000 mov $0x369,%ecx
006F30B1 baf8478000 mov $0x8047f8,%edx
006F30B6 b8c8498000 mov $0x8049c8,%eax
006F30BB e800acd1ff call 0x40dcc0 <fpc_assert>
ErrorAddr is the frame of the function calling assert?
Then why get_caller_addr/get_caller_frame ?
More information about the fpc-devel
mailing list