From 23606e58afed7f3336c4918872a4dea068edcf98 Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 1 Oct 2015 09:14:26 +0200 Subject: [PATCH] correct thread dump normalizing to split dumps wrapped in the first line --- .../intellij/unscramble/UnscrambleDialog.java | 17 +++++++-- .../unscramble/NormalizeTextTest.groovy | 35 +++++++++++++++++++ 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/java/java-impl/src/com/intellij/unscramble/UnscrambleDialog.java b/java/java-impl/src/com/intellij/unscramble/UnscrambleDialog.java index 124557bbc7cc..7cca43290ffe 100644 --- a/java/java-impl/src/com/intellij/unscramble/UnscrambleDialog.java +++ b/java/java-impl/src/com/intellij/unscramble/UnscrambleDialog.java @@ -57,6 +57,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import static com.intellij.util.containers.ContainerUtil.ar; + /** * @author cdr */ @@ -70,6 +72,7 @@ public class UnscrambleDialog extends DialogWrapper { return state.isDeadlocked(); } }; + private static final String[] IMPORTANT_THREAD_DUMP_WORDS = ar("tid", "nid", "wait", "parking", "prio", "os_prio", "java"); private final Project myProject; private JPanel myEditorPanel; @@ -300,7 +303,7 @@ public class UnscrambleDialog extends DialogWrapper { boolean first = true; boolean inAuxInfo = false; - for (String line : lines) { + for (final String line : lines) { //noinspection HardCodedStringLiteral if (!inAuxInfo && (line.startsWith("JNI global references") || line.trim().equals("Heap"))) { builder.append("\n"); @@ -321,7 +324,17 @@ public class UnscrambleDialog extends DialogWrapper { first = false; int i = builder.lastIndexOf("\n"); CharSequence lastLine = i == -1 ? builder : builder.subSequence(i + 1, builder.length()); - if (lastLine.toString().matches("\\s*at") && !line.matches("\\s+.*")) builder.append(" "); // separate 'at' from file name + if (!line.matches("\\s+.*") && lastLine.length() > 0) { + if (lastLine.toString().matches("\\s*at") //separate 'at' from filename + || ContainerUtil.or(IMPORTANT_THREAD_DUMP_WORDS, new Condition() { + @Override + public boolean value(String word) { + return line.startsWith(word); + } + })) { + builder.append(" "); + } + } builder.append(trimSuffix(line)); } return builder.toString(); diff --git a/java/java-tests/testSrc/com/intellij/unscramble/NormalizeTextTest.groovy b/java/java-tests/testSrc/com/intellij/unscramble/NormalizeTextTest.groovy index cabcdf68cbc2..b39f2535e70d 100644 --- a/java/java-tests/testSrc/com/intellij/unscramble/NormalizeTextTest.groovy +++ b/java/java-tests/testSrc/com/intellij/unscramble/NormalizeTextTest.groovy @@ -147,6 +147,41 @@ at org.apache.velocity.Template.merge(Template.java:256)"""); java.util.concurrent.ForkJoinTask.invokeAll(ForkJoinTask.java:837)'''); } + public void "test do not merge words"() { + def text = ''' +"Performance watcher" #35 prio=1 os_prio=-2 tid=0x3ea60c00 nid=0xbfc +waiting on condition [0x445ef000] + java.lang.Thread.State: TIMED_WAITING (parking) + at sun.misc.Unsafe.park(Native Method) + - parking to wait for <0x1e45d2d8> (a +java.util.concurrent.Semaphore$NonfairSync) + +"ApplicationImpl pooled thread 5" #33 prio=4 os_prio=-1 tid=0x3ea60000 +nid=0x898 runnable [0x4424f000] + java.lang.Thread.State: RUNNABLE + at java.io.FileInputStream.readBytes(Native Method) + at java.io.FileInputStream.read(FileInputStream.java:255) + at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284) + at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326) + at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178) +''' + doTest(text, ''' + +"Performance watcher" #35 prio=1 os_prio=-2 tid=0x3ea60c00 nid=0xbfc waiting on condition [0x445ef000] + java.lang.Thread.State: TIMED_WAITING (parking) + at sun.misc.Unsafe.park(Native Method) + - parking to wait for <0x1e45d2d8> (a java.util.concurrent.Semaphore$NonfairSync) + +"ApplicationImpl pooled thread 5" #33 prio=4 os_prio=-1 tid=0x3ea60000 nid=0x898 runnable [0x4424f000] + java.lang.Thread.State: RUNNABLE + at java.io.FileInputStream.readBytes(Native Method) + at java.io.FileInputStream.read(FileInputStream.java:255) + at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284) + at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326) + at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)''') + assert ThreadDumpParser.parse(UnscrambleDialog.normalizeText(text)).size() == 2 + } + private static void doTest(@NonNls String stackTrace, @NonNls String expected) { String normalized = UnscrambleDialog.normalizeText(stackTrace); assertEquals(expected, normalized);