RFR (S): 8245509: Crash handler itself crashes when reporting Unsafe.putInt(0) crash

gerard ziemski gerard.ziemski at oracle.com
Mon Jun 1 16:08:41 UTC 2020


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