Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8134434

JVM_DoPrivileged() fires assert(_exception_caught == false) failed: _exception_caught is out of phase

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: P2 P2
    • 9
    • 9
    • hotspot
    • None
    • b131
    • generic
    • generic

      Reported via e-mail:

      On 8/11/15 9:06 AM, Reingruber, Richard wrote:
      > Hi,
      >
      > I would like to report that the assertion
      >
      > assert(_exception_caught == false) failed: _exception_caught is out of phase
      >
      > at jvmtiThreadState.hpp:170 fires when running the command
      >
      > ./images/jdk/bin/java -agentlib:jdwp=transport=dt_socket,address=9000,server=y,suspend=n -Xbatch ExceptionCaughtOutOfPhaseAssertion
      >
      > (when analyzing you might want to add -XX:-TieredCompilation -XX:-Inline '-XX:CompileCommand=compileonly *::run')
      >
      > Source Code:
      >
      > import java.security.AccessController;
      > import java.security.PrivilegedAction;
      > public class ExceptionCaughtOutOfPhaseAssertion {
      > public static void main(String[] args) {
      > PrivilegedAction action = new HotThrowingAction();
      > System.out.println("### Warm-up");
      > for(int i=0; i<11000; i++) {
      > try {
      > action.run(); // call run() to get it compiled
      > } catch(Throwable t) { /* ignored */ }
      > }
      > System.out.println("### Warm-up done");
      > System.out.println("### Executing privileged action");
      > AccessController.doPrivileged(action);
      > }
      > public static class HotThrowingAction implements PrivilegedAction {
      > public Object run() {
      > throw new Error();
      > }
      > }
      > }
      > My Analysis:
      >
      > * Error is thrown in interpreted activation of run()
      > - JvmtiThreadState::_exception_detected is set to true
      > - JvmtiThreadState::_exception_caught is set to false
      > * Error is caught in main() method
      > - JvmtiThreadState::_exception_detected is set to false
      > - JvmtiThreadState::_exception_caught is set to true
      > * run() method is compiled
      > * PrivilegedAction is executed
      > * compiled activation of run() method
      > - Error object is allocated and initialized
      > - JavaThread::_should_post_on_exceptions_flag is checked and found to be false
      > -> *no* uncommon trap
      > - compiled frame is popped, rethrow stub calls OptoRuntime::rethrow_C()
      > - _exception_detected is *not* set, remains false
      > - _exception_caught is still true
      > * Java call in JVM_DoPrivileged() returns with pending exception
      > * CLEAR_PENDING_EXCEPTION triggers the assertion
      >
      > How to Fix? I'm not really an expert in this area, but here are my two cent:
      >
      > (a) Improve the assertion ...but how?! Toggling JVMTI exception notifications does not seem
      > to be synchronized with java execution.
      >
      > (b) Calling JvmtiExport::post_exception_throw() in OptoRuntime::rethrow_C() is probably not possible,
      > because of the JRT_LEAF comment for rethrow_C(), but _exception_detected = true could be set.
      >
      > (c) Remove the assertion.
      >
      > I guess (b) could be acceptable.
      >
      > What do you think?
      >
      > Best regards,
      > Richard.

            dsamersoff Dmitriy Samersoff
            dcubed Daniel Daugherty
            Votes:
            0 Vote for this issue
            Watchers:
            6 Start watching this issue

              Created:
              Updated:
              Resolved: