Grouped method entry events

Egor Ushakov egor.ushakov at jetbrains.com
Sat Aug 6 09:18:12 UTC 2022


Hi Chris,

I was able to somewhat reproduce it with jdb:
compile any simple samle app like

public class A {
     public static void main(String[] args) {
         System.out.println("A"); // line 3
     }
}

now debug with jdb:

  % jdb A
Initializing jdb ...
 > stop at A:3
Deferring breakpoint A:3.
It will be set after the class is loaded.
 > run
run A
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
 >
VM Started: Set deferred breakpoint A:3

Breakpoint hit: "thread=main", A.main(), line=3 bci=0

main[1] exclude none
main[1] trace methods
main[1] next
 >
*Method entered: **
**Method entered: **
**Method entered: **
**Method entered: *
Method exited: return value = false, "thread=main", 
java.lang.System.allowSecurityManager(), line=198 bci=12

main[1] next
 >
Method exited: return value = null, "thread=main", 
java.lang.System.getSecurityManager(), line=493 bci=11

main[1] next
 >
*Method entered: **
**Method entered: **
**Method entered: **
**Method entered:*
Method exited: return value = <void value>, "thread=main", 
java.lang.Object.<init>(), line=44 bci=0

main[1] next
 >
*Method entered: **
**Method entered: **
**Method entered: **
**Method entered: *
Method exited: return value = true, "thread=main", 
java.lang.String.isLatin1(), line=4,546 bci=18

Unfortunately jdb does not show method description for the events with 
suspend policy thread (except for the last one), but you can see that 
there are 5 events in one set here.

Hope it helps,
Egor

