Blame PStack-808293.patch

Jiri Vanek 8a53969
--- openjdk/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/PStack.java	2012-04-06 02:26:33.322164601 +0200
Jiri Vanek 8a53969
+++ openjdk/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/PStack.java	2012-04-06 02:26:57.958514071 +0200
Jiri Vanek 8a53969
@@ -1,5 +1,6 @@
Jiri Vanek 8a53969
 /*
Jiri Vanek 8a53969
  * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
Jiri Vanek 8a53969
+ * Copyright (c) 2012, Red Hat Inc.
Jiri Vanek 8a53969
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
Jiri Vanek 8a53969
  *
Jiri Vanek 8a53969
  * This code is free software; you can redistribute it and/or modify it
Jiri Vanek 8a53969
@@ -84,7 +85,8 @@
Jiri Vanek 8a53969
                out.print("----------------- ");
Jiri Vanek 8a53969
                out.print(th);
Jiri Vanek 8a53969
                out.println(" -----------------");
Jiri Vanek 8a53969
-               while (f != null) {
Jiri Vanek 8a53969
+               int maxStack = 256;
Jiri Vanek 8a53969
+               while (f != null && maxStack-- > 0) {
Jiri Vanek 8a53969
                   ClosestSymbol sym = f.closestSymbolToPC();
Jiri Vanek 8a53969
                   Address pc = f.pc();
Jiri Vanek 8a53969
                   out.print(pc + "\t");
Jiri Vanek 8a53969
@@ -158,10 +160,19 @@
Jiri Vanek 8a53969
                         printUnknown(out);
Jiri Vanek 8a53969
                      }
Jiri Vanek 8a53969
                   }
Jiri Vanek 8a53969
+                  Address oldPC = f.pc();
Jiri Vanek 8a53969
+                  Address oldFP = f.localVariableBase();
Jiri Vanek 8a53969
                   f = f.sender(th);
Jiri Vanek 8a53969
+                  if (f != null
Jiri Vanek 8a53969
+                      && oldPC.equals(f.pc())
Jiri Vanek 8a53969
+                      && oldFP.equals(f.localVariableBase())) {
Jiri Vanek 8a53969
+                      // We didn't make any progress
Jiri Vanek 8a53969
+                      f = null;
Jiri Vanek 8a53969
+                  }
Jiri Vanek 8a53969
                }
Jiri Vanek 8a53969
             } catch (Exception exp) {
Jiri Vanek 8a53969
-               exp.printStackTrace();
Jiri Vanek 8a53969
+               // exp.printStackTrace();
Jiri Vanek 8a53969
+               out.println("bad stack: " + exp);
Jiri Vanek 8a53969
                // continue, may be we can do a better job for other threads
Jiri Vanek 8a53969
             }
Jiri Vanek 8a53969
             if (isJava && concurrentLocks) {