RFR: JDK-8302320: AsyncGetCallTrace obtains too few frames in sanity test [v2]
Jorn Vernee
jvernee at openjdk.org
Fri Feb 17 14:18:50 UTC 2023
On Thu, 16 Feb 2023 14:25:15 GMT, Johannes Bechberger <duke at openjdk.org> wrote:
>> Extends the existing AsyncGetCallTrace test case and fixes the issue by modifying `MethodHandles` code.
>
> Johannes Bechberger has updated the pull request incrementally with one additional commit since the last revision:
>
> Implement addptr suggestion by @JohnVernee and @reinrich
Thanks for trying it out! I ran tier 1-4 here as well, and all failing tests are in `vmTestbase/vm/mlvm/indy/func/jvmti`. They all seem to be using `PopFrame` before a crash happens, so I think that might be where the problem is. I don't think it's impossible that there is other code out there that has it's own workaround for the incorrect unextended_sp.
Also, I later realized that interpreter frames also save the sp before before making a call (`interpreter_frame_last_sp_offset`), and I can find at least some code that seems to assume `caller.unextended_sp() == (intptr_t*)caller.at(frame::interpreter_frame_last_sp_offset)`, so we'd just be breaking another invariant with my "fix".
There's probably a bit of tech debt here (filed: https://bugs.openjdk.org/browse/JDK-8302745).
I had a closer look at the original fix, and it looks like the `unextended_sp` is only used to check the size of the caller frame for interpreter -> interpreter calls. So, I think it's okay to relax the `unextende_sp >= sp` check (the invariant it tests turns out not to hold for otherwise valid stacks any way). But, in that case, please leave a comment that explains why we can have `sp > unextended_sp`.
-------------
PR: https://git.openjdk.org/jdk/pull/12535
More information about the serviceability-dev
mailing list