JDK 14 RFR of JDK-8226809: Circular reference in printed stack trace is not correctly indented & ambiguous

Joe Darcy joe.darcy at oracle.com
Fri Jun 28 23:42:28 UTC 2019


Hello,

Please review the fix for

     JDK-8226809: hCircular reference in printed stack trace is not 
correctly indented & ambiguous
     http://cr.openjdk.java.net/~darcy/8226809.0/

Patch below.

Consider the code which creates various circularities in the suppressed 
and caused links of an exception:

public class DejaVuStackTrace {
     public static void main(String... args) {
         Exception first = new Exception("first");
         Exception second = new Exception("second");
         first.addSuppressed(second);
         Exception third = new Exception("third");
         second.addSuppressed(third);
         Exception fourth = new Exception("fourth");
         third.addSuppressed(fourth);

         // Circular reference
         fourth.addSuppressed(first);

         fourth.addSuppressed(new Exception("fifth"));

         // Another Circular reference
         fourth.initCause(second);

         first.printStackTrace();
     }
}

The existing implementation prints the stack trace as:

java.lang.Exception: first
     at DejaVuStackTrace.main(DejaVuStackTrace.java:3)
     Suppressed: java.lang.Exception: second
         at DejaVuStackTrace.main(DejaVuStackTrace.java:4)
         Suppressed: java.lang.Exception: third
             at DejaVuStackTrace.main(DejaVuStackTrace.java:6)
             Suppressed: java.lang.Exception: fourth
                 at DejaVuStackTrace.main(DejaVuStackTrace.java:8)
     [CIRCULAR REFERENCE:java.lang.Exception: first]
                 Suppressed: java.lang.Exception: fifth
                     at DejaVuStackTrace.main(DejaVuStackTrace.java:14)
     [CIRCULAR REFERENCE:java.lang.Exception: second]

and the revised code prints this more helpfully as

java.lang.Exception: first
     at DejaVuStackTrace.main(DejaVuStackTrace.java:3)
     Suppressed: java.lang.Exception: second
         at DejaVuStackTrace.main(DejaVuStackTrace.java:4)
         Suppressed: java.lang.Exception: third
             at DejaVuStackTrace.main(DejaVuStackTrace.java:6)
             Suppressed: java.lang.Exception: fourth
                 at DejaVuStackTrace.main(DejaVuStackTrace.java:8)
                 Suppressed: [CIRCULAR REFERENCE: java.lang.Exception: 
first]
                 Suppressed: java.lang.Exception: fifth
                     at DejaVuStackTrace.main(DejaVuStackTrace.java:14)
             Caused by: [CIRCULAR REFERENCE: java.lang.Exception: second]

The format of the printed stack trace is not specified and I don't think 
it is worthwhile to write a regression test for this change.

Cheers,

-Joe

diff -r c9093341cfe2 src/java.base/share/classes/java/lang/Throwable.java
--- a/src/java.base/share/classes/java/lang/Throwable.java    Fri Jun 28 
13:02:18 2019 -0700
+++ b/src/java.base/share/classes/java/lang/Throwable.java    Fri Jun 28 
16:34:15 2019 -0700
@@ -693,7 +693,7 @@
                                           Set<Throwable> dejaVu) {
          assert Thread.holdsLock(s.lock());
          if (dejaVu.contains(this)) {
-            s.println("\t[CIRCULAR REFERENCE:" + this + "]");
+            s.println(prefix + caption + "[CIRCULAR REFERENCE: " + this 
+ "]");
          } else {
              dejaVu.add(this);
              // Compute number of frames in common between this and 
enclosing trace



More information about the core-libs-dev mailing list