JDK-6989981: jstack causes "fatal error: ExceptionMark destructor expects no pending exceptions"

Yasumasa Suenaga yasu at ysfactory.dip.jp
Fri Sep 20 06:53:16 PDT 2013


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 hotspot-runtime-dev mailing list