From 6d6e0f6ca4f293e80a389ddcd5922362ddd79f83 Mon Sep 17 00:00:00 2001 From: serega404 Date: Tue, 24 Nov 2020 20:32:45 +0300 Subject: [PATCH] Added new context providers and fixed bugs - RAMContextProvider - JavaVersionContextProvider - OpenALContextProvider - ArgsContextProvider - LanguageContextProvider --- .../progressia/ProgressiaLauncher.java | 13 ++++++- .../common/util/crash/CrashReports.java | 35 ++++++++++++++++--- .../crash/providers/ArgsContextProvider.java | 27 ++++++++++++++ .../providers/JavaVersionContextProvider.java | 29 +++++++++++++++ .../providers/LanguageContextProvider.java | 19 ++++++++++ .../providers/OpenALContextProvider.java | 19 ++++++++++ .../crash/providers/RAMContextProvider.java | 21 +++++++++++ 7 files changed, 158 insertions(+), 5 deletions(-) create mode 100644 src/main/java/ru/windcorp/progressia/common/util/crash/providers/ArgsContextProvider.java create mode 100644 src/main/java/ru/windcorp/progressia/common/util/crash/providers/JavaVersionContextProvider.java create mode 100644 src/main/java/ru/windcorp/progressia/common/util/crash/providers/LanguageContextProvider.java create mode 100644 src/main/java/ru/windcorp/progressia/common/util/crash/providers/OpenALContextProvider.java create mode 100644 src/main/java/ru/windcorp/progressia/common/util/crash/providers/RAMContextProvider.java diff --git a/src/main/java/ru/windcorp/progressia/ProgressiaLauncher.java b/src/main/java/ru/windcorp/progressia/ProgressiaLauncher.java index f9dbaba..3a4608c 100644 --- a/src/main/java/ru/windcorp/progressia/ProgressiaLauncher.java +++ b/src/main/java/ru/windcorp/progressia/ProgressiaLauncher.java @@ -19,18 +19,29 @@ package ru.windcorp.progressia; import ru.windcorp.progressia.common.util.crash.CrashReports; import ru.windcorp.progressia.common.util.crash.analyzers.OutOfMemoryAnalyzer; -import ru.windcorp.progressia.common.util.crash.providers.OSContextProvider; +import ru.windcorp.progressia.common.util.crash.providers.*; public class ProgressiaLauncher { + public static String[] arguments; + public static void launch(String[] args, Proxy proxy) { + arguments = args.clone(); setupCrashReports(); proxy.initialize(); } private static void setupCrashReports() { + // Context providers CrashReports.registerProvider(new OSContextProvider()); + CrashReports.registerProvider(new RAMContextProvider()); + CrashReports.registerProvider(new JavaVersionContextProvider()); + CrashReports.registerProvider(new OpenALContextProvider()); + CrashReports.registerProvider(new ArgsContextProvider()); + CrashReports.registerProvider(new LanguageContextProvider()); + // Analyzers CrashReports.registerAnalyzer(new OutOfMemoryAnalyzer()); + Thread.setDefaultUncaughtExceptionHandler((Thread thread, Throwable t)-> { CrashReports.report(t,"Uncaught exception in thread %s", thread.getName()); }); diff --git a/src/main/java/ru/windcorp/progressia/common/util/crash/CrashReports.java b/src/main/java/ru/windcorp/progressia/common/util/crash/CrashReports.java index d096176..6f07779 100644 --- a/src/main/java/ru/windcorp/progressia/common/util/crash/CrashReports.java +++ b/src/main/java/ru/windcorp/progressia/common/util/crash/CrashReports.java @@ -94,14 +94,12 @@ public class CrashReports { provider.provideContext(buf); if (!buf.isEmpty()) { - output.append("Provider name: ").append(provider.getName()).append("\n"); + output.append(StringUtilsTemp.center(provider.getName(), 80)).append("\n"); for (Map.Entry entry : buf.entrySet()) { output.append(entry.getKey()).append(": ").append(entry.getValue()).append("\n"); } } } catch (Throwable t) { - output.append("\n"); - String providerName; try { @@ -123,6 +121,10 @@ public class CrashReports { // Do a local copy to avoid deadlocks -OLEGSHA Analyzer[] localAnalyzersCopy = ANALYZERS.toArray(new Analyzer[ANALYZERS.size()]); + if (localAnalyzersCopy.length > 0) { + output.append(StringUtilsTemp.center("Analyzers", 80)).append("\n"); + } + for (Analyzer analyzer : localAnalyzersCopy) { if (analyzer == null) continue; @@ -157,7 +159,11 @@ public class CrashReports { } private static void appendMessageFormat(StringBuilder output, String messageFormat, Object... arg) { - output.append("Provided description: \n").append(String.format(messageFormat, arg)).append("\n"); + output.append("Provided description: \n"); + if (messageFormat.isEmpty()) + output.append("none").append("\n"); + else + output.append(String.format(messageFormat, arg)).append("\n"); addSeparator(output); } @@ -228,3 +234,24 @@ public class CrashReports { sb.append(StringUtil.sequence('-', 80)).append("\n"); } } + +class StringUtilsTemp { + public static String center(String s, int size) { + return center(s, size, ' '); + } + + public static String center(String s, int size, char pad) { + if (s == null || size <= s.length()) + return s; + + StringBuilder sb = new StringBuilder(size); + for (int i = 0; i < (size - s.length()) / 2; i++) { + sb.append(pad); + } + sb.append(s); + while (sb.length() < size) { + sb.append(pad); + } + return sb.toString(); + } +} diff --git a/src/main/java/ru/windcorp/progressia/common/util/crash/providers/ArgsContextProvider.java b/src/main/java/ru/windcorp/progressia/common/util/crash/providers/ArgsContextProvider.java new file mode 100644 index 0000000..e7c9e64 --- /dev/null +++ b/src/main/java/ru/windcorp/progressia/common/util/crash/providers/ArgsContextProvider.java @@ -0,0 +1,27 @@ +package ru.windcorp.progressia.common.util.crash.providers; + +import ru.windcorp.progressia.Progressia; +import ru.windcorp.progressia.ProgressiaLauncher; +import ru.windcorp.progressia.common.util.crash.ContextProvider; + +import java.util.Map; + +public class ArgsContextProvider implements ContextProvider { + + @Override + public void provideContext(Map output) { + output.put("Number of arguments", ProgressiaLauncher.arguments.length + " total"); + if (ProgressiaLauncher.arguments.length > 0) { + StringBuilder buffer = new StringBuilder(); + for (String arg : ProgressiaLauncher.arguments) { + buffer.append(arg).append(";"); + } + output.put("Args", System.getProperty(buffer.toString())); + } + } + + @Override + public String getName() { + return "Arguments Context Provider"; + } +} diff --git a/src/main/java/ru/windcorp/progressia/common/util/crash/providers/JavaVersionContextProvider.java b/src/main/java/ru/windcorp/progressia/common/util/crash/providers/JavaVersionContextProvider.java new file mode 100644 index 0000000..fe96b0c --- /dev/null +++ b/src/main/java/ru/windcorp/progressia/common/util/crash/providers/JavaVersionContextProvider.java @@ -0,0 +1,29 @@ +package ru.windcorp.progressia.common.util.crash.providers; + +import ru.windcorp.progressia.common.util.crash.ContextProvider; + +import java.util.Map; + +public class JavaVersionContextProvider implements ContextProvider { + + @Override + public void provideContext(Map output) { + // JAVA + output.put("Java version", Runtime.version().toString()); + output.put("Java vendor", System.getProperty("java.vendor")); + output.put("Java home path", System.getProperty("java.home")); + // VM + output.put("JVM vendor", System.getProperty("java.vm.vendor")); + output.put("JVM name", System.getProperty("java.vm.name")); + output.put("JVM version", System.getProperty("java.vm.version")); + // Runtime + output.put("Java Runtime name", System.getProperty("java.runtime.name")); + output.put("Java Runtime version", System.getProperty("java.runtime.version")); + + } + + @Override + public String getName() { + return "Java Version Context Provider"; + } +} diff --git a/src/main/java/ru/windcorp/progressia/common/util/crash/providers/LanguageContextProvider.java b/src/main/java/ru/windcorp/progressia/common/util/crash/providers/LanguageContextProvider.java new file mode 100644 index 0000000..994504f --- /dev/null +++ b/src/main/java/ru/windcorp/progressia/common/util/crash/providers/LanguageContextProvider.java @@ -0,0 +1,19 @@ +package ru.windcorp.progressia.common.util.crash.providers; + +import ru.windcorp.progressia.client.localization.Localizer; +import ru.windcorp.progressia.common.util.crash.ContextProvider; + +import java.util.Map; + +public class LanguageContextProvider implements ContextProvider { + + @Override + public void provideContext(Map output) { + output.put("Language", Localizer.getInstance().getLanguage()); + } + + @Override + public String getName() { + return "Language Context Provider"; + } +} diff --git a/src/main/java/ru/windcorp/progressia/common/util/crash/providers/OpenALContextProvider.java b/src/main/java/ru/windcorp/progressia/common/util/crash/providers/OpenALContextProvider.java new file mode 100644 index 0000000..0f6d61d --- /dev/null +++ b/src/main/java/ru/windcorp/progressia/common/util/crash/providers/OpenALContextProvider.java @@ -0,0 +1,19 @@ +package ru.windcorp.progressia.common.util.crash.providers; + +import ru.windcorp.progressia.client.audio.AudioManager; +import ru.windcorp.progressia.common.util.crash.ContextProvider; + +import java.util.Map; + +public class OpenALContextProvider implements ContextProvider { + + @Override + public void provideContext(Map output) { + output.put("OpenAL version", AudioManager.ALversion()); + } + + @Override + public String getName() { + return "Audio Context Provider"; + } +} diff --git a/src/main/java/ru/windcorp/progressia/common/util/crash/providers/RAMContextProvider.java b/src/main/java/ru/windcorp/progressia/common/util/crash/providers/RAMContextProvider.java new file mode 100644 index 0000000..eb1934e --- /dev/null +++ b/src/main/java/ru/windcorp/progressia/common/util/crash/providers/RAMContextProvider.java @@ -0,0 +1,21 @@ +package ru.windcorp.progressia.common.util.crash.providers; + +import ru.windcorp.progressia.common.util.crash.ContextProvider; + +import java.util.Map; + +public class RAMContextProvider implements ContextProvider { + + @Override + public void provideContext(Map output) { + output.put("Max Memory", Long.toString(Runtime.getRuntime().maxMemory() / 1024 / 1024) + " MB"); + output.put("Total Memory", Long.toString(Runtime.getRuntime().totalMemory() / 1024 / 1024) + " MB"); + output.put("Free Memory", Long.toString(Runtime.getRuntime().freeMemory() / 1024 / 1024) + " MB"); + output.put("Used Memory", Long.toString((Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / 1024 / 1024) + " MB"); + } + + @Override + public String getName() { + return "RAM Context Provider"; + } +}