> Adding serviceability-dev@... 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@... 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.
