From ca64fa43720e1367e6274ab25096e22c425d8444 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Wed, 20 Jul 2011 21:21:37 +0200 Subject: [PATCH] make thread dumps generated by debugger and copied to clipboard recognizable by "AnalyzeStackTrace" action (IDEA-71213) --- .../debugger/actions/ThreadDumpAction.java | 26 +++++++++++++------ .../intellij/unscramble/ThreadDumpPanel.java | 1 + .../src/messages/DebuggerBundle.properties | 2 ++ 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/actions/ThreadDumpAction.java b/java/debugger/impl/src/com/intellij/debugger/actions/ThreadDumpAction.java index ece27f8b506c..4f46e93019e5 100644 --- a/java/debugger/impl/src/com/intellij/debugger/actions/ThreadDumpAction.java +++ b/java/debugger/impl/src/com/intellij/debugger/actions/ThreadDumpAction.java @@ -100,7 +100,7 @@ public class ThreadDumpAction extends AnAction implements AnAction.TransparentUp result.add(threadState); threadState.setJavaThreadState(threadStatusToJavaThreadState(threadStatus)); - buffer.append(threadName); + buffer.append("\"").append(threadName).append("\""); ReferenceType referenceType = threadReference.referenceType(); if (referenceType != null) { //noinspection HardCodedStringLiteral @@ -118,17 +118,27 @@ public class ThreadDumpAction extends AnAction implements AnAction.TransparentUp if (priority != null) { Value value = threadReference.getValue(priority); if (value instanceof IntegerValue) { - buffer.append(", ").append(DebuggerBundle.message("threads.export.attribute.label.priority", ((IntegerValue)value).intValue())); + buffer.append(" ").append(DebuggerBundle.message("threads.export.attribute.label.priority", ((IntegerValue)value).intValue())); + } + } + + Field tid = referenceType.fieldByName("tid"); + if (tid != null) { + Value value = threadReference.getValue(tid); + if (value instanceof LongValue) { + buffer.append(" ").append(DebuggerBundle.message("threads.export.attribute.label.tid", Long.toHexString(((LongValue)value).longValue()))); + buffer.append(" nid=NA"); } } } - - ThreadGroupReference groupReference = threadReference.threadGroup(); - if (groupReference != null) { - buffer.append(", ").append(DebuggerBundle.message("threads.export.attribute.label.group", groupReference.name())); + //ThreadGroupReference groupReference = threadReference.threadGroup(); + //if (groupReference != null) { + // buffer.append(", ").append(DebuggerBundle.message("threads.export.attribute.label.group", groupReference.name())); + //} + final String state = threadState.getState(); + if (state != null) { + buffer.append(" ").append(state); } - buffer.append(", ").append( - DebuggerBundle.message("threads.export.attribute.label.status", threadState.getState())); buffer.append("\n java.lang.Thread.State: ").append(threadState.getJavaThreadState()); diff --git a/java/java-impl/src/com/intellij/unscramble/ThreadDumpPanel.java b/java/java-impl/src/com/intellij/unscramble/ThreadDumpPanel.java index aa0d35bb48b6..90921e32e1fb 100644 --- a/java/java-impl/src/com/intellij/unscramble/ThreadDumpPanel.java +++ b/java/java-impl/src/com/intellij/unscramble/ThreadDumpPanel.java @@ -252,6 +252,7 @@ public class ThreadDumpPanel extends JPanel { public void actionPerformed(AnActionEvent e) { final StringBuilder buf = new StringBuilder(); + buf.append("Full thread dump").append("\n\n"); for (ThreadState state : myThreadDump) { buf.append(state.getStackTrace()).append("\n\n"); } diff --git a/resources-en/src/messages/DebuggerBundle.properties b/resources-en/src/messages/DebuggerBundle.properties index b3275dceceaf..e019ffbafaf3 100644 --- a/resources-en/src/messages/DebuggerBundle.properties +++ b/resources-en/src/messages/DebuggerBundle.properties @@ -254,6 +254,8 @@ threads.export.attribute.label.daemon=daemon threads.export.attribute.label.group=in group ''{0}'' threads.export.attribute.label.status=status: ''{0}'' threads.export.attribute.label.priority=prio={0} +threads.export.attribute.label.tid=tid=0x{0} +threads.export.attribute.label.nid=nid={0} threads.export.attribute.label.blocks.thread=blocks {0} threads.export.attribute.label.waiting.for.thread=waiting for {0} to release lock on {1} threads.export.attribute.label.locked=locked {0}