diff --git a/src/Mono.Android/Android.Runtime/JNIEnv.cs b/src/Mono.Android/Android.Runtime/JNIEnv.cs index 660d6bb3686..4cb6c9fb0dc 100644 --- a/src/Mono.Android/Android.Runtime/JNIEnv.cs +++ b/src/Mono.Android/Android.Runtime/JNIEnv.cs @@ -237,18 +237,10 @@ static void ManualJavaObjectDispose (Java.Lang.Object obj) GC.SuppressFinalize (obj); } - static Action mono_unhandled_exception = null!; static Action AppDomain_DoUnhandledException = null!; static void Initialize () { - if (mono_unhandled_exception == null) { - var mono_UnhandledException = typeof (System.Diagnostics.Debugger) - .GetMethod ("Mono_UnhandledException", BindingFlags.NonPublic | BindingFlags.Static); - if (mono_UnhandledException != null) - mono_unhandled_exception = (Action) Delegate.CreateDelegate (typeof(Action), mono_UnhandledException); - } - if (AppDomain_DoUnhandledException == null) { var ad_due = typeof (AppDomain) .GetMethod ("DoUnhandledException", @@ -276,10 +268,6 @@ internal static void PropagateUncaughtException (IntPtr env, IntPtr javaThreadPt var javaException = JavaObject.GetObject (env, javaExceptionPtr, JniHandleOwnership.DoNotTransfer)!; - // Disabled until Linker error surfaced in https://github.com/xamarin/xamarin-android/pull/4302#issuecomment-596400025 is resolved - //System.Diagnostics.Debugger.Mono_UnhandledException (javaException); - mono_unhandled_exception?.Invoke (javaException); - try { var jltp = javaException as JavaProxyThrowable; Exception? innerException = jltp?.InnerException; diff --git a/src/Mono.Android/Android.Runtime/JNINativeWrapper.cs b/src/Mono.Android/Android.Runtime/JNINativeWrapper.cs index eab1f812555..f8356023221 100644 --- a/src/Mono.Android/Android.Runtime/JNINativeWrapper.cs +++ b/src/Mono.Android/Android.Runtime/JNINativeWrapper.cs @@ -7,7 +7,6 @@ namespace Android.Runtime { public static class JNINativeWrapper { - static MethodInfo? mono_unhandled_exception_method; static MethodInfo? exception_handler_method; static MethodInfo? wait_for_bridge_processing_method; @@ -15,12 +14,6 @@ static void get_runtime_types () { if (exception_handler_method != null) return; -#if MONOANDROID1_0 - mono_unhandled_exception_method = typeof (System.Diagnostics.Debugger).GetMethod ( - "Mono_UnhandledException", BindingFlags.NonPublic | BindingFlags.Static); - if (mono_unhandled_exception_method == null) - AndroidEnvironment.FailFast ("Cannot find System.Diagnostics.Debugger.Mono_UnhandledException"); -#endif exception_handler_method = typeof (AndroidEnvironment).GetMethod ( "UnhandledException", BindingFlags.NonPublic | BindingFlags.Static); if (exception_handler_method == null) @@ -58,35 +51,34 @@ public static Delegate CreateDelegate (Delegate dlg) ig.Emit (OpCodes.Call, wait_for_bridge_processing_method!); - var label = ig.BeginExceptionBlock (); - - for (int i = 0; i < param_types.Length; i++) - ig.Emit (OpCodes.Ldarg, i); - ig.Emit (OpCodes.Call, dlg.Method); + bool filter = Debugger.IsAttached || !JNIEnv.PropagateExceptions; + if (!filter) { + var label = ig.BeginExceptionBlock (); - if (retval != null) - ig.Emit (OpCodes.Stloc, retval); + for (int i = 0; i < param_types.Length; i++) + ig.Emit (OpCodes.Ldarg, i); + ig.Emit (OpCodes.Call, dlg.Method); - ig.Emit (OpCodes.Leave, label); + if (retval != null) + ig.Emit (OpCodes.Stloc, retval); - bool filter = Debugger.IsAttached || !JNIEnv.PropagateExceptions; - if (filter && mono_unhandled_exception_method != null) { - ig.BeginExceptFilterBlock (); + ig.Emit (OpCodes.Leave, label); - ig.Emit (OpCodes.Call, mono_unhandled_exception_method); - ig.Emit (OpCodes.Ldc_I4_1); - ig.BeginCatchBlock (null!); - } else { ig.BeginCatchBlock (typeof (Exception)); - } - ig.Emit (OpCodes.Dup); - ig.Emit (OpCodes.Call, exception_handler_method!); + ig.Emit (OpCodes.Dup); + ig.Emit (OpCodes.Call, exception_handler_method!); - if (filter) - ig.Emit (OpCodes.Throw); + ig.EndExceptionBlock (); + } + else { //let the debugger handle the exception + for (int i = 0; i < param_types.Length; i++) + ig.Emit (OpCodes.Ldarg, i); + ig.Emit (OpCodes.Call, dlg.Method); - ig.EndExceptionBlock (); + if (retval != null) + ig.Emit (OpCodes.Stloc, retval); + } if (retval != null) ig.Emit (OpCodes.Ldloc, retval); diff --git a/src/Mono.Android/Android.Runtime/UncaughtExceptionHandler.cs b/src/Mono.Android/Android.Runtime/UncaughtExceptionHandler.cs index a2fbb29a64e..c602650ef47 100644 --- a/src/Mono.Android/Android.Runtime/UncaughtExceptionHandler.cs +++ b/src/Mono.Android/Android.Runtime/UncaughtExceptionHandler.cs @@ -7,8 +7,6 @@ namespace Android.Runtime { sealed class UncaughtExceptionHandler : Java.Lang.Object, Java.Lang.Thread.IUncaughtExceptionHandler { - Action? mono_unhandled_exception; - Action? AppDomain_DoUnhandledException; Java.Lang.Thread.IUncaughtExceptionHandler defaultHandler; @@ -30,7 +28,6 @@ public void UncaughtException (Java.Lang.Thread thread, Java.Lang.Throwable ex) Android.Runtime.AndroidEnvironment.FailFast ($"Unable to initialize UncaughtExceptionHandler. Nested exception caught: {e}"); } - mono_unhandled_exception! (ex); if (AppDomain_DoUnhandledException != null) { try { var jltp = ex as JavaProxyThrowable; @@ -48,11 +45,6 @@ public void UncaughtException (Java.Lang.Thread thread, Java.Lang.Throwable ex) void Initialize () { - if (mono_unhandled_exception == null) { - var mono_UnhandledException = typeof (System.Diagnostics.Debugger) - .GetMethod ("Mono_UnhandledException", BindingFlags.NonPublic | BindingFlags.Static); - mono_unhandled_exception = (Action) Delegate.CreateDelegate (typeof(Action), mono_UnhandledException); - } if (AppDomain_DoUnhandledException == null) { var ad_due = typeof (AppDomain)