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

Richard Reingruber richard.reingruber at sap.com
Wed Aug 12 08:36:54 UTC 2015


    > Adding serviceability-dev at ... since this JVM/TI...
Thanks Dan.

Sorry, forgot to add a stack trace. This is from amd64:

    Stack: [0x00007fe6cdacc000,0x00007fe6cdbcd000],  sp=0x00007fe6cdbc9d30,  free space=1015k
    Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
    V  [libjvm.so+0xfce6f1]  VMError::report(outputStream*)+0x12fd
    V  [libjvm.so+0xfcfbed]  VMError::report_and_die()+0x3fd
    V  [libjvm.so+0x86b82d]  report_vm_error(char const*, int, char const*, char const*)+0xb4
    V  [libjvm.so+0xbe44ba]  JvmtiThreadState::clear_exception_detected()+0x4e
    V  [libjvm.so+0xbe3046]  JvmtiExport::clear_detected_exception(JavaThread*)+0x72
    V  [libjvm.so+0xb50627]  JVM_DoPrivileged+0x7e4
    C  [libjava.so+0xd04e]  Java_java_security_AccessController_doPrivileged__Ljava_security_PrivilegedAction_2+0x42
    j  java.security.AccessController.doPrivileged(Ljava/security/PrivilegedAction;)Ljava/lang/Object;+0
    j  ExceptionCaughtOutOfPhaseAssertion.main([Ljava/lang/String;)V+59
    v  ~StubRoutines::call_stub
    [...]

I can reproduce this on amd64, sparcv9 and ppc64 with dbg builds of the current openjdk9.

Richard.


On 08/11/2015 08:38 PM, Daniel D. Daugherty wrote:
> Adding serviceability-dev at ... since this JVM/TI...
>
> Dan
>
>
> 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.
>


More information about the serviceability-dev mailing list