[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