RFR JDK-8193325: StackFrameInfo::getByteCodeIndex returns wrong value if bci > 32767
coleen.phillimore at oracle.com
coleen.phillimore at oracle.com
Wed Aug 14 20:52:54 UTC 2019
On 8/14/19 3:42 PM, Mandy Chung wrote:
> I have further discussion with Coleen and walkthrough the vframe
> implementation. Here is what we confirm and agree.
>
> vframeStream::bci might return an invalid bci whereas javaVFrame::bci
> returns a valid bci (compiledVFrame::bci adjusts invalid bci to 0).
>
> An invalid bci could happen when hitting a safepoint on bci #0 on a
> synchronized method either before or after the monitor is locked
> (implicit synchronization without explicit monitorenter). That might
> occur when StackOverflowError is thrown for example. However, that
> should never happen when StackWalker is called and the top frame would
> be in the stack walking code.
>
> +1/-1 adjustment intends to address invalid bci case but such case is
> not applicable for StackWalker API. With that, I agree with Coleen
> that VM should set the bci value to StackFrameInfo::bci field and no
> adjustment needed:
> http://cr.openjdk.java.net/~mchung/jdk14/8193325/webrev.05/
This looks good and straighforward.
Thank you!
Coleen
>
> thanks
> Mandy
>
> On 8/13/19 4:56 PM, coleen.phillimore at oracle.com wrote:
>>
>> Hi, I saw my name in this thread and had a discussion with Mandy. I
>> don't like that the VM and JDK having this special coordinated dance
>> of +1/-1, and the reason for this is to differentiate the value of 0
>> in StackFrame meaning either uninitialized or invalid. If through
>> some race, an unitialized value is observed, then the MemberName may
>> not be filled in either. In any case zero makes sense to return as
>> the bci because it'll point to the line number beginning of the
>> method, if used to get the line number.
>>
>> The stackwalk API doesn't return invalid bci because it adjusts it:
>>
>> int compiledVFrame::bci() const {
>> int raw = raw_bci();
>> return raw == SynchronizationEntryBCI ? 0 : raw;
>> }
>>
>> At any rate, the 04 webrev looks good minus the +1/-1 dance and
>> StackWalker.java comment. Coupling the jdk and jvm like this feels
>> like it's asking for bugs. I like the simpler implementation that
>> fixes the bug that we have.
>>
>> Thanks,
>> Coleen
>>
>>
>> On 8/13/19 1:49 PM, Mandy Chung wrote:
>>>
>>>
>>> On 8/13/19 9:30 AM, Peter Levart wrote:
>>>> Usually the StackFrameInfo(s) are consumed as soon as they are
>>>> returned from StackWalker API and never assigned to @Stable field.
>>>> So there's no purpose of @Stable for bci field use. Except
>>>> documentation. But documentation can be specified in the form of
>>>> comments too.
>>>>
>>>
>>> There are several JDK classes whose fields are filled by VM and
>>> comment is the form of documentation. Until new use of StackFrame
>>> in the future shows performance benefit, it's okay to stick with
>>> @Stable original intent and keep the comment:
>>>
>>> + private int bci; // zero and negative values
>>> represent invalid BCI
>>>
>>> Please also review CSR:
>>> https://bugs.openjdk.java.net/browse/JDK-8229487
>>>
>>> Mandy
>>
>
More information about the core-libs-dev
mailing list