--- old/src/share/classes/java/lang/Throwable.java 2011-05-18 16:44:44.000000000 -0700 +++ new/src/share/classes/java/lang/Throwable.java 2011-05-18 16:44:44.000000000 -0700 @@ -777,7 +777,8 @@ * @see java.lang.Throwable#printStackTrace() */ public synchronized Throwable fillInStackTrace() { - if (stackTrace != null) { + if (stackTrace != null || + backtrace != null /* Out of protocol state */ ) { fillInStackTrace(0); stackTrace = UNASSIGNED_STACK; } @@ -817,7 +818,8 @@ private synchronized StackTraceElement[] getOurStackTrace() { // Initialize stack trace field with information from // backtrace if this is the first call to this method - if (stackTrace == UNASSIGNED_STACK) { + if (stackTrace == UNASSIGNED_STACK || + (stackTrace == null && backtrace != null) /* Out of protocol state */) { int depth = getStackTraceDepth(); stackTrace = new StackTraceElement[depth]; for (int i=0; i < depth; i++) @@ -865,7 +867,8 @@ } synchronized (this) { - if (this.stackTrace == null) // Immutable stack + if (this.stackTrace == null && // Immutable stack + backtrace == null) // Test for out of protocol state return; this.stackTrace = defensiveCopy; }