diff --git a/platform/platform-api/src/com/intellij/openapi/editor/actionSystem/TypedAction.java b/platform/platform-api/src/com/intellij/openapi/editor/actionSystem/TypedAction.java index cdab2c05183b..81376292aa63 100644 --- a/platform/platform-api/src/com/intellij/openapi/editor/actionSystem/TypedAction.java +++ b/platform/platform-api/src/com/intellij/openapi/editor/actionSystem/TypedAction.java @@ -172,7 +172,7 @@ class FreezeLogger { private static final Logger LOG = Logger.getInstance(FreezeLogger.class); private static final Alarm ALARM = new Alarm(Alarm.ThreadToUse.POOLED_THREAD, Disposer.newDisposable()); - private static final int MAX_ALLOWED_TIME = 1000; + private static final int MAX_ALLOWED_TIME = 500; public static void runUnderPerformanceMonitor(Runnable action) { ALARM.cancelAllRequests(); @@ -187,7 +187,12 @@ class FreezeLogger { } private static void dumpThreads() { - LOG.error("Slow typing report, thread dumps attached", ThreadDumper.dumpThreadsToString()); + String dumps = ThreadDumper.dumpThreadsToString(); + String msg = "Typing freeze report, thread dumps attached. EDT stacktrace:\n" + + ThreadDumper.dumpEdtStackTrace() + + "\n\n\n"; + + LOG.error(msg, dumps); } } \ No newline at end of file diff --git a/platform/util/src/com/intellij/diagnostic/ThreadDumper.java b/platform/util/src/com/intellij/diagnostic/ThreadDumper.java index 99bb7f19c202..12b3e7e09535 100644 --- a/platform/util/src/com/intellij/diagnostic/ThreadDumper.java +++ b/platform/util/src/com/intellij/diagnostic/ThreadDumper.java @@ -41,6 +41,18 @@ public class ThreadDumper { dumpThreadsToFile(ManagementFactory.getThreadMXBean(), writer); return writer.toString(); } + + @NotNull + public static String dumpEdtStackTrace() { + ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); + ThreadInfo[] threads = sort(threadMXBean.dumpAllThreads(false, false)); + StringWriter writer = new StringWriter(); + if (threads.length > 0) { + StackTraceElement[] trace = threads[0].getStackTrace(); + printStackTrace(writer, trace); + } + return writer.toString(); + } @NotNull public static ThreadDump getThreadDumpInfo(@NotNull final ThreadMXBean threadMXBean) { @@ -128,10 +140,19 @@ public class ThreadDumper { } f.write(sb + "\n"); + printStackTrace(f, stackTraceElements); + f.write("\n"); + } + catch (IOException e) { + throw new RuntimeException(e); + } + } + + private static void printStackTrace(@NotNull Writer f, @NotNull StackTraceElement[] stackTraceElements) { + try { for (StackTraceElement element : stackTraceElements) { f.write("\tat " + element.toString() + "\n"); } - f.write("\n"); } catch (IOException e) { throw new RuntimeException(e);