PING: RFR: JDK-8145788: JVM crashes with -XX:+EnableTracing
David Holmes
david.holmes at oracle.com
Mon Jan 11 01:38:39 UTC 2016
Hi Markus,
Thanks very much for stepping in on this one. I like your solution to
this particular problem.
Aside: I noticed in writeEvent there is also UseLockedTracing and I'm
wondering if that will also lead to an assertion failure due to no
current thread?
Thanks,
David
On 11/01/2016 9:25 AM, Markus Gronlund wrote:
> Hi Yasumasa,
>
> Apologies for the delay in getting a response to you.
>
> Thanks for reporting and attempting to fix this issue.
>
> I have investigated this a bit as well as trying out your suggested patch.
>
> I must admit it is hard to get this right at this early stage of the VM, and though I appreciated your effort for resolution, the patch suggestion will not work out of the box unfortunately.
>
> I have summarized some of my findings and reasoning here:
>
> http://cr.openjdk.java.net/~mgronlun/8145788/notes.txt
>
> As you can see, Thread::current() cannot be called at this stage. If we update to instead call Thread::current_or_null(), you will now run into problems in the interplay between an explicit delete of a Cheap allocated ResourceArea and the subsequent ResourceMark destructor. Here, the rm destructor asserts since it expects _nesting_level > 0, but that data has already been invalidated.
>
> You could accomplish all of this by doing:
>
> + bool thread_has_resource = Thread::current_or_null() != NULL;
> + ResourceArea *area = thread_has_resource
> + ? Thread::current()->resource_area()
> + : new (mtTracing)ResourceArea(Chunk::non_pool_size);
> + {
> + ResourceMark rm(area);
> + if (UseLockedTracing) {
> + ttyLocker lock;
> + writeEventContent();
> + } else {
> + writeEventContent();
> + }
> + }
> +
> + if (!thread_has_resource) {
> + delete area;
> }
>
>
> However, it is getting a bit complex. In addition, now every trace statement needs to check Thread::current_or_null()..
>
> If you look at my reasoning in the second part, I think we can fix this in an easier way.
>
> You can find my suggestion as a webrev here:
>
> http://cr.openjdk.java.net/~mgronlun/8145788/
>
> Please try the patch out to see if you are ok with it.
>
> Thanks for your patience
>
> Best regards
> Markus
>
>
>
> -----Original Message-----
> From: Yasumasa Suenaga [mailto:yasuenag at gmail.com]
> Sent: den 10 januari 2016 14:03
> To: serviceability-dev at openjdk.java.net
> Subject: PING: RFR: JDK-8145788: JVM crashes with -XX:+EnableTracing
>
> Ping: What do you think about this issue?
>
> On 2016/01/06 15:36, David Holmes wrote:
>> Pinging the serviceability tracing experts please!
>>
>> David
>>
>> On 24/12/2015 12:25 AM, Yasumasa Suenaga wrote:
>>> Hi David,
>>>
>>>>> 1. Initialize JavaThread before calling apply_ergo() in create_vm().
>>>>
>>>> That is not likely to be an option - it would likely be far too
>>>> disruptive to the initialization sequence.
>>>
>>> Agree. Thus I choose 2.
>>>
>>>> We will have to wait for the tracing experts to have a good look at
>>>> this.
>>>
>>> I'm waiting that the tracing experts join this discussion.
>>>
>>>
>>> Thanks,
>>>
>>> Yasumasa
>>>
>>>
>>> On 2015/12/23 13:20, David Holmes wrote:
>>>> Hi Yasumasa,
>>>>
>>>> On 23/12/2015 11:49 AM, Yasumasa Suenaga wrote:
>>>>> Hi David,
>>>>>
>>>>> I've added callstack when JVM crashed:
>>>>>
>>>>> https://bugs.openjdk.java.net/browse/JDK-8145788?focusedCommentId=1
>>>>> 3880225&page=com.atlassian.jira.plugin.system.issuetabpanels:commen
>>>>> t-tabpanel#comment-13880225
>>>>
>>>> Thanks for that.
>>>>
>>>>> This crash occurrs in Arguments::apply_ergo() in Threads::create_vm().
>>>>> apply_ergo() calls before JavaThread initialization.
>>>>>
>>>>> I think that TraceEvent can avoid crash with two approach:
>>>>>
>>>>> 1. Initialize JavaThread before calling apply_ergo() in create_vm().
>>>>
>>>> That is not likely to be an option - it would likely be far too
>>>> disruptive to the initialization sequence.
>>>>
>>>>> 2. Avoid crash at TraceEvent when it is called before JavaThread initialization.
>>>>
>>>> Or don't call it at all.
>>>>
>>>> We will have to wait for the tracing experts to have a good look at
>>>> this. We end up in code that is not expecting to be run before more
>>>> of the VM is initialized, so we have to look at what else may be
>>>> being assumed and then decide whether to handle the situation or avoid it.
>>>>
>>>> Thanks,
>>>> David
>>>>
>>>>>
>>>>> Thanks,
>>>>>
>>>>> Yasumasa
>>>>>
>>>>>
>>>>> On 2015/12/22 21:19, David Holmes wrote:
>>>>>> On 19/12/2015 1:50 AM, Yasumasa Suenaga wrote:
>>>>>>> Hi all,
>>>>>>>
>>>>>>> I encountered JVM crash when I passed -XX:+EnableTracing.
>>>>>>>
>>>>>>> I checked core image, it crashed in EventBooleanFlagChanged::writeEvent()
>>>>>>> which is called by Arguments::apply_ergo() because thread had not been
>>>>>>> initialized. (JVM seems to log changing GC algorithm to
>>>>>>> G1.)
>>>>>>
>>>>>> This seems like a logic error to me - something is trying to
>>>>>> happen too early during VM initialization. We need to look at
>>>>>> exactly what we are trying to do here, not just work around the crash.
>>>>>>
>>>>>> David
>>>>>> -----
>>>>>>
>>>>>>> writeEvent() uses ResourceMark. Default constructor of ResourceMark uses
>>>>>>> ResourceArea in current thread. So ResourceMark in writeEvent() should
>>>>>>> pass valid ResourceArea.
>>>>>>>
>>>>>>> I think this issue is in traceEventClasses.xsl .
>>>>>>> However, my environment (GCC 5.3.1 on Fedora23) cannot build it
>>>>>>> because -Werror=maybe-uninitialized was occurred.
>>>>>>> So I also fixed them together.
>>>>>>>
>>>>>>> I've uploaded webrev. Could you review it?
>>>>>>>
>>>>>>> http://cr.openjdk.java.net/~ysuenaga/JDK-8145788/webrev.00/
>>>>>>>
>>>>>>> I'm jdk9 committer, however I cannot access JPRT.
>>>>>>> So I need a sponsor.
>>>>>>>
>>>>>>>
>>>>>>> Thanks,
>>>>>>>
>>>>>>> Yasumasa
>>>>>>>
More information about the serviceability-dev
mailing list