On 20-12-2010 18:23, Jim wrote: > (Posted to Firebird-dev list, copied to freepascal list for info) > > Hi all, > > Recently I mentioned a problem running FreePascal 64 bit code with > Firebird 2.5 embedded 64 bit on Windows (Vista). <snip> > All these cases seem to lead to access violations (or other errors) in > the Firebird code. > <snip> On Firebird-devel, Vlad Khorsun replied. FYI the thread: On 20-12-2010 21:47, Vlad Khorsun wrote: > Jim, all > > I tried Jim's executable and run it under VC8 debugger in IDE. Target was fbembed.dll > and Jim's executable was used as host application. What is wondered me is that while debugger > was able to catch Firebird's internal exceptions, it never can continue debugging at point > when exception catched in code or re-throwed. This forced me to look how exception > handling implemented in FPC. > > I'm not an expert in exception handling internals so below i could be wrong. > > The interesting code for Win64 is at > > http://svn.freepascal.org/cgi-bin/viewvc.cgi/trunk/rtl/win64/system.pp?revision=16472&view=markup > > > Note, it used Vectored Exception Handling technique : > > 871 procedure install_exception_handlers; > 872 begin > 873 AddVectoredExceptionHandler(1,@syswin64_x86_64_exception_handler); > 874 end; > > > Exception handler (syswin64_x86_64_exception_handler) code is at few lines above. > > Note comment at line 837: > > 834 if ((excep^.ExceptionRecord^.ExceptionCode and SEVERITY_ERROR) = SEVERITY_ERROR) then > 835 err := 217 > 836 else > 837 { pass through exceptions which aren't an error. The problem is that vectored handlers > 838 always are called before structured ones so we see also internal exceptions of libraries. > 839 I wonder if there is a better solution (FK) > 840 } > > So, you see - FPC application handled exception *before* Firebird library. > > As i understand code, it handles MSVC's internal exceptions, convert it into Pascal run-time error 217 > (Control-C) and exits with EXCEPTION_CONTINUE_EXECUTION. This gives no chance for Firebird library > to handle exception correctly. Also it explains messages about "Ctrl-C hit" in Jim's application output. > > I compared it with 32-bit code. Look at > > http://svn.freepascal.org/cgi-bin/viewvc.cgi/trunk/rtl/win32/system.pp?revision=16472&view=markup > > It used usual Frame-based Exception Handling technique and its handler works for unhandled exceptions > only, allowing Firebird library to catch and handle its internal exceptions : > > 786 procedure install_exception_handlers; > ... > 801 SetUnhandledExceptionFilter(@syswin32_i386_exception_handler); > > > Should i add that Firebird handle all of its internal exceptions by itself ? :) > > Hope this helps, > Vlad
Hi Vlad, Thanks a million! So it is a FreePascal problem after all. Now I also understand why using a server instead of embedded works: any exceptions in Firebird get handled server-side, so can't be "stolen" by the FreePascal code. I'll update the FreePascal bugtracker with this info. Thanks! -- Regards, jb _______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal