On Fri, 9 Jun 2023 23:58:39 GMT, Chris Plummer <[email protected]> wrote:
> This test launches a debuggee, which creates 11 instances of its main class,
> stores them in a static array of the main class, and then the debugger side
> iterates over all referrers to the main class instaces. Usually this is a
> pretty quick process and doesn't produce much in the way of output while
> walking the reference tree of referrers. However, with virtual threads the
> tree walking and output get unwieldy, and eventually it fails with:
>
>
> IOException reading output of child java interpreter:Stream closed
> java.lang.IllegalThreadStateException
> at
> jdk.jdi/com.sun.tools.jdi.JDWPException.toJDIException(JDWPException.java:76)
> at
> jdk.jdi/com.sun.tools.jdi.ThreadReferenceImpl.name(ThreadReferenceImpl.java:197)
> at
> jdk.jdi/com.sun.tools.jdi.ThreadReferenceImpl.toString(ThreadReferenceImpl.java:637)
> at java.base/java.lang.String.valueOf(String.java:4461)
> at ReferrersTest.showReferrers(ReferrersTest.java:438)
> at ReferrersTest.showReferrers(ReferrersTest.java:466)
>
>
> And ReferrersTest.showReferrers() has recursed about 200 levels deep. I'm not
> sure the order of these errors can be relied on. It looks like while walking
> the referrers tree, the test eventually stumbled upon a thread that had
> exited (but its Thread object was still alive), and this resulted in the test
> aborting. If I catch these exceptions, eventually the test times out while
> still working on referrers.
>
> Judging by some of the output, it appears that introducing the TestScaffold
> class as a referrer to the main debuggee class is the root cause of all these
> extra referrers.
>
> The test has a provision to cut off the recursion:
>
>
> // We have to stop going up a referrer chain in some cases
> Type rt = objRef.type();
> if (rt instanceof ClassType) {
> ClassType ct = (ClassType)rt;
> String name = ct.name();
> if (name.equals("sun.awt.SoftCache$ValueCell")) {
> return;
> }
> if (name.equals("java.lang.ref.Finalizer")) {
> return;
> }
> if (name.equals("java.lang.ref.SoftReference")) {
> return;
> }
> // oh oh, should really check for a subclass of ClassLoader :-)
> if (name.indexOf("ClassLoader") >= 0) {
> return;
> }
> // No doubt there are other reasons to stop ...
> }
>
>
> Adding TestScaffold to the list makes it so the referrer tree walking output
> is almost identical to what it is when not using virtual threads. ...
This pull request has now been integrated.
Changeset: d7251c17
Author: Chris Plummer <[email protected]>
URL:
https://git.openjdk.org/jdk/commit/d7251c1755779f8c4fdeac16ccb797ed45b1dfd4
Stats: 5 lines in 2 files changed: 3 ins; 1 del; 1 mod
8309757: com/sun/jdi/ReferrersTest.java fails with virtual test thread factory
Reviewed-by: sspitsyn, kevinw
-------------
PR: https://git.openjdk.org/jdk/pull/14405