RFR 8009302: JVM crash on infinite recursion on Appkit Thread

Gerard Ziemski gerard.ziemski at oracle.com
Tue Jun 4 11:34:25 PDT 2013


hi guys,

Here is a trivial fix (workaround) for a particular XNU (Mac OS X 
kernel) behavior causing JavaVM problems.

Explanation:

There is a case where XNU will map SIGBUS into SIGSEGV, which only 
happens on main thread (secondary threads receive the original SIGBUS) 
due to the way XNU determines stack address and its size. To complicate 
the issue, XNU will only deliver that converted SIGSEGV signal if the 
BSD signal catcher uses an alternate stack.

Since JavaVM BSD signal catcher does not use alt stack, we end up 
missing the signal and the Java process results in a native crash which 
is then presented to the user via Mac CrashReporter app.

We do not want to use an actual alternate stack, which among other 
things would result in an increased RAM usage and possibly result in a 
regression, so we use a workaround, where we declare we will use an 
alternate stack, without actually creating one.

This workaround is only for Mac (ie. we use #ifdef __APPLE__) and it 
works because we install our own guard pages, and that's where the 
faulting address occurs, so we are assured that our stack does have 
enough room to handle the signal by the existing JavaVM code, which 
removes the guard pages before handling the signal.

I have filed an issue with Apple (id: 14047928) to fix this inconsistent 
(wrt threads) behavior in XNU, and wrote native tests that check for 
this particular behavior, which will catch any future change, should 
Apple ever elect to fix it.


Testing:

- the issue's own use case
- vm.quick.testlist
- vm.signal.testlist
- nsk.stack.testlist
- JPRT
- JCK lang
- JCK vm


References:

Webrev: http://cr.openjdk.java.net/~hseigel/bug_8009302/

OpenJDK bug  http://bugs.sun.com/view_bug.do?bug_id=8009302

JBS bug: https://jbs.oracle.com/bugs/browse/JDK-8009302



More information about the hotspot-runtime-dev mailing list