On 05.08.2022 22:02, Chris Plummer wrote:
>
> Hi Egor,
>
> That is odd, and clearly wrong. It means that MethodEntryEvents are 
> being delivered when no longer even executing in the method. And you 
> are using the EVENT_THREAD suspend policy, so there should be a 
> suspend for each event. Offhand I can't think of any changes that 
> would have caused this. I also don't see how our testing would passed 
> with this behavior. I'm suspecting a faulty interaction with the debug 
> agent and IDEA (possibly the IDEA version of JDI).
>
> Can you see where the thread is actually suspended at when you get the 
> event set?
>
> Does this happen with 17 also? It would be nice to know what version 
> introduced this problem.
>
> Can you create a JDI test case for this?
>
> > Without the active step request it works in jdk 18 as in jdk 11:
>
> I'm not sure what you mean by "active step". Do you mean single 
> stepping is enabled? The JDWP spec does allow BreakPoint, SingleStep, 
> MethodEntry, and MethodExit events to be combined into the same 
> composite event (which should translate to the same JDI event set) if 
> they occur at the same location and in the same thread. So I can see 
> enabling single stepping having an impact on the behavior you are seeing.
>
> Chris
>
> On 8/5/22 9:59 AM, Egor Ushakov wrote:
>> Hi,
>>
>> we're experiencing strange grouping of method entry/exit events, is 
>> this a bug or a feature?
>> We have one method entry request active with suspend policy 1 
>> (suspend thread).
>> important: we also have one active step request (step over)
>>
>> In jdk 11 we have one composite event for each event, which is what's 
>> expected:
>> event set, policy:1, count:1 = 
>> {MethodEntryEvent at java.lang.ClassLoader:522 in thread main}
>> event set, policy:1, count:1 = 
>> {MethodEntryEvent at jdk.internal.loader.ClassLoaders$AppClassLoader:170 
>> in thread main}
>> event set, policy:1, count:1 = {MethodEntryEvent at java.lang.System:375 
>> in thread main}
>> event set, policy:1, count:1 = 
>> {MethodEntryEvent at jdk.internal.loader.BuiltinClassLoader:579 in 
>> thread main}
>> event set, policy:1, count:1 = 
>> {MethodEntryEvent at jdk.internal.loader.BuiltinClassLoader:591 in 
>> thread main}
>> event set, policy:1, count:1 = 
>> {MethodEntryEvent at java.lang.ClassLoader:665 in thread main}
>> event set, policy:1, count:1 = {MethodEntryEvent at java.lang.Object:50 
>> in thread main}
>> event set, policy:1, count:1 = 
>> {MethodEntryEvent at java.util.concurrent.ConcurrentHashMap:1541 in 
>> thread main}
>> event set, policy:1, count:1 = 
>> {MethodEntryEvent at java.util.concurrent.ConcurrentHashMap:1011 in 
>> thread main}
>> event set, policy:1, count:1 = 
>> {MethodEntryEvent at java.lang.String:1502 in thread main}
>> event set, policy:1, count:1 = 
>> {MethodEntryEvent at java.lang.String:3266 in thread main}
>> event set, policy:1, count:1 = 
>> {MethodEntryEvent at java.lang.StringLatin1:194 in thread main}
>> ...
>>
>> In jdk 18 they are grouped now!
>> event set, policy:1, count:17 = 
>> {MethodEntryEvent at java.lang.ClassLoader:521 in thread main, 
>> MethodEntryEvent at jdk.internal.loader.ClassLoaders$AppClassLoader:180 
>> in thread main, MethodEntryEvent at java.lang.System:490 in thread main, 
>> MethodEntryEvent at java.lang.System:198 in thread main, 
>> MethodEntryEvent at jdk.internal.loader.BuiltinClassLoader:639 in thread 
>> main, MethodEntryEvent at jdk.internal.loader.BuiltinClassLoader:651 in 
>> thread main, MethodEntryEvent at java.lang.ClassLoader:664 in thread 
>> main, MethodEntryEvent at java.lang.Object:44 in thread main, 
>> MethodEntryEvent at java.util.concurrent.ConcurrentHashMap:1541 in 
>> thread main, 
>> MethodEntryEvent at java.util.concurrent.ConcurrentHashMap:1011 in 
>> thread main, MethodEntryEvent at java.lang.String:2336 in thread main, 
>> MethodEntryEvent at java.lang.String:4546 in thread main, 
>> MethodEntryEvent at java.lang.StringLatin1:192 in thread main, 
>> MethodEntryEvent at java.util.concurrent.ConcurrentHashMap:697 in thread 
>> main, MethodEntryEvent at java.util.concurrent.ConcurrentHashMap:760 in 
>> thread main, MethodEntryEvent at jdk.internal.misc.Unsafe:2153 in thread 
>> main, 
>> MethodEntryEvent at jdk.internal.misc.Unsafe.getReferenceVolatile(java.lang.Object, 
>> long)+-1 in thread main}
>> event set, policy:1, count:4 = 
>> {MethodEntryEvent at java.util.concurrent.ConcurrentHashMap$Node:631 in 
>> thread main, MethodEntryEvent at java.lang.Object:44 in thread main, 
>> MethodEntryEvent at java.util.concurrent.ConcurrentHashMap:765 in thread 
>> main, 
>> MethodEntryEvent at jdk.internal.misc.Unsafe.compareAndSetReference(java.lang.Object, 
>> long, java.lang.Object, java.lang.Object)+-1 in thread main}
>> event set, policy:1, count:2 = 
>> {MethodEntryEvent at java.util.concurrent.ConcurrentHashMap:2326 in 
>> thread main, 
>> MethodEntryEvent at jdk.internal.misc.Unsafe.compareAndSetLong(java.lang.Object, 
>> long, long, long)+-1 in thread main}
>>
>> Which is really strange and breaks some login in IDEA debugger.
>>
>> Without the active step request it works in jdk 18 as in jdk 11:
>> event set, policy:1, count:1 = 
>> {MethodEntryEvent at java.lang.ClassLoader:521 in thread main}
>> event set, policy:1, count:1 = 
>> {MethodEntryEvent at jdk.internal.loader.ClassLoaders$AppClassLoader:180 
>> in thread main}
>> event set, policy:1, count:1 = {MethodEntryEvent at java.lang.System:490 
>> in thread main}
>> event set, policy:1, count:1 = {MethodEntryEvent at java.lang.System:198 
>> in thread main}
>> event set, policy:1, count:1 = 
>> {MethodEntryEvent at jdk.internal.loader.BuiltinClassLoader:639 in 
>> thread main}
>> event set, policy:1, count:1 = 
>> {MethodEntryEvent at jdk.internal.loader.BuiltinClassLoader:651 in 
>> thread main}
>> event set, policy:1, count:1 = 
>> {MethodEntryEvent at java.lang.ClassLoader:664 in thread main}
>> event set, policy:1, count:1 = {MethodEntryEvent at java.lang.Object:44 
>> in thread main}
>> event set, policy:1, count:1 = 
>> {MethodEntryEvent at java.util.concurrent.ConcurrentHashMap:1541 in 
>> thread main}
>> event set, policy:1, count:1 = 
>> {MethodEntryEvent at java.util.concurrent.ConcurrentHashMap:1011 in 
>> thread main}
>> event set, policy:1, count:1 = 
>> {MethodEntryEvent at java.lang.String:2336 in thread main}
>> event set, policy:1, count:1 = 
>> {MethodEntryEvent at java.lang.String:4546 in thread main}
>> event set, policy:1, count:1 = 
>> {MethodEntryEvent at java.lang.StringLatin1:192 in thread main}
>>
>> Could anyone have a look please.
>> Thanks,
>> Egor
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/serviceability-dev/attachments/20220806/32fc9636/attachment-0001.htm>


More information about the serviceability-dev mailing list