[fpc-devel] unwinding stack from within ExceptProc?

Lukas Zeller luz_info at synthesis.ch
Sat Sep 26 21:40:23 CEST 2009


Thanks, Jonas for the quick response (again)!

On Sep 26, 2009, at 15:31 , Jonas Maebe wrote:

> On 25 Sep 2009, at 18:09, Lukas Zeller wrote:
>
>> The longjmp itself works, but after this has happened once, further  
>> exceptions crash the program. I wonder if there is some (FPC)  
>> cleanup routine I could or should call before the longjmp that  
>> would make the scenario work, or if there is technical evidence  
>> that it can't work at all.
>
> There is no "technical evidence" that it can't work at all, but you  
> would have to call internal RTL routines [...]

I hope I read that correctly as: "just longjump can't work and leaves  
a mess behind that might explain crashes on subsequent exceptions"

> [...] which are not for public use, so
> a) this is not documented or supported in any way (I can't tell you  
> the names by heart either)
> b) if you manage to figure it out, then your code can break with any  
> future FPC version

Yes - if it was "my code", I'd try to avoid the situation. It  
unfortunately isn't, the calling environment only provides that  
routine which longjmps to handle a exception situation. So making it  
work with the current FPC version and risking it'll break in a future  
version would be better than nothing.

Maybe there's a better solution, but what are the official options I  
have in ExceptProc other than halt? If I just return from it, how does  
the call flow continue? At that time the stack must be already  
unwound, but how far? While I understand ExceptProc is called when a  
exception falls through all the way down to a pascal main program, I  
can't really imagine at what point the same happens in a pascal shared  
lib.

Thanks for any explanations!

Lukas




More information about the fpc-devel mailing list