Added new context providers and fixed bugs

- RAMContextProvider
- JavaVersionContextProvider
- OpenALContextProvider
- ArgsContextProvider 
- LanguageContextProvider
This commit is contained in:
Sergey Karmanov 2020-11-24 20:32:45 +03:00
parent 65bb5339c7
commit 6d6e0f6ca4
7 changed files with 158 additions and 5 deletions

View File

@ -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());
});

View File

@ -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<String, String> 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();
}
}

View File

@ -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<String, String> 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";
}
}

View File

@ -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<String, String> 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";
}
}

View File

@ -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<String, String> output) {
output.put("Language", Localizer.getInstance().getLanguage());
}
@Override
public String getName() {
return "Language Context Provider";
}
}

View File

@ -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<String, String> output) {
output.put("OpenAL version", AudioManager.ALversion());
}
@Override
public String getName() {
return "Audio Context Provider";
}
}

View File

@ -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<String, String> 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";
}
}