RFR (S): 8245509: Crash handler itself crashes when reporting Unsafe.putInt(0) crash
coleen.phillimore at oracle.com
coleen.phillimore at oracle.com
Mon Jun 1 18:33:39 UTC 2020
In rev2, in the second part, can you move the ResourceMark just out of
the loop? Otherwise, looks good and I don't need to see another webrev.
Thanks!
Coleen
On 6/1/20 12:08 PM, gerard ziemski wrote:
> Thank you Coleen, David for your feedback!
>
>
> On 6/1/20 9:06 AM, coleen.phillimore at oracle.com wrote:
>>
>>
>> On 6/1/20 9:21 AM, David Holmes wrote:
>>> Hi Coleen,
>>>
>>> On 1/06/2020 11:00 pm, coleen.phillimore at oracle.com wrote:
>>>> On 6/1/20 2:44 AM, David Holmes wrote:
>>>>>
>>>>>
>>>>> On 30/05/2020 1:55 am, gerard ziemski wrote:
>>>>>> hi Coleen, David,
>>>>>>
>>>>>> Thank you for the reviews.
>>>>>>
>>>>>>
>>>>>> On 5/28/20 6:59 PM, David Holmes wrote:
>>>>>>> Hi Gerard,
>>>>>>>
>>>>>>> On 29/05/2020 3:36 am, gerard ziemski wrote:
>>>>>>>> hi all,
>>>>>>>>
>>>>>>>> Please review this small and simple fix that adds ResourceMark
>>>>>>>> to crash handler when printing register info, without which can
>>>>>>>> trigger fatal error if the contents of a register happens to be
>>>>>>>> an oop, which uses as_C_string(), that in turn
>>>>>>>> calls ResourceArea::allocate_bytes(), which requires a
>>>>>>>> ResourceMark.
>>>>>>>>
>>>>>>>> If thread is not available, we do not attempt to print anything
>>>>>>>> at this step (i.e. print_register_info()), but the very next
>>>>>>>> step (i.e. print_context()) will always print the registers as
>>>>>>>> HEX values.
>>>>>>>>
>>>>>>>> bug link at https://bugs.openjdk.java.net/browse/JDK-8245509
>>>>>>>> webrev at http://cr.openjdk.java.net/~gziemski/8245509_rev1
>>>>>>>> passes Mach5 hs_tier1,2,3,4,5
>>>>>>>
>>>>>>> This fixes the current problem and can be pushed.
>>>>>>>
>>>>>>> But as Coleen notes in the bug report there are other callers of
>>>>>>> os::print_location that might also need a ResourceMark, and
>>>>>>> based on your stack trace it seems it is
>>>>>>> Universe::heap()->print_location that is the true source of the
>>>>>>> problem and where the ResourceMark perhaps should be? So I think
>>>>>>> we need a follow up bug to fix the broader problem.
>>>>>>
>>>>>> Thank you David for pointing this out, I misread Coleen's comment
>>>>>> - I thought the "(and one with one)" referred to the "thread"
>>>>>> argument of ResourceMark, not ResourceMark itself.
>>>>>>
>>>>>> So I think BlockLocationPrinter::print_location() would be the
>>>>>> actual place that needs the ResourceMark (without the thread
>>>>>> argument), is that correct?
>>>>>
>>>>> For G1 that is what I believe Universe::heap()->print_location
>>>>> will end up calling:
>>>>>
>>>>> bool G1CollectedHeap::print_location(outputStream* st, void* addr)
>>>>> const {
>>>>> return BlockLocationPrinter<G1CollectedHeap>::print_location(st,
>>>>> addr);
>>>>> }
>>>>>
>>>>> but it in turn is calling:
>>>>>
>>>>> o->print_on(st);
>>>>>
>>>>> where o is an Oop, and eventually the problem surfaces in
>>>>> Klass::oop_print_on. So that seems to be where the ResourceMark
>>>>> should be unless we have designated it something where the caller
>>>>> is expected to have the RM ... which it is, and the caller in this
>>>>> case is InstanceKlass::oop_print_on which neither has a
>>>>> ResourceMark nor states that a RM is needed in the caller. So
>>>>> arguably that is where the RM should be placed.
>>>>
>>>> This is not the place to put it because this is only one place that
>>>> all the GCs eventually dispatches to for the
>>>> Universe::heap()->print_location() call.
>>>>>
>>>>> I'd vote for putting the ResourceMark as far down the call chain
>>>>> as possible, but Coleen deals with this code more often than I and
>>>>> there may be a reason to move it higher to e.g.
>>>>> BlockLocationPrinter::print_location as you suggested.
>>>>
>>>> Putting the ResourceMarks down as far as they can go can mess up
>>>> logging. There's an issue to examine this.
>>>> https://bugs.openjdk.java.net/browse/JDK-8244999
>>>
>>> Okay ...
>>>
>>>> In general, any function that takes an outputStream should have the
>>>> ResourceMark in its caller.
>>>
>>> ... so for this is a chain of calls that take an outputStream, you
>>> are saying the RM should be at the very start of the chain. But in
>>> doing that we have to know that "st" is not resource-based and won't
>>> be affected by this ResourceMark - else we hit JDK-8244999.
>>
>> ?
>>>
>>>> Looking again, I like where Gerard has the ResourceMark. The only
>>>> callers that don't have ResourceMark are for calls that you make
>>>> within the debugger (in debug.cpp). I haven't run into that
>>>> problem. If we do run into that, we can add them later.
>>>
>>> You mean the other callers of os::print_location()?
>>
>> Yeah.
>>>
>>>> Gerard, can you do the same treatment (check for _thread non-null,
>>>> and add ResourceMark) to this step too, which calls print_location?
>>>>
>>>> STEP("inspecting top of stack")
>>>
>>> as in:
>>>
>>> for (int i = 0; i < slots; ++i) {
>>> st->print("stack at sp + %d slots: ", i);
>>> if (_thread) {
>>> ResourceMark rm(_thread);
>>> os::print_location(st, *(start + i));
>>> } else {
>>> os::print_location(st, *(start + i));
>>> }
>>> }
>>>
>>
>> I was thinking not having ResourceMark in a loop, like this:
>>
>> diff --git a/src/hotspot/share/utilities/vmError.cpp
>> b/src/hotspot/share/utilities/vmError.cpp
>> --- a/src/hotspot/share/utilities/vmError.cpp
>> +++ b/src/hotspot/share/utilities/vmError.cpp
>> @@ -792,12 +792,13 @@
>> STEP("inspecting top of stack")
>>
>> // decode stack contents if possible
>> - if (_verbose && _context && Universe::is_fully_initialized()) {
>> + if (_verbose && _context && _thread &&
>> Universe::is_fully_initialized()) {
>> frame fr = os::fetch_frame_from_context(_context);
>> const int slots = 8;
>> const intptr_t *start = fr.sp();
>> const intptr_t *end = start + slots;
>> if (is_aligned(start, sizeof(intptr_t)) &&
>> os::is_readable_range(start, end)) {
>> + ResourceMark rm(_thread);
>> st->print_cr("Stack slot to memory mapping:");
>> for (int i = 0; i < slots; ++i) {
>> st->print("stack at sp + %d slots: ", i);
>>
>>
>> The check for _thread seems silly because why would we have _context
>> without _thread, but this seems useful for safety and doesn't really
>> hurt anything.
>
> I prepared new webrev based on the feedback. How does that look?
>
> bug link at https://bugs.openjdk.java.net/browse/JDK-8245509
> webrev at http://cr.openjdk.java.net/~gziemski/8245509_rev2
> Mach5 hs_tier1,2,3,4,5 in progress....
>
>
> cheers
>
More information about the hotspot-runtime-dev
mailing list