[fpc-pascal] How do FreePascal implement hardware exceptions handling?
Sven Barth
pascaldragon at googlemail.com
Sun Dec 16 13:16:36 CET 2012
On 15.12.2012 18:40, Andrzej Borucki wrote:
> I analyze FreePascal exceptions handling. Instead use of
> try-excpt-finally statement I rather use fpc_LongJmp,fpc_PushExceptAddr
> etc. It works fine for software exceptions (fpc_RaiseException) but not
> handle hardware exceptions.
FPC relies on the hardware exception support provided by the operating
system. For Windows this is accomplished by using
SetUnhandledExceptionFilter (or using SEH on Windows 64 if the compiler
is compiled with the correct define) while on Unix this means that
signals like SIGSEGV or SIGFPE are hooked.
It is not recommended to use "fpc_LongJmp", "fpc_PushExceptAddr" etc.
manually as FPC's code generation could interfere with your intentions
here (note: the correct way of using longjmp would be by using the
function LongJmp instead of fpc_LongJmp (and likewise SetJmp instead of
fpc_SetJmp).
So: why are you doing this?
> I use install_exception_handlers at start
> program. This call
> SetUnhandledExceptionFilter(@syswin32_i386_exception_handler) but is
> problem:
> in syswin32_i386_exception_handler is comparing "if
> excep^.ContextRecord^.SegSs = _SS then" - _SS is correct stack segment
> but excep^.ContextRecord^.SegSs - no, it is a different value, why?
> I can attach my files
Why are you doing this? install_exception_handlers is called during
process entry of Win32/Win64 programs already, so calling this twice can
be considered a bad(TM) idea.
Regards,
Sven
More information about the fpc-pascal
mailing list