RFR (S): 8146246: JVMCICompiler::abort_on_pending_exception: assert(!thread->owns_locks()) failed: must release all locks when leaving VM

Christian Thalinger christian.thalinger at oracle.com
Tue Jan 12 20:13:30 UTC 2016


> On Jan 7, 2016, at 11:10 AM, Christian Thalinger <christian.thalinger at oracle.com> wrote:
> 
> 
>> On Jan 7, 2016, at 9:36 AM, Coleen Phillimore <coleen.phillimore at oracle.com> wrote:
>> 
>> 
>> Hi,
>> 
>> What testing did you run with the change to java.cpp ?   Besides the calls in ci/ciReplay.cpp, this is the only call to java_lang_Throwable::print_stack_trace.  Can the ciReplay.cpp calls be converted to the Java call to printStackTrace?
> 
> Not enough.
> 
>> 
>> If you didn't run full tests on the java.cpp change to make sure it doesn't break anything, I think you should revert that part and file another RFE to remove the function and the remaining calls so it can be tested separately.
> 
> Yes, I’ll file another RFE.

FTR: https://bugs.openjdk.java.net/browse/JDK-8146933

> 
>> The JVMCI changes seem fine to me.
> 
> Thanks.
> 
>> 
>> Coleen
>> 
>> On 1/7/16 11:45 AM, Christian Thalinger wrote:
>>> [Changing lists because it should have been on hotspot-dev.]
>>> 
>>> Coleen, in case 2) below I could replace java_lang_Throwable::print_stack_trace with java_lang_Throwable::java_printStackTrace.
>>> 
>>>> On Jan 6, 2016, at 12:57 PM, Christian Thalinger <christian.thalinger at oracle.com> wrote:
>>>> 
>>>> 
>>>>> On Jan 6, 2016, at 9:34 AM, Vladimir Kozlov <vladimir.kozlov at oracle.com> wrote:
>>>>> 
>>>>> I would go with "Java code do the printing”.
>>>> Yeah, it might be better.
>>>> 
>>>>> You left ttyLocker in case 2) in src/share/vm/runtime/java.cpp
>>>> Right.  Thanks for pointing that out.
>>>> 
>>>>> Thanks,
>>>>> Vladimir
>>>>> 
>>>>> On 1/6/16 11:19 AM, Christian Thalinger wrote:
>>>>>> https://bugs.openjdk.java.net/browse/JDK-8146246
>>>>>> 
>>>>>> The problem is that https://bugs.openjdk.java.net/browse/JDK-8145435 introduced ttyLocker to synchronize the exception output but java_lang_Throwable::print_stack_trace can call out to Java to get the cause.
>>>>>> 
>>>>>> There are two solutions:
>>>>>> 
>>>>>> 1) Remove ttyLocker and deal with some possible scrambling in the rare case of an exception:
>>>>>> 
>>>>>> diff -r df8d635f2296 -r e87e187552fb src/share/vm/jvmci/jvmciCompiler.cpp
>>>>>> --- a/src/share/vm/jvmci/jvmciCompiler.cpp	Tue Dec 29 11:24:01 2015 -0800
>>>>>> +++ b/src/share/vm/jvmci/jvmciCompiler.cpp	Thu Dec 31 09:20:16 2015 -0800
>>>>>> @@ -162,10 +162,7 @@ void JVMCICompiler::compile_method(const
>>>>>>    Handle exception(THREAD, PENDING_EXCEPTION);
>>>>>>    CLEAR_PENDING_EXCEPTION;
>>>>>> 
>>>>>> -    {
>>>>>> -      ttyLocker ttyl;
>>>>>> -      java_lang_Throwable::print_stack_trace(exception, tty);
>>>>>> -    }
>>>>>> +    java_lang_Throwable::print_stack_trace(exception, tty);
>>>>>> 
>>>>>>    // Something went wrong so disable compilation at this level
>>>>>>    method->set_not_compilable(CompLevel_full_optimization);
>>>>>> @@ -181,11 +178,8 @@ void JVMCICompiler::abort_on_pending_exc
>>>>>>  Thread* THREAD = Thread::current();
>>>>>>  CLEAR_PENDING_EXCEPTION;
>>>>>> 
>>>>>> -  {
>>>>>> -    ttyLocker ttyl;
>>>>>> -    tty->print_raw_cr(message);
>>>>>> -    java_lang_Throwable::print_stack_trace(exception, tty);
>>>>>> -  }
>>>>>> +  tty->print_raw_cr(message);
>>>>>> +  java_lang_Throwable::print_stack_trace(exception, tty);
>>>>>> 
>>>>>>  // Give other aborting threads to also print their stack traces.
>>>>>>  // This can be very useful when debugging class initialization
>>>>>> diff -r df8d635f2296 -r e87e187552fb src/share/vm/runtime/java.cpp
>>>>>> --- a/src/share/vm/runtime/java.cpp	Tue Dec 29 11:24:01 2015 -0800
>>>>>> +++ b/src/share/vm/runtime/java.cpp	Thu Dec 31 09:20:16 2015 -0800
>>>>>> @@ -432,7 +432,6 @@ void before_exit(JavaThread* thread) {
>>>>>>  if (HAS_PENDING_EXCEPTION) {
>>>>>>    Handle exception(THREAD, PENDING_EXCEPTION);
>>>>>>    CLEAR_PENDING_EXCEPTION;
>>>>>> -    ttyLocker ttyl;
>>>>>>    java_lang_Throwable::print_stack_trace(exception, tty);
>>>>>>  }
>>>>>> #endif
>>>>>> 
>>>>>> or
>>>>>> 
>>>>>> 2) Call out to Java and let the Java code do the printing:
>>>>>> 
>>>>>> diff -r 0fcfe4b07f7e src/share/vm/classfile/javaClasses.cpp
>>>>>> --- a/src/share/vm/classfile/javaClasses.cpp	Tue Dec 29 18:30:51 2015 +0100
>>>>>> +++ b/src/share/vm/classfile/javaClasses.cpp	Wed Jan 06 09:12:00 2016 -1000
>>>>>> @@ -1784,6 +1784,20 @@ void java_lang_Throwable::print_stack_tr
>>>>>>  }
>>>>>> }
>>>>>> 
>>>>>> +/**
>>>>>> + * Print the throwable stack trace by calling the Java method java.lang.Throwable.printStackTrace().
>>>>>> + */
>>>>>> +void java_lang_Throwable::java_printStackTrace(Handle throwable, TRAPS) {
>>>>>> +  assert(throwable->is_a(SystemDictionary::Throwable_klass()), "Throwable instance expected");
>>>>>> +  JavaValue result(T_VOID);
>>>>>> +  JavaCalls::call_virtual(&result,
>>>>>> +                          throwable,
>>>>>> +                          KlassHandle(THREAD, SystemDictionary::Throwable_klass()),
>>>>>> +                          vmSymbols::printStackTrace_name(),
>>>>>> +                          vmSymbols::void_method_signature(),
>>>>>> +                          THREAD);
>>>>>> +}
>>>>>> +
>>>>>> void java_lang_Throwable::fill_in_stack_trace(Handle throwable, const methodHandle& method, TRAPS) {
>>>>>>  if (!StackTraceInThrowable) return;
>>>>>>  ResourceMark rm(THREAD);
>>>>>> diff -r 0fcfe4b07f7e src/share/vm/classfile/javaClasses.hpp
>>>>>> --- a/src/share/vm/classfile/javaClasses.hpp	Tue Dec 29 18:30:51 2015 +0100
>>>>>> +++ b/src/share/vm/classfile/javaClasses.hpp	Wed Jan 06 09:12:00 2016 -1000
>>>>>> @@ -554,6 +554,7 @@ class java_lang_Throwable: AllStatic {
>>>>>>  // Printing
>>>>>>  static void print(Handle throwable, outputStream* st);
>>>>>>  static void print_stack_trace(Handle throwable, outputStream* st);
>>>>>> +  static void java_printStackTrace(Handle throwable, TRAPS);
>>>>>>  // Debugging
>>>>>>  friend class JavaClasses;
>>>>>> };
>>>>>> diff -r 0fcfe4b07f7e src/share/vm/jvmci/jvmciCompiler.cpp
>>>>>> --- a/src/share/vm/jvmci/jvmciCompiler.cpp	Tue Dec 29 18:30:51 2015 +0100
>>>>>> +++ b/src/share/vm/jvmci/jvmciCompiler.cpp	Wed Jan 06 09:12:00 2016 -1000
>>>>>> @@ -162,10 +162,7 @@ void JVMCICompiler::compile_method(const
>>>>>>    Handle exception(THREAD, PENDING_EXCEPTION);
>>>>>>    CLEAR_PENDING_EXCEPTION;
>>>>>> 
>>>>>> -    {
>>>>>> -      ttyLocker ttyl;
>>>>>> -      java_lang_Throwable::print_stack_trace(exception, tty);
>>>>>> -    }
>>>>>> +    java_lang_Throwable::java_printStackTrace(exception, THREAD);
>>>>>> 
>>>>>>    // Something went wrong so disable compilation at this level
>>>>>>    method->set_not_compilable(CompLevel_full_optimization);
>>>>>> @@ -181,11 +178,7 @@ void JVMCICompiler::abort_on_pending_exc
>>>>>>  Thread* THREAD = Thread::current();
>>>>>>  CLEAR_PENDING_EXCEPTION;
>>>>>> 
>>>>>> -  {
>>>>>> -    ttyLocker ttyl;
>>>>>> -    tty->print_raw_cr(message);
>>>>>> -    java_lang_Throwable::print_stack_trace(exception, tty);
>>>>>> -  }
>>>>>> +  java_lang_Throwable::java_printStackTrace(exception, THREAD);
>>>>>> 
>>>>>>  // Give other aborting threads to also print their stack traces.
>>>>>>  // This can be very useful when debugging class initialization
>>>>>> diff -r 0fcfe4b07f7e src/share/vm/runtime/java.cpp
>>>>>> --- a/src/share/vm/runtime/java.cpp	Tue Dec 29 18:30:51 2015 +0100
>>>>>> +++ b/src/share/vm/runtime/java.cpp	Wed Jan 06 09:12:00 2016 -1000
>>>>>> @@ -433,7 +433,7 @@ void before_exit(JavaThread* thread) {
>>>>>>    Handle exception(THREAD, PENDING_EXCEPTION);
>>>>>>    CLEAR_PENDING_EXCEPTION;
>>>>>>    ttyLocker ttyl;
>>>>>> -    java_lang_Throwable::print_stack_trace(exception, tty);
>>>>>> +    java_lang_Throwable::java_printStackTrace(exception, THREAD);
>>>>>>  }
>>>>>> #endif
>>>>>> 
>> 
> 



More information about the hotspot-dev mailing list