karaf-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ff...@apache.org
Subject svn commit: r1508293 - /karaf/branches/karaf-2.3.x/diagnostic/common/src/main/java/org/apache/karaf/diagnostic/common/ThreadDumpProvider.java
Date Tue, 30 Jul 2013 04:00:39 GMT
Author: ffang
Date: Tue Jul 30 04:00:38 2013
New Revision: 1508293

URL: http://svn.apache.org/r1508293
Log:
[KARAF-2407]dev:create-dump should generate full stack traces of each thread

Modified:
    karaf/branches/karaf-2.3.x/diagnostic/common/src/main/java/org/apache/karaf/diagnostic/common/ThreadDumpProvider.java

Modified: karaf/branches/karaf-2.3.x/diagnostic/common/src/main/java/org/apache/karaf/diagnostic/common/ThreadDumpProvider.java
URL: http://svn.apache.org/viewvc/karaf/branches/karaf-2.3.x/diagnostic/common/src/main/java/org/apache/karaf/diagnostic/common/ThreadDumpProvider.java?rev=1508293&r1=1508292&r2=1508293&view=diff
==============================================================================
--- karaf/branches/karaf-2.3.x/diagnostic/common/src/main/java/org/apache/karaf/diagnostic/common/ThreadDumpProvider.java
(original)
+++ karaf/branches/karaf-2.3.x/diagnostic/common/src/main/java/org/apache/karaf/diagnostic/common/ThreadDumpProvider.java
Tue Jul 30 04:00:38 2013
@@ -16,7 +16,9 @@
 package org.apache.karaf.diagnostic.common;
 
 import java.io.OutputStreamWriter;
+import java.lang.management.LockInfo;
 import java.lang.management.ManagementFactory;
+import java.lang.management.MonitorInfo;
 import java.lang.management.ThreadInfo;
 import java.lang.management.ThreadMXBean;
 
@@ -41,9 +43,75 @@ public class ThreadDumpProvider extends 
         outputStream.write("Number of threads: " + threadMXBean.getThreadCount() + "\n");
 
         for (ThreadInfo threadInfo : threadMXBean.getThreadInfo(threadMXBean.getAllThreadIds(),
Integer.MAX_VALUE)) {
-            outputStream.write(threadInfo.toString() + "\n\n");
+            outputStream.write(getDumpThreadString(threadInfo) + "\n\n");
         }
 
     }
+    
+    protected String getDumpThreadString(ThreadInfo threadInfo) {
+        StringBuilder sb = new StringBuilder("\"" + threadInfo.getThreadName() + "\"" + "
Id=" + threadInfo.getThreadId() + " "
+                                             + threadInfo.getThreadState());
+        if (threadInfo.getLockName() != null) {
+            sb.append(" on " + threadInfo.getLockName());
+        }
+        if (threadInfo.getLockOwnerName() != null) {
+            sb.append(" owned by \"" + threadInfo.getLockOwnerName() + "\" Id=" + threadInfo.getLockOwnerId());
+        }
+        if (threadInfo.isSuspended()) {
+            sb.append(" (suspended)");
+        }
+        if (threadInfo.isInNative()) {
+            sb.append(" (in native)");
+        }
+        sb.append('\n');
+        int i = 0;
+        StackTraceElement[] stackTrace = threadInfo.getStackTrace();
+        for (; i < stackTrace.length; i++) {
+            StackTraceElement ste = stackTrace[i];
+            sb.append("\tat " + ste.toString());
+            sb.append('\n');
+            if (i == 0 && threadInfo.getLockInfo() != null) {
+                Thread.State ts = threadInfo.getThreadState();
+                switch (ts) {
+                case BLOCKED:
+                    sb.append("\t-  blocked on " + threadInfo.getLockInfo());
+                    sb.append('\n');
+                    break;
+                case WAITING:
+                    sb.append("\t-  waiting on " + threadInfo.getLockInfo());
+                    sb.append('\n');
+                    break;
+                case TIMED_WAITING:
+                    sb.append("\t-  waiting on " + threadInfo.getLockInfo());
+                    sb.append('\n');
+                    break;
+                default:
+                }
+            }
+
+            for (MonitorInfo mi : threadInfo.getLockedMonitors()) {
+                if (mi.getLockedStackDepth() == i) {
+                    sb.append("\t-  locked " + mi);
+                    sb.append('\n');
+                }
+            }
+        }
+        if (i < stackTrace.length) {
+            sb.append("\t...");
+            sb.append('\n');
+        }
+
+        LockInfo[] locks = threadInfo.getLockedSynchronizers();
+        if (locks.length > 0) {
+            sb.append("\n\tNumber of locked synchronizers = " + locks.length);
+            sb.append('\n');
+            for (LockInfo li : locks) {
+                sb.append("\t- " + li);
+                sb.append('\n');
+            }
+        }
+        sb.append('\n');
+        return sb.toString();
+    }
 
 }



Mime
View raw message