diff --git a/core/linux-dist/main.cpp b/core/linux-dist/main.cpp index 129bf1822..79ec2d938 100644 --- a/core/linux-dist/main.cpp +++ b/core/linux-dist/main.cpp @@ -312,8 +312,6 @@ int main(int argc, char* argv[]) //appletSetFocusHandlingMode(AppletFocusHandlingMode_NoSuspend); #endif #if defined(USE_BREAKPAD) - auto async = std::async(std::launch::async, uploadCrashes, "/tmp"); - google_breakpad::MinidumpDescriptor descriptor("/tmp"); google_breakpad::ExceptionHandler eh(descriptor, nullptr, dumpCallback, nullptr, true, -1); #endif @@ -345,6 +343,10 @@ int main(int argc, char* argv[]) if (flycast_init(argc, argv)) die("Flycast initialization failed\n"); +#if defined(USE_BREAKPAD) + auto async = std::async(std::launch::async, uploadCrashes, "/tmp"); +#endif + mainui_loop(); #if defined(SUPPORT_X11) diff --git a/core/rend/gui.cpp b/core/rend/gui.cpp index 0b0026ce1..b7c2523b5 100644 --- a/core/rend/gui.cpp +++ b/core/rend/gui.cpp @@ -2279,13 +2279,6 @@ static void gui_display_settings() ImGui::Text("Driver Name: %s", GraphicsContext::Instance()->getDriverName().c_str()); ImGui::Text("Version: %s", GraphicsContext::Instance()->getDriverVersion().c_str()); -#ifdef __ANDROID__ - ImGui::Separator(); - if (ImGui::Button("Send Logs")) { - void android_send_logs(); - android_send_logs(); - } -#endif ImGui::PopStyleVar(); ImGui::EndTabItem(); } diff --git a/core/windows/winmain.cpp b/core/windows/winmain.cpp index 0d6d203a8..aa751509e 100644 --- a/core/windows/winmain.cpp +++ b/core/windows/winmain.cpp @@ -873,12 +873,6 @@ int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi wchar_t tempDir[MAX_PATH + 1]; GetTempPathW(MAX_PATH + 1, tempDir); - nowide::stackstring nws; - static std::string tempDir8; - if (nws.convert(tempDir)) - tempDir8 = nws.c_str(); - auto async = std::async(std::launch::async, uploadCrashes, tempDir8); - static google_breakpad::CustomInfoEntry custom_entries[] = { google_breakpad::CustomInfoEntry(L"prod", L"Flycast"), google_breakpad::CustomInfoEntry(L"ver", L"" GIT_VERSION), @@ -909,6 +903,14 @@ int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi if (flycast_init(argc, argv) != 0) die("Flycast initialization failed"); +#ifdef USE_BREAKPAD + nowide::stackstring nws; + static std::string tempDir8; + if (nws.convert(tempDir)) + tempDir8 = nws.c_str(); + auto async = std::async(std::launch::async, uploadCrashes, tempDir8); +#endif + #ifdef TARGET_UWP if (config::ContentPath.get().empty()) config::ContentPath.get().push_back(get_writable_config_path("")); diff --git a/shell/android-studio/flycast/src/main/java/com/reicast/emulator/BaseGLActivity.java b/shell/android-studio/flycast/src/main/java/com/reicast/emulator/BaseGLActivity.java index 320b79b2c..12a4cd9b2 100644 --- a/shell/android-studio/flycast/src/main/java/com/reicast/emulator/BaseGLActivity.java +++ b/shell/android-studio/flycast/src/main/java/com/reicast/emulator/BaseGLActivity.java @@ -27,7 +27,6 @@ import androidx.annotation.Nullable; import androidx.core.app.ActivityCompat; import com.reicast.emulator.config.Config; -import com.reicast.emulator.debug.GenerateLogs; import com.reicast.emulator.emu.AudioBackend; import com.reicast.emulator.emu.HttpClient; import com.reicast.emulator.emu.JNIdc; @@ -407,27 +406,5 @@ public abstract class BaseGLActivity extends Activity implements ActivityCompat. } } - // Called from native code - protected void generateErrorLog() { - try { - new GenerateLogs(this).execute(getFilesDir().getAbsolutePath()); - } catch (RuntimeException e) { - AlertDialog.Builder dlgAlert = new AlertDialog.Builder(this); - dlgAlert.setMessage("An error occurred retrieving the log file:\n\n" - + e.getMessage()); - dlgAlert.setTitle("Flycast Error"); - dlgAlert.setPositiveButton("Ok", - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog,int id) { - dialog.cancel(); - } - }); - dlgAlert.setIcon(android.R.drawable.ic_dialog_info); - dlgAlert.setCancelable(false); - dlgAlert.create().show(); - } - } - private static native void register(BaseGLActivity activity); } diff --git a/shell/android-studio/flycast/src/main/java/com/reicast/emulator/debug/GenerateLogs.java b/shell/android-studio/flycast/src/main/java/com/reicast/emulator/debug/GenerateLogs.java deleted file mode 100644 index df244a4e2..000000000 --- a/shell/android-studio/flycast/src/main/java/com/reicast/emulator/debug/GenerateLogs.java +++ /dev/null @@ -1,207 +0,0 @@ -package com.reicast.emulator.debug; - -import android.content.Context; -import android.content.Intent; -import android.net.Uri; -import android.os.AsyncTask; -import android.os.Build; - -import com.reicast.emulator.config.Config; - -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.lang.ref.WeakReference; - -public class GenerateLogs extends AsyncTask { - private WeakReference mContext; - - private static final String build_device = android.os.Build.DEVICE; - private static final String build_board = android.os.Build.BOARD; - private static final int build_sdk = android.os.Build.VERSION.SDK_INT; - - private static final String DN = "Donut"; - private static final String EC = "Eclair"; - private static final String FR = "Froyo"; - private static final String GB = "Gingerbread"; - private static final String HC = "Honeycomb"; - private static final String IC = "Ice Cream Sandwich"; - private static final String JB = "JellyBean"; - private static final String KK = "KitKat"; - private static final String LL = "Lollipop"; - private static final String MM = "Marshmallow"; - private static final String NT = "Nougat"; - private static final String NL = "New / No Label"; - private static final String NF = "Not Found"; - - private String currentTime; - private String unHandledIOE; - - public GenerateLogs(Context reference) { - this.mContext = new WeakReference<>(reference); - this.currentTime = String.valueOf(System.currentTimeMillis()); - } - - /** - * Obtain the specific parameters of the current device - * - */ - private String discoverCPUData() { - String s = "MODEL: " + Build.MODEL; - s += "\r\n"; - s += "DEVICE: " + build_device; - s += "\r\n"; - s += "BOARD: " + build_board; - s += "\r\n"; - if (!String.valueOf(build_sdk).equals("")) { - String build_version = NF; - if (String.valueOf(build_sdk).equals("L")) { - build_version = "LP"; - } else if (build_sdk >= 4 && build_sdk < 7) { - build_version = DN; - } else if (build_sdk == 7) { - build_version = EC; - } else if (build_sdk == 8) { - build_version = FR; - } else if (build_sdk >= 9 && build_sdk < 11) { - build_version = GB; - } else if (build_sdk >= 11 && build_sdk < 14) { - build_version = HC; - } else if (build_sdk >= 14 && build_sdk < 16) { - build_version = IC; - } else if (build_sdk >= 16 && build_sdk < 19) { - build_version = JB; - } else if (build_sdk >= 19 && build_sdk < 21) { - build_version = KK; - } else if (build_sdk >= 21 && build_sdk < 23) { - build_version = LL; - } else if (build_sdk >= 23 && build_sdk < 24) { - build_version = MM; - } else if (build_sdk >= 24 && build_sdk < 26) { - build_version = NT; - } else if (build_sdk >= 26 && build_sdk < 28) { - build_version = "Oreo"; - } else if (build_sdk == 28) { - build_version = "Pie"; - } else if (build_sdk > 28) { - build_version = NL; - } - s += build_version + " (" + build_sdk + ")"; - } else { - String prop_build_version = "ro.build.version.release"; - String prop_sdk_version = "ro.build.version.sdk"; - String build_version = readOutput("/system/bin/getprop " - + prop_build_version); - String sdk_version = readOutput("/system/bin/getprop " - + prop_sdk_version); - s += build_version + " (" + sdk_version + ")"; - } - return s; - } - - /** - * Read the output of a shell command - * - * @param command - * The shell command being issued to the terminal - */ - public static String readOutput(String command) { - try { - Process p = Runtime.getRuntime().exec(command); - InputStream is = null; - if (p.waitFor() == 0) { - is = p.getInputStream(); - } else { - is = p.getErrorStream(); - } - BufferedReader br = new BufferedReader(new InputStreamReader(is), - 2048); - String line = br.readLine(); - br.close(); - return line; - } catch (Exception ex) { - return "ERROR: " + ex.getMessage(); - } - } - - public void setUnhandled(String unHandledIOE) { - this.unHandledIOE = unHandledIOE; - } - - @Override - protected String doInBackground(String... params) { - File logFile = new File(params[0], currentTime + ".txt"); - Process mLogcatProc = null; - BufferedReader reader = null; - final StringBuilder log = new StringBuilder(); - String separator = System.getProperty("line.separator"); - log.append(discoverCPUData()); - if (unHandledIOE != null) { - log.append(separator); - log.append(separator); - log.append("Unhandled Exceptions"); - log.append(separator); - log.append(separator); - log.append(unHandledIOE); - } - try { - String line; - mLogcatProc = Runtime.getRuntime().exec( - new String[] { "logcat", "-ds", "reicast:V" }); - reader = new BufferedReader(new InputStreamReader( - mLogcatProc.getInputStream())); - log.append(separator); - log.append(separator); - log.append("Native Interface Output"); - log.append(separator); - log.append(separator); - while ((line = reader.readLine()) != null) { - log.append(line); - log.append(separator); - } - reader.close(); - File memory = new File(mContext.get().getFilesDir(), "mem_alloc.txt"); - if (memory.exists()) { - log.append(separator); - log.append(separator); - log.append("Memory Allocation Table"); - log.append(separator); - log.append(separator); - FileInputStream fis = new FileInputStream(memory); - reader = new BufferedReader(new InputStreamReader(fis)); - while ((line = reader.readLine()) != null) { - log.append(line); - log.append(separator); - } - fis.close(); - reader.close(); - } - BufferedWriter writer = new BufferedWriter(new FileWriter(logFile)); - writer.write(log.toString()); - writer.flush(); - writer.close(); - return log.toString(); - } catch (IOException e) { - // Could not generate log file - // Writing a log is redundant - } - return null; - } - - @Override - protected void onPostExecute(final String response) { - if (response != null) { - android.content.ClipboardManager clipboard = (android.content.ClipboardManager) mContext.get() - .getSystemService(Context.CLIPBOARD_SERVICE); - android.content.ClipData clip = android.content.ClipData.newPlainText("logcat", response); - clipboard.setPrimaryClip(clip); - Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(Config.git_issues)); - mContext.get().startActivity(browserIntent); - } - } -} diff --git a/shell/android-studio/flycast/src/main/jni/src/Android.cpp b/shell/android-studio/flycast/src/main/jni/src/Android.cpp index 09e743074..72bdec5d6 100644 --- a/shell/android-studio/flycast/src/main/jni/src/Android.cpp +++ b/shell/android-studio/flycast/src/main/jni/src/Android.cpp @@ -189,10 +189,6 @@ extern "C" JNIEXPORT jstring JNICALL Java_com_reicast_emulator_emu_JNIdc_initEnv std::string path(jchar); env->ReleaseStringUTFChars(directory, jchar); - static std::string crashPath; - static cThread uploadThread(uploadCrashThread, &crashPath); - crashPath = path; - uploadThread.Start(); google_breakpad::MinidumpDescriptor descriptor(path); exceptionHandler = new google_breakpad::ExceptionHandler(descriptor, nullptr, dumpCallback, nullptr, true, -1); @@ -243,6 +239,16 @@ extern "C" JNIEXPORT jstring JNICALL Java_com_reicast_emulator_emu_JNIdc_initEnv int rc = flycast_init(0, NULL); if (rc == -1) msg = env->NewStringUTF("Memory initialization failed"); +#ifdef USE_BREAKPAD + else + { + static std::string crashPath; + static cThread uploadThread(uploadCrashThread, &crashPath); + crashPath = get_writable_config_path(""); + uploadThread.Start(); + } +#endif + return msg; } else @@ -662,13 +668,6 @@ void vjoy_stop_editing(bool canceled) jvm_attacher.getEnv()->CallVoidMethod(g_activity, VJoyStopEditingMID, canceled); } -void android_send_logs() -{ - JNIEnv *env = jvm_attacher.getEnv(); - jmethodID generateErrorLogMID = env->GetMethodID(env->GetObjectClass(g_activity), "generateErrorLog", "()V"); - env->CallVoidMethod(g_activity, generateErrorLogMID); -} - extern "C" JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_setButtons(JNIEnv *env, jobject obj, jbyteArray data) { u32 len = env->GetArrayLength(data); diff --git a/shell/apple/emulator-osx/emulator-osx/SDLMain.mm b/shell/apple/emulator-osx/emulator-osx/SDLMain.mm index 6a7240224..7f95808ee 100644 --- a/shell/apple/emulator-osx/emulator-osx/SDLMain.mm +++ b/shell/apple/emulator-osx/emulator-osx/SDLMain.mm @@ -8,7 +8,6 @@ #include "SDLMain.h" #include /* for MAXPATHLEN */ #include -#include #include "rend/gui.h" #include "oslib/oslib.h" @@ -310,8 +309,6 @@ static bool dumpCallback(const char *dump_dir, const char *minidump_id, void *co - (void) applicationDidFinishLaunching: (NSNotification *) note { #ifdef USE_BREAKPAD - auto async = std::async(std::launch::async, uploadCrashes, "/tmp"); - google_breakpad::ExceptionHandler eh("/tmp", NULL, dumpCallback, NULL, true, NULL); task_set_exception_ports(mach_task_self(), EXC_MASK_BAD_ACCESS, MACH_PORT_NULL, EXCEPTION_DEFAULT, 0); #endif diff --git a/shell/apple/emulator-osx/emulator-osx/osx-main.mm b/shell/apple/emulator-osx/emulator-osx/osx-main.mm index d9f5a8725..e7a45c8db 100644 --- a/shell/apple/emulator-osx/emulator-osx/osx-main.mm +++ b/shell/apple/emulator-osx/emulator-osx/osx-main.mm @@ -21,6 +21,7 @@ #include "oslib/oslib.h" #include "emulator.h" #include "rend/mainui.h" +#include int darw_printf(const char* text, ...) { @@ -135,6 +136,9 @@ extern "C" int SDL_main(int argc, char *argv[]) CFRelease(mainBundle); emu_flycast_init(); +#ifdef USE_BREAKPAD + auto async = std::async(std::launch::async, uploadCrashes, "/tmp"); +#endif mainui_loop();