String (@NotNull Throwable aThrowable, @NotNull String stackFrameSkipPattern) { final String prefix = "\tat "; final String prefixProxy = prefix + "$Proxy"; final String prefixRemoteUtil = prefix + "com.intellij.execution.rmi.RemoteUtil"; final String skipPattern = prefix + stackFrameSkipPattern; final StringWriter stringWriter = new StringWriter(); final PrintWriter writer = new PrintWriter(stringWriter) { private boolean skipping; private boolean newLine; @Override public void print(String x) { if (x == null) return; boolean curSkipping = skipping; if (!skipping && x.startsWith(skipPattern)) curSkipping = true; else if (skipping && !x.startsWith(prefix)) curSkipping = false; if (curSkipping) { if (!skipping) { super.print("\tin " + stripPackage(x, skipPattern.length())); newLine = true; } skipping = !x.startsWith(prefixRemoteUtil); } else if (!x.startsWith(prefixProxy)) { super.print(x); newLine = true; } skipping = curSkipping; } @Override public void println() { if (newLine) { newLine = false; super.println(); } } }; aThrowable.printStackTrace(writer); return stringWriter.toString(); }