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

Reingruber, Richard richard.reingruber at sap.com
Tue Aug 11 15:06:13 UTC 2015


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.


More information about the hotspot-dev mailing list