JDK-6989981: jstack causes "fatal error: ExceptionMark destructor expects no pending exceptions"
Staffan Larsen
staffan.larsen at oracle.com
Fri Sep 20 07:05:30 PDT 2013
I see. CHECK_AND_CLEAR_AND_PRINT? Just kidding... :-)
Maybe in this case we should not have this as a macro, but actually add the code after the two calls to call_special? Something like the code below. I personally think this is more readable than obscure macros that I have to go look up to understand what they do.
Thanks,
/Staffan
JavaCalls::call_special(&result, thread_oop,
klass,
vmSymbols::object_initializer_name(),
vmSymbols::threadgroup_string_void_signature(),
thread_group,
string,
THREAD);
if (HAS_PENDING_EXCEPTION) {
java_lang_Throwable::print(PENDING_EXCEPTION, tty);
CLEAR_PENDING_EXCEPTION;
return;
}
KlassHandle group(THREAD, SystemDictionary::ThreadGroup_klass());
JavaCalls::call_special(&result,
thread_group,
group,
vmSymbols::add_method_name(),
vmSymbols::thread_void_signature(),
thread_oop, // ARG 1
THREAD);
if (HAS_PENDING_EXCEPTION) {
java_lang_Throwable::print(PENDING_EXCEPTION, tty);
CLEAR_PENDING_EXCEPTION;
return;
}
On 20 sep 2013, at 15:53, Yasumasa Suenaga <yasu at ysfactory.dip.jp> wrote:
> Hi Staffan,
>
> Thank you for your sponsoring!
>
> "CHECK_AND_CLEAR" is already defined in exceptions.hpp:
> ******************
> #define CHECK_AND_CLEAR THREAD); if (HAS_PENDING_EXCEPTION) { CLEAR_PENDING_EXCEPTION; return; } (void)(0
> ******************
>
> I think that user wants why serviceability tools are failed.
> So I defined "CHECK_AND_CLEAR" + java_lang_Throwable::print() as "CATCH_AND_RETURN" .
>
>
> I agree rename this macro.
> Do you have any idea? I don't have a good name :-)
>
>
> Thanks,
>
> Yasumasa
>
> On 2013/09/20 20:10, Staffan Larsen wrote:
>> Yasuma,
>>
>> Thanks for finding and fixing this! I have re-opened the bug. Your patch looks good to me, but perhaps CATCH_AND_RETURN should be renamed CHECK_AND_CLEAR?
>>
>> I can sponsor the fix.
>>
>> Thanks,
>> /Staffan
>>
>> On 20 sep 2013, at 12:41, Yasumasa Suenaga<yasu at ysfactory.dip.jp> wrote:
>>
>>> Hi,
>>>
>>> I encountered this bug:
>>> JDK-6989981: jstack causes "fatal error: ExceptionMark destructor expects no pending exceptions"
>>>
>>> I read hs_err and attachListener.cpp, Java heap usage is very high and
>>> it could be OutOfMemoryError in AttachListener::init() .
>>>
>>> If JavaCalls::call_special() in AttachListener::init() fail which is
>>> caused by OOME, d'tor of EXCEPTION_MARK (~ExceptionMark) will generate
>>> internal error.
>>>
>>> So I make a patch for avoiding crash and attached in this email (6989981.patch) .
>>> I'd like to re-open this bug and contribute my patch.
>>> Could you help me?
>>>
>>>
>>> --- DETAILS ---
>>> CHECK macro is used in JavaCalls::call_special() .
>>>
>>> ******************
>>> void AttachListener::init() {
>>> EXCEPTION_MARK;
>>>
>>> :
>>>
>>> // Initialize thread_oop to put it into the system threadGroup
>>> Handle thread_group (THREAD, Universe::system_thread_group());
>>> JavaValue result(T_VOID);
>>> JavaCalls::call_special(&result, thread_oop,
>>> klass,
>>> vmSymbols::object_initializer_name(),
>>> vmSymbols::threadgroup_string_void_signature(),
>>> thread_group,
>>> string,
>>> CHECK);
>>>
>>> KlassHandle group(THREAD, SystemDictionary::ThreadGroup_klass());
>>> JavaCalls::call_special(&result,
>>> thread_group,
>>> group,
>>> vmSymbols::add_method_name(),
>>> vmSymbols::thread_void_signature(),
>>> thread_oop, // ARG 1
>>> CHECK);
>>> ******************
>>>
>>> CHECK macro does not clear pending exception of current thread.
>>> So call_special() fails with runtime exception, d'tor of ExceptionMark
>>> generates fatal error.
>>>
>>> ******************
>>> ExceptionMark::~ExceptionMark() {
>>> if (_thread->has_pending_exception()) {
>>> Handle exception(_thread, _thread->pending_exception());
>>> _thread->clear_pending_exception(); // Needed to avoid infinite recursion
>>> if (is_init_completed()) {
>>> exception->print();
>>> fatal("ExceptionMark destructor expects no pending exceptions");
>>> } else {
>>> vm_exit_during_initialization(exception);
>>> }
>>> }
>>> }
>>> ******************
>>>
>>>
>>> --- HOW TO REPRODUCE ---
>>> I also crate testcase of this issue (testcase.tar.gz) . This testcase contains
>>> two modules.
>>>
>>> - jvmti: JVMTI agent for this issue. This agent traps SIGQUIT and
>>> calls original (in HotSpot) SIGQUIT handler.
>>> This signal handler is invoked, MethodEntry event callback is
>>> enabled. MethodEntry generates OutOfMemoryError.
>>>
>>> - java : Simple long sleep program.
>>>
>>> I can run this testcase in Fedora18 x86_64. See below.
>>>
>>> -------
>>> $ javac java/LongSleep.java
>>> $ make -C jvmti
>>> make: Entering directory `/data/share/patch/ExceptionMark/testcase/jvmti'
>>> gcc -I/usr/lib/jvm/java-openjdk/include -I/usr/lib/jvm/java-openjdk/include/linux -fPIC -c oome.c
>>> gcc -shared -o liboome.so oome.o
>>> make: Leaving directory `/data/share/patch/ExceptionMark/testcase/jvmti'
>>> $ export JAVA_HOME=</path/to/jre>
>>> $ ./test.sh
>>> -------
>>>
>>>
>>>
>>> Best regards,
>>>
>>> Yasumasa
>>>
>>> <6989981.patch><testcase.tar.gz>
>>
>
More information about the serviceability-dev
mailing list