[darwin] unwind context question

Andreas Tobler toa@pop.agri.ch
Tue Jul 8 05:36:00 GMT 2003


Geoffrey Keating wrote:

>> [titanium:~/gcc-work/exception] andreast% ./print
>> Bus error
> 
> 
> That's some kind of bug, I've noticed it with GCC.  The signal that is 
> thrown really is SIGSEGV, but either (a) it gets named 'Bus error' or 
> (b) it gets passed to the handler as SIGBUS.  If you try to catch 
> SIGSEGV, you will get that error.

Hm, in my darwin-signal.h I do:

# define INIT_SEGV
   do
     {
       struct sigaction sa;
       darwin_init_mach_exceptions();
       sa.sa_flags = SA_SIGINFO;
       sa.sa_sigaction = catch_segv;
       sigemptyset (&sa.sa_mask);
       sigaction(SIGBUS, &sa, NULL);
       sigaction(SIGSEGV, &sa, NULL);

     }
  while (0)

And from the xnu sources I see:
xnu/bsd/uxkern/ux_exception.c

* ux_exception translates a mach exception, code and subcode to
* a signal and u.u_code.  Calls machine_exception (machine dependent)
* to attempt translation first.

     if (machine_exception(exception, code, subcode, ux_signal, ux_code))
         return;

     switch(exception) {

         case EXC_BAD_ACCESS:
                 if (code == KERN_INVALID_ADDRESS)
                         *ux_signal = SIGSEGV;
                 else
                         *ux_signal = SIGBUS;
                 break;

So, this is from the xnu6.6 sources and I run a 6.3 from mrs. Could be 
that there is a bug?

Well, I tried a lot to avoid the mach msg handler. But then it was the 
only success to get into the exception and handle it.


> 
> (In any case, you could always just catch SIGBUS as well.)
>    ^
  ----|
>>
>> What do you need to see?
> 
> 
> The instructions just before the ones you listed would be interesting.  
> You could check this much more easily by just writing a signal handler 
> that does return and seeing where it returns to...

Ok, I try further and I hopefully can provide you with the instructions 
later.

Thanks,

Andreas





More information about the Gcc mailing list