From 78a7e65a2d64f27186f89b7dd04a8b3f32150f5f Mon Sep 17 00:00:00 2001 From: Skylot Date: Wed, 25 Mar 2015 22:18:27 +0300 Subject: [PATCH] core: filter out java core classes from printed stacktraces --- .../src/main/java/jadx/core/utils/Utils.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/jadx-core/src/main/java/jadx/core/utils/Utils.java b/jadx-core/src/main/java/jadx/core/utils/Utils.java index 9ac9609a0..e50b7aa23 100644 --- a/jadx-core/src/main/java/jadx/core/utils/Utils.java +++ b/jadx-core/src/main/java/jadx/core/utils/Utils.java @@ -1,11 +1,16 @@ package jadx.core.utils; +import jadx.api.JadxDecompiler; + import java.io.PrintWriter; import java.io.StringWriter; +import java.util.Arrays; import java.util.Iterator; public class Utils { + public static final String JADX_API_PACKAGE = JadxDecompiler.class.getPackage().getName(); + private Utils() { } @@ -90,10 +95,41 @@ public class Utils { } StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw, true); + filterRecursive(throwable); throwable.printStackTrace(pw); return sw.getBuffer().toString(); } + private static void filterRecursive(Throwable th) { + try { + filter(th); + } catch (Exception e) { + // ignore filter exceptions + } + Throwable cause = th.getCause(); + if (cause != null) { + filterRecursive(cause); + } + } + + private static void filter(Throwable th) { + StackTraceElement[] stackTrace = th.getStackTrace(); + int cutIndex = -1; + int length = stackTrace.length; + for (int i = 0; i < length; i++) { + StackTraceElement stackTraceElement = stackTrace[i]; + if (stackTraceElement.getClassName().startsWith(JADX_API_PACKAGE)) { + cutIndex = i; + } else if (cutIndex > 0) { + cutIndex = i; + break; + } + } + if (cutIndex > 0 && cutIndex < length) { + th.setStackTrace(Arrays.copyOfRange(stackTrace, 0, cutIndex)); + } + } + public static int compare(int x, int y) { return x < y ? -1 : x == y ? 0 : 1; }