Integrated: 8286580: serviceability/jvmti/vthread/GetSetLocalTest failed with assert: Not supported for heap frames
Serguei Spitsyn
sspitsyn at openjdk.org
Thu Jun 23 16:25:43 UTC 2022
On Sat, 18 Jun 2022 03:59:44 GMT, Serguei Spitsyn <sspitsyn at openjdk.org> wrote:
> The JVMTI SetLocalXXX requires the target virtual thread suspended at a breakpoint or single step event.
>
> This is the relevant statement from the "Local Variable" section:
>
> `The SetLocalXXX functions may be used to set the value of a local variable in the topmost frame of a virtual thread suspended at a breakpoint or single step event.
> `
> This fix is to return the JVMTI_ERROR_OPAQUE_FRAME in cases when the target thread is not at a breakpoint or single step event. In this case the assert described in the bug report is avoided:
>
>
> open/src/hotspot/share/runtime/vframe.cpp:300
> # assert(stack_chunk() == __null) failed: Not supported for heap frames
>
> Also, this is an analysis from Ron:
>
> The problem occurs because the thread is suspended at a safepoint poll on return in the oldest thawed frame. The safepoint happens after the frame is popped but before it returns to the return barrier, thawing the caller (and so the stack looks as if we're in enterSpecial). In that case the virtual thread's topmost frame is still frozen on the heap, even though it is mounted.
>
> However, the spec says that a set local operation should succeed for the topmost frame of a mounted virtual thread only if the thread is suspended *at a breakpoint or a single-step event*, and I don't think we can stop at that safepoint in that case.
>
> If so, the fix is simple: if we're trying to set, even if the virtual thread is mounted and the depth is zero, if the frame is a heap frame, we should return an OPAQUE_FRAME error. The test should be changed as well to accept such an error if the thread is suspended not at a breakpoint/single-step.
>
>
> Changes `GetSetLocalTest` test are taken from the repo-loom repository. It was an update from Leonid which is needed to reproduce this problem.
>
> The fix was tested with thousands of runs of the `GetSetLocalTest` on Linux, Windows and MacOs.
>
> Will also submit nsk.jvmti and nsk.jdi test runs on mach5.
This pull request has now been integrated.
Changeset: 4c9ea7e6
Author: Serguei Spitsyn <sspitsyn at openjdk.org>
URL: https://git.openjdk.org/jdk19/commit/4c9ea7e66aaf99f42ee2df0b17c6586f57019a19
Stats: 44 lines in 4 files changed: 23 ins; 5 del; 16 mod
8286580: serviceability/jvmti/vthread/GetSetLocalTest failed with assert: Not supported for heap frames
Reviewed-by: lmesnik, rpressler, cjplummer
-------------
PR: https://git.openjdk.org/jdk19/pull/42
More information about the serviceability-dev
mailing list