RFR(xs): [windows] small fixes to os::check_heap()

Mikael Gerdin mikael.gerdin at oracle.com
Thu Nov 19 10:39:28 UTC 2015


On 2015-11-19 11:04, Thomas Stüfe wrote:
> On Thu, Nov 19, 2015 at 10:04 AM, David Holmes <david.holmes at oracle.com>
> wrote:
>
>> On 19/11/2015 6:25 PM, Thomas Stüfe wrote:
>>
>>> Hi David,
>>>
>>> On Thu, Nov 19, 2015 at 8:49 AM, David Holmes <david.holmes at oracle.com
>>> <mailto:david.holmes at oracle.com>> wrote:
>>>
>>>      Hi Thomas,
>>>
>>>      On 19/11/2015 4:52 PM, Thomas Stüfe wrote:
>>>
>>>          Hi David,
>>>
>>>          On Thu, Nov 19, 2015 at 4:56 AM, David Holmes
>>>          <david.holmes at oracle.com <mailto:david.holmes at oracle.com>
>>>          <mailto:david.holmes at oracle.com
>>>
>>>          <mailto:david.holmes at oracle.com>>> wrote:
>>>
>>>               Hi Thomas,
>>>
>>>               On 19/11/2015 2:40 AM, Thomas Stüfe wrote:
>>>
>>>                   Hi all,
>>>
>>>                   could you please sponsor and review these tiny changes to
>>>                   os::check_heap()
>>>                   on windows:
>>>
>>>                   webrev:
>>>
>>> http://cr.openjdk.java.net/~stuefe/webrevs/8143233/webrev.00/webrev/
>>>                   bug:
>>>          https://bugs.openjdk.java.net/browse/JDK-8143233?filter=22798
>>>
>>>                   Fixes two issues:
>>>                   - GetProcessHeap() is not necessarily the CRT heap, so
>>>          we need
>>>                   to use
>>>                   _get_heap_handle(); instead
>>>
>>>
>>>               I'm unclear why we want the CRT heap as opposed to the
>>>          process heap?
>>>
>>>
>>>          os::check_heap is used in a context that lets me assume that the
>>> CRT
>>>          heap is meant (e.g. in os::malloc, os::realloc, triggered by
>>>          MallocVerifyInterval
>>>          <
>>> http://ld8443:8080/source/s?defs=MallocVerifyInterval&project=integ-hotspot
>>>> ).
>>>          Also, we do not explicitly use the Process Default Heap, so
>>>          there is no
>>>          use in checking it.
>>>
>>>               But in any case according to this as of VS2012 the CRT heap
>>> and
>>>               process default heap are the same:
>>>
>>>
>>> http://stackoverflow.com/questions/18955871/why-does-get-heap-handle-equal-to-getprocessheap
>>>
>>>
>>>          True, but
>>>          1) we still support VS 2010
>>>          (
>>> https://wiki.openjdk.java.net/display/Build/Supported+Build+Platforms)
>>>
>>>
>>>      Wasn't aware of that :)
>>>
>>>          2) arguably, use of _get_heap_handle() better documents the
>>>          intent here
>>>          3) Microsoft may decide at some point to switch back to a
>>>          separate heap
>>>          for the CRT instead of using the process default heap.
>>>
>>>
>>>      Okay. Only issue I have is actually testing the change. I don't see
>>>      that we currently have any jtreg tests that exercise this heap
>>>      checking :( Did I miss something?
>>>
>>>
>>> I did not find anything. This is also difficult to test, because heap
>>> overwriters are difficult to trigger in a way that they destroy the CRT
>>> heap structures just enough to trigger an error in WalkHeap.
>>>
>>> But we added this fix a while ago to our code base and I remember that I
>>> did test it then. I am quite convinced that it actually worked because
>>> after I swapped GetProcessHeap with _get_heap_handle(), I got real
>>> errors, hit the fatal(), and only then detected that I better add the
>>> HeapUnlock() to prevent deadlocks when VMError::report_and_die() does
>>> malloc().
>>>
>>> But if you insist, I could invest a bit of time to at least manually
>>> test the change.
>>>
>>
>> I don't need a test that actually corrupts the heap and verifies that this
>> detects it. I just want something that will actually run the code being
>> changed. I'll see if we have anything internally.
>>
>>
> -XX:+VerifyBeforeExit causes the VmThread to execute os::check_heap on
> shutdown. I tried to test it and to step thru with VS2010, but have some
> problems debugging the libjvm. I will take a closer look later.
>
> Maybe a Whitebox Test would be the right thing to do, or would that be
> overdone?

There is support for creating jtreg tests which use jni, perhaps you 
could just create a jni function which allocates something in the CRT 
heap and corrupts the heap somehow?

/Mikael

>
> Kind Regards, Thomas
>
>
>> Thanks,
>> David
>>
>>
>> Kind regards, Thomas
>>>
>>>      Thanks,
>>>      David
>>>
>>>
>>>
>>>          Regards, Thomas
>>>
>>>                   - We need to always unlock the heap before exiting with
>>>          fatal()
>>>                   in case we
>>>                   found an error.
>>>
>>>
>>>               Ok.
>>>
>>>               Thanks,
>>>               David
>>>
>>>                   Kind Regards, Thomas
>>>
>>>
>>>
>>>



More information about the hotspot-runtime-dev mailing list