RFR: 8296469: Instrument VMError::report with reentrant iteration step for register and stack printing

Dean Long dlong at openjdk.org
Wed Nov 9 08:33:21 UTC 2022


On Mon, 7 Nov 2022 13:24:26 GMT, Axel Boldt-Christmas <aboldtch at openjdk.org> wrote:

> Add reentrant step logic to VMError::report with an inner loop which enable the logic to recover at every step of the iteration.
> 
> Before this change, if printing one register/stack position crashes then no more registers/stack positions will be printed.
> 
> After this change even if the VM is unstable and some registers print_location crashes the hs_err printing will recover and keep attempting to print the rest of the registers or stack values.
> 
> Enables the following
> ```C++
> REENTRANT_STEP_IF("printing register info", _verbose && _context && _thread && Universe::is_fully_initialized())
>   os::print_register_info_header(st, _context);
> 
>   REENTRANT_LOOP_START(os::print_nth_register_info_max_index())
>     // decode register contents if possible
>     ResourceMark rm(_thread);
>     os::print_nth_register_info(st, REENTRANT_ITERATION_STEP, _context);
>   REENTRANT_LOOP_END
> 
>   st->cr();
> 
> 
> Testing: tier 1 and compiled Linux-x64/aarch64, MacOS-x64/aarch64, Windows x64 and cross-compiled Linux-x86/riscv/arm/ppc/s390x (GHA and some local)

I hit a register value that crashed recently.  It wasn't a bad oop, but it was a derived oop.  The value was an interior pointer to an array element.  In general derived oops can be an arbitrary delta from the base oop, so identifying them would normally require looking at the oopmap, but it seems like interior pointers should be easier to handle.

-------------

PR: https://git.openjdk.org/jdk/pull/11017


More information about the hotspot-dev mailing list