RFR: 8375534: Debug method 'pp' should support compressed oops
Vladimir Ivanov
vlivanov at openjdk.org
Fri Jan 16 19:52:41 UTC 2026
On Fri, 16 Jan 2026 13:34:59 GMT, Tobias Hartmann <thartmann at openjdk.org> wrote:
> The debug method `pp` is currently not able to handle compressed oops. This should fix it. The code is similar to `BlockLocationPrinter<CollectedHeapT>::print_location`.
>
> **Before:**
>
>
> (rr) call (void*) pp(0x6b9c08fc8)
>
> "Executing pp"
> java.lang.Runtime$Version
> {0x00000006b9c08fc8} - klass: 'java/lang/Runtime$Version' - flags:
>
> - ---- fields (total size 4 words):
> - private final value 'version' 'Ljava/util/List;' @12 a 'java/util/ImmutableCollections$List12'{0x00000006b9c2cbb8} (0xd7385977)
> - private final value 'pre' 'Ljava/util/Optional;' @16 a 'java/util/Optional'{0x00000006b9c2cbd0} (0xd738597a)
> - private final value 'build' 'Ljava/util/Optional;' @20 a 'java/util/Optional'{0x00000006b9c0a118} (0xd7381423)
> - private final value 'optional' 'Ljava/util/Optional;' @24 a 'java/util/Optional'{0x00000006b9c2cbe8} (0xd738597d)
> $1 = (void *) 0x0
> (rr) call (void*) pp(0xd7381423)
>
> "Executing pp"
> The program being debugged received signal SIGSEGV, Segmentation fault
> while in a function called from GDB. GDB has restored the context
> to what it was before the call. To change this behavior use
> "set unwind-on-signal off". Evaluation of the expression containing
> the function (pp(long)) will be abandoned.
>
>
> **After:**
> ```(rr) call (void*) pp(0x6b9c08fc8)
>
> "Executing pp"
> java.lang.Runtime$Version
> {0x00000006b9c08fc8} - klass: 'java/lang/Runtime$Version' - flags:
>
> - ---- fields (total size 4 words):
> - private final value 'version' 'Ljava/util/List;' @12 a 'java/util/ImmutableCollections$List12'{0x00000006b9c2cbb8} (0xd7385977)
> - private final value 'pre' 'Ljava/util/Optional;' @16 a 'java/util/Optional'{0x00000006b9c2cbd0} (0xd738597a)
> - private final value 'build' 'Ljava/util/Optional;' @20 a 'java/util/Optional'{0x00000006b9c0a118} (0xd7381423)
> - private final value 'optional' 'Ljava/util/Optional;' @24 a 'java/util/Optional'{0x00000006b9c2cbe8} (0xd738597d)
> $1 = (void *) 0x0
> (rr) call (void*) pp(0xd7381423)
>
> "Executing pp"
> 3610776611 is a compressed pointer to object: java.util.Optional
> {0x00000006b9c0a118} - klass: 'java/util/Optional' - flags:
>
> - ---- fields (total size 3 words):
> - private final value 'value' 'Ljava/lang/Object;' @16 null (0x00000000)
> $2 = (void *) 0x0
>
>
> Thanks,
> Tobias
Overall, looks good.
`BlockLocationPrinter<CollectedHeapT>::print_location()` has very similar code, but uses a more elaborate check in place of `Universe::heap()->is_in(o)`. Any particular reason `LocationPrinter::is_valid_obj()` doesn't fit `pp()`? Otherwise, it makes sense to unify the code.
-------------
PR Review: https://git.openjdk.org/jdk/pull/29280#pullrequestreview-3672476297
More information about the hotspot-dev
mailing list