RFR: Verifier should dump raw memory around the problematic oops
Roman Kennke
rkennke at redhat.com
Wed May 16 18:25:50 UTC 2018
This looks very useful in some situations. Please push it!
Roman
> When Verifier fails with broken oop, it is useful to see where the memory actually points. This
> helps to catch off-by-one errors, see for example off-by-one error that points to fwdptr slot, not
> to object header:
>
> ---------- 8< -----------------------------------------------------------------------------
>
> # A fatal error has been detected by the Java Runtime Environment:
> #
> # Internal Error
> (/home/shade/trunks/shenandoah-jdk/src/hotspot/share/gc/shenandoah/shenandoahVerifier.cpp:62),
> pid=41615, tid=41622
> # Error: Before Updating References, Marked; Object klass pointer must go to metaspace
>
> Referenced from:
> no interior location recorded (probably a plain heap scan, or detached oop)
>
> Object:
> 0x00000000fb8813c0 - safe print, no details
> region: | 1905|R |BTE fb880000, fb8ffea0, fb900000|TAMS fb880000, fb880000|U
> 99%|T 0%|G 89%|S 10%|L 99%| |CP 0|SN 0, 0, 9634, 96f6
>
>
> Raw heap memory:
> 0x00000000fb881390: 00000000 00000000 00000000 00000000
> 0x00000000fb8813a0: 00000000 00000000 00000000 00000000
> 0x00000000fb8813c0: 00000000 00000000 fb8813d0 00000000
> 0x00000000fb8813d0: 00000005 00000000 20002645 00000c44
> 0x00000000fb8813e0: baadbabe baadbabe fb8813f0 00000000
> 0x00000000fb8813f0: 00000005 00000000 20002645 00000c45
> 0x00000000fb881400: baadbabe baadbabe fb881410 00000000
> 0x00000000fb881410: 00000005 00000000 20002645 00000c46
> 0x00000000fb881420: baadbabe baadbabe fb881430 00000000
> 0x00000000fb881430: 00000005 00000000 20002645 00000c47
>
> ---------- 8< -----------------------------------------------------------------------------
>
> Thanks,
> -Aleksey
>
> [0]
>
> diff -r d136c3d3b5c7 src/hotspot/share/gc/shenandoah/shenandoahAsserts.cpp
> --- a/src/hotspot/share/gc/shenandoah/shenandoahAsserts.cpp Wed May 16 08:44:23 2018 +0200
> +++ b/src/hotspot/share/gc/shenandoah/shenandoahAsserts.cpp Wed May 16 18:47:58 2018 +0200
> @@ -32,6 +32,27 @@
> #include "gc/shenandoah/shenandoahTraversalGC.hpp"
> #include "memory/resourceArea.hpp"
>
> +void print_raw_memory(ShenandoahMessageBuffer &msg, void* loc) {
> + // Be extra safe. Only access data that is guaranteed to be safe:
> + // should be in heap, in known committed region, within that region.
> +
> + ShenandoahHeap* heap = ShenandoahHeap::heap();
> + if (!heap->is_in(loc)) return;
> +
> + ShenandoahHeapRegion* r = heap->heap_region_containing(loc);
> + if (r != NULL && r->is_committed()) {
> +
> + address start = MAX2((address) r->bottom(), (address) loc - 32);
> + address end = MIN2((address) r->end(), (address) loc + 128);
> + if (start >= end) return;
> +
> + stringStream ss;
> + os::print_hex_dump(&ss, start, end, 4);
> + msg.append("\n");
> + msg.append("Raw heap memory:\n%s", ss.as_string());
> + }
> +}
> +
> void ShenandoahAsserts::print_obj(ShenandoahMessageBuffer& msg, oop obj) {
> ShenandoahHeap* heap = ShenandoahHeap::heap();
> ShenandoahHeapRegion *r = heap->heap_region_containing(obj);
> @@ -80,6 +101,7 @@
> stringStream ss;
> r->print_on(&ss);
> msg.append(" region: %s", ss.as_string());
> + print_raw_memory(msg, loc);
> }
> }
> }
>
More information about the shenandoah-dev
mailing list