On 1 okt 2013, at 15:15, David Holmes <david.hol...@oracle.com> wrote:

> On 23/09/2013 2:41 AM, Staffan Larsen wrote:
>> Dmitry: Thanks for the review.
>> 
>> Yasumasa: Thanks for your contribution! I have pushed the changes into HS25 
>> and will push them to 7u60 as well.
> 
> I've been on vacation so could not respond in time. I am concerned about this 
> fix. Other than printing a message on the console it pretends that the init 
> has succeeded! That seems wrong to me. What are the consequences of doing 
> this?

The change is an improvement to the previous error message, but looking at the 
code again there is similar code in the block below. That code  calls  
vm_exit_during_initialization() if the init failed. The only problem with that 
is that AttachListener::init() can be called not just during initialization, so 
it seems a bit drastic to kill the JVM if the init fails. 

In the case where AttachListener::init() is called during initialization it 
makes sense to kill the VM if AttachListener::init() fails, in other cases an 
error message would be better. We now have an ugly combination... 

If AttachListener::init() fails during runtime, I think it has no other 
consequences than attach operations not working.

/Staffan

> 
> David
> -----
> 
>> /Staffan
>> 
>> On 22 sep 2013, at 01:51, Dmitry Samersoff <dmitry.samers...@oracle.com> 
>> wrote:
>> 
>>> Yasumasa,
>>> 
>>> Looks good for me.
>>> 
>>> -Dmitry
>>> 
>>> On 2013-09-21 14:43, Yasumasa Suenaga wrote:
>>>> Hi Staffan,
>>>> 
>>>>> Can you update your patch, please?
>>>> 
>>>> Of course!
>>>> I've attached new patch in this email.
>>>> 
>>>> Could you check this?
>>>> 
>>>> 
>>>> Thanks,
>>>> 
>>>> Yasumasa
>>>> 
>>>> On 2013/09/21 15:36, Staffan Larsen wrote:
>>>>> 
>>>>> 
>>>>>> On 20 sep 2013, at 16:49, Yasumasa Suenaga<y...@ysfactory.dip.jp>
>>>>>> wrote:
>>>>>> 
>>>>>>> On 2013/09/20 23:34, Staffan Larsen wrote:
>>>>>>> 
>>>>>>>> On 20 sep 2013, at 16:24, Yasumasa Suenaga<y...@ysfactory.dip.jp>
>>>>>>>> wrote:
>>>>>>>> 
>>>>>>>> I thought your code too. However...
>>>>>>>> 
>>>>>>>> - These code is different from other code (rule?).
>>>>>>> 
>>>>>>> Well, you are introducing a new macro that is also different from
>>>>>>> other code, so I'm not sure how valid that argument is.
>>>>>> 
>>>>>> My macro is modified from "CATCH" in exceptions.hpp:
>>>>>> 
>>>>>> #define CATCH                              \
>>>>>> THREAD); if (HAS_PENDING_EXCEPTION) {    \
>>>>>> oop ex = PENDING_EXCEPTION;            \
>>>>>> CLEAR_PENDING_EXCEPTION;               \
>>>>>> ex->print();                           \
>>>>>> ShouldNotReachHere();                  \
>>>>>> } (void)(0
>>>>>> 
>>>>>> So I think that my macro is not big difference fromother code.
>>>>>> 
>>>>>> 
>>>>>>>> - Similar crash cases exist. e.g. 6425580 and 7142442.
>>>>>>>> These crashes are different from 6989981. However, I guess that
>>>>>>>> crashed
>>>>>>>> thread had pending exception and we need to fix with similar patch.
>>>>>>>> 
>>>>>>>> So I think that new macro is useful later.
>>>>>>> 
>>>>>>> Yes, similar problems may come up in other cases as well.
>>>>>>> 
>>>>>>> Generally, I don't think it's a good idea to have logging calls
>>>>>>> hidden away in general macros. What we really should do here is
>>>>>>> print some context around the stack trace as well. Something like:
>>>>>>> 
>>>>>>>  Initializing the attach listener failed with the following
>>>>>>> exception in AttachListener::init when initializing the thread_oop:
>>>>>>> 
>>>>>>> This would be possible with the code I suggested, but very hard in a
>>>>>>> general macro.
>>>>>> 
>>>>>> Agree.
>>>>>> Should we write code as following?
>>>>>> 
>>>>>> if (HAS_PENDING_EXCEPTION) {
>>>>>>  tty->print_cr("Exception in VM (AttachListener::init) : ");
>>>>>>  java_lang_Throwable::print(PENDING_EXCEPTION, tty);
>>>>>>  CLEAR_PENDING_EXCEPTION;
>>>>>>  return;
>>>>>> }
>>>>>> 
>>>>>> I like this way :-)
>>>>> 
>>>>> Yes, this is what I'd like to see! Can you update your patch, please?
>>>>> 
>>>>> Thanks,
>>>>> /Staffan
>>>>> 
>>>>> 
>>>>>> 
>>>>>> 
>>>>>> Thanks,
>>>>>> 
>>>>>> Yasumasa
>>>>>> 
>>>>>> 
>>>>>>> Thanks,
>>>>>>> /Staffan
>>>>>>> 
>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> Thanks,
>>>>>>>> 
>>>>>>>> Yasumasa
>>>>>>>> 
>>>>>>>>> On 2013/09/20 23:05, Staffan Larsen wrote:
>>>>>>>>> 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<y...@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<y...@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>
>>>>>> 
>>>>> 
>>>> 
>>> 
>>> 
>>> --
>>> Dmitry Samersoff
>>> Oracle Java development team, Saint Petersburg, Russia
>>> * I would love to change the world, but they won't give me the source code.
>> 

Reply via email to