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
Thu Jan 7 21:10:46 UTC 2016
> 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.
> 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