• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: ECX_BAD_ACCESS again
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: ECX_BAD_ACCESS again


  • Subject: Re: ECX_BAD_ACCESS again
  • From: Jonas Maebe <email@hidden>
  • Date: Sat, 5 Jan 2008 12:24:17 +0100


On 05 Jan 2008, at 12:00, Robert Bielik wrote:

Is there no way to do something similar in Mac OS X? I.e. just to handle the exception and to move on.

You can catch the signal using a Unix signal handler. From there you can either longjmp (not advised for floating point exceptions because then the kernel does not restore the fpu exception mask on ppc; although by default all fpu exceptions are masked on darwin, so unlikely to affect you), or modify the signal context's program counter and return to where ever you want (e.g. a function which in turn raises a C++ exception).


You can find the Pascal code I wrote for translating such signals into Pascal run time errors and exceptions (using the "modify the signal context" method) at

1) PPC: http://svn.freepascal.org/svn/fpc/trunk/rtl/darwin/ppcgen/ppchnd.inc
2) Intel: http://svn.freepascal.org/svn/fpc/trunk/rtl/darwin/x86/x86hnd.inc

I've kept the names of the data structures the same as in the original C headers, so it should be fairly straightforward to translate it to C ("grep -r uc_mcontext /usr/include" and go from there to see how those types are defined, but in your program you probably only have to include signal.h). The most important part for you is the stuff at the end of the handlers: there I setup the arguments for the function I'm returning to, and its address.

One warning about this: for i386 (Intel 32 bit), passing arguments is not going to work like that in C because the default calling convention there passes everything on the stack (while ours is fastcall, where the first three parameters are passed in registers). You may be able to declare your handler in gcc also as fastcall to work around this, but I don't know by heart how this is done. Or you may simply not pass any parameters at all.


Jonas _______________________________________________ Do not post admin requests to the list. They will be ignored. Darwin-dev mailing list (email@hidden) Help/Unsubscribe/Update your Subscription: This email sent to email@hidden
  • Follow-Ups:
    • Re: ECX_BAD_ACCESS again
      • From: Robert Bielik <email@hidden>
References: 
 >ECX_BAD_ACCESS again (From: Robert Bielik <email@hidden>)

  • Prev by Date: ECX_BAD_ACCESS again
  • Next by Date: Re: ECX_BAD_ACCESS again
  • Previous by thread: ECX_BAD_ACCESS again
  • Next by thread: Re: ECX_BAD_ACCESS again
  • Index(es):
    • Date
    • Thread