[fpc-devel] ExceptAddrStack FRAMETYPE=1 ?

Sergei Gorelkin sergei_gorelkin at mail.ru
Thu Jun 10 17:27:53 CEST 2010


Martin wrote:
> I am still stuck on this issue.
> 
> I don't know if fpc_reraise has been entered while it should not; or if 
> the data was corrupted.

Normally you should be able to figure it out by examining the call stack/backtrace.

> What does  FRAMETYPE = 1 mean?
> 
Guess it is the value of FPC_EXCEPTION (trunk/rtl/inc/except.inc), the only currently 
available/supported value for FrameType.

> Should it expect an ExceptionObject? Should it be on top of the frame 
> list, when in fpc_reraise?
> 
> Or does it indicate that fpc_reraise was called where it should not have 
> been called?
> What could trigger it to be called?

First, as the name suggests, it's triggered by a 'raise' keyword in a try..except block.
Second, and more important, any try..finally block (including the implicit ones) contains a call to 
fpc_reraise. It is translated into:

try
    <body>
except
    <finalization statements>
    raise;  <-- implies fpc_reraise
end;

Regards,
Sergei

> 
> On 09/06/2010 18:42, Martin wrote:
>>
>>  I am one tiny step forward..
>>
>>  The SigSegV happens in fpc_ReRaise; =>  but the actual error must have
>>  been introduced further up.
>>
>>  Procedure fpc_ReRaise;[Public, Alias : 'FPC_RERAISE']; compilerproc;
>>  var
>>    _ExceptAddrStack : PExceptAddr;
>>  begin
>>  {$ifdef excdebug}
>>    writeln ('In reraise');
>>  {$endif}
>>    _ExceptAddrStack:=ExceptAddrStack;
>>    If _ExceptAddrStack=Nil then
>>      DoUnHandledException;
>>    ExceptObjectStack^.refcount := 0; //<<<<<<<<<<<<<<<<<
>>    longjmp(_ExceptAddrStack^.Buf^,FPC_Exception);
>>  end;
>>
>>
>>  This is RTL (and compiled with -O1 =>  it doesn't use regvar), so I
>>  should be able to trust variables here. (I also checked the assembler
>>  view, and memory/registers...)
>>
>>  - ExceptObjectStack is nil =>  So the line marked raises a SigSegV.
>>  - ExceptAddrStack is not nil =>  so DoUnHandledException was not called
>>
>>  The question is, any hints where to concentrate looking, in order to
>>  find out, how this can end up with a nil pointer there?
> 
> The content of ExceptAddrStack
> 
> record TEXCEPTADDR {
>   BUF = $a3ef728,
>   NEXT = $a3ef768,
>   FRAMETYPE = 1}





More information about the fpc-devel mailing list