diff options
-rw-r--r-- | main/build/MacOSX/monostub.mm | 6 | ||||
-rw-r--r-- | main/src/addins/MacPlatform/MacPlatform.cs | 12 | ||||
-rw-r--r-- | main/tests/MacPlatform.Tests/MacPlatformTest.cs | 6 |
3 files changed, 21 insertions, 3 deletions
diff --git a/main/build/MacOSX/monostub.mm b/main/build/MacOSX/monostub.mm index bab07f5967..57424d4ef3 100644 --- a/main/build/MacOSX/monostub.mm +++ b/main/build/MacOSX/monostub.mm @@ -227,6 +227,12 @@ load_xammac() XAMARIN_CREATE_CLASSES (); } + void *ptr = dlsym(libxammac, "xamarin_marshal_objectivec_exception_mode"); + *(int*)ptr = 2; // MarshalObjectiveCExceptionModeThrowManagedException + + ptr = dlsym(libxammac, "xamarin_marshal_managed_exception_mode"); + *(int*)ptr = 2; // MarshalManagedExceptionModeThrowObjectiveCException + return libxammac; } diff --git a/main/src/addins/MacPlatform/MacPlatform.cs b/main/src/addins/MacPlatform/MacPlatform.cs index 0f79d87179..989ad03ff5 100644 --- a/main/src/addins/MacPlatform/MacPlatform.cs +++ b/main/src/addins/MacPlatform/MacPlatform.cs @@ -287,6 +287,18 @@ namespace MonoDevelop.MacIntegration { oldHandler = NSGetUncaughtExceptionHandler (); NSSetUncaughtExceptionHandler (uncaughtHandler); + + ObjCRuntime.Runtime.MarshalManagedException += (sender, args) => { + LoggingService.LogInternalError (args.Exception); + }; + + ObjCRuntime.Runtime.MarshalObjectiveCException += (sender, args) => { + try { + throw new MarshalledObjCException (args.Exception); + } catch (MarshalledObjCException e) { + LoggingService.LogInternalError ("MarshalObjCException", e); + } + }; } public override Xwt.Toolkit LoadNativeToolkit () diff --git a/main/tests/MacPlatform.Tests/MacPlatformTest.cs b/main/tests/MacPlatform.Tests/MacPlatformTest.cs index e5a415f5af..4e06e884c7 100644 --- a/main/tests/MacPlatform.Tests/MacPlatformTest.cs +++ b/main/tests/MacPlatform.Tests/MacPlatformTest.cs @@ -181,7 +181,7 @@ namespace MacPlatform.Tests public void CriticalErrorsExceptionsHaveFullStacktracesInLog () { var logger = new CapturingLogger { - EnabledLevel = EnabledLoggingLevel.Fatal, + EnabledLevel = EnabledLoggingLevel.Error, }; try { @@ -192,7 +192,7 @@ namespace MacPlatform.Tests Assert.Throws<ObjCException> (() => void_objc_msgSend (ex.Handle, selector)); - var (_, message) = logger.LogMessages.Single (x => x.Level == LogLevel.Fatal); + var (_, message) = logger.LogMessages.Single (x => x.Level == LogLevel.Error); AssertMacPlatformStacktrace (message); } finally { LoggingService.RemoveLogger (logger.Name); @@ -203,7 +203,7 @@ namespace MacPlatform.Tests { Assert.That (stacktrace, Contains.Substring ("at MonoDevelopProcessHost.Main")); Assert.That (stacktrace, Contains.Substring ("at MacPlatform.Tests.MacPlatformTest.void_objc_msgSend")); - Assert.That (stacktrace, Contains.Substring ("at MonoDevelop.MacIntegration.MacPlatformService.HandleUncaughtException")); + Assert.That (stacktrace, Contains.Substring ("at MonoDevelop.MacIntegration.MacPlatformService+MarshalledObjCException..ctor")); } |