I have an application that uses monobjc, embedded under a Cocoa app. I have witnessed various timing/threading issues (.net exceptions, SIGSEGV | EXC_BAD_ACCESS signals etc) with variouse stacks, for example :
[NSRunloop run] //beginning ... //some framework code ... [NSDistantObject dealloc] ?? ?? //.net JIT compiled function addresses - the .net wrappers for NSObject dealloc, or NSProxy dealloc ?? [NSProxy isKindOfClass] ... //some native forwarding... ... [SIGSEGV handler / native exception handler] I'm attaching a real example at the end of this post. some facts : 1. The object for which the wrapper-dealloc is called on is NOT A .Net monobjc NSObject ! Are all objective-c native objects becoming "wrapped" just because we are using Monobjc ? 2. If the answer to the previous question is Yes (as it seems from my debugging session), I personally see it as a major flaw - bugs in monobjc shouldn't affect objects which the developer never intended to instanciate .Net managed wrappers for. 3. The code in the dealloc wrapper causes induces the use of Monitor.Enter, which in some occasions causes deadlocks (couldn't figure out why, didn't bother on debugging) 4. The code in the dealloc wrapper may run AFTER the native ptr is no longer valid for some reason, causing the native call to [self dealloc] to crash and burn with all kinds of nasty signals and shit. Removing the function "dealloc" in NSObject and NSProxy wrappers problems I've been trying to solve for two days. This, again, despite the fact that the objects causing the problem in the stack are not .net instances related to my managed embedded stack!, they are just regular, native, objective-c objects! A real example (crash report), in which u see WebKit (WebView embedded in my app) trying to release an object (note the command on line 10): Thread 0 Crashed: 0 libSystem.B.dylib 0x96f45b9e __kill + 10 1 libSystem.B.dylib 0x96fbcec2 raise + 26 2 libSystem.B.dylib 0x96fcc47f abort + 73 3 libmono.0.0.0.dylib 0x0078e999 mono_handle_native_sigsegv + 215 (mini-exceptions.c:1366) 4 libmono.0.0.0.dylib 0x00730ece sigsegv_signal_handler + 226 (mini.c:13441) 5 libSystem.B.dylib 0x96f4409b _sigtramp + 43 6 ??? 0xffffffff 0 + 4294967295 7 com.apple.CoreFoundation 0x921156bd ___forwarding___ + 237 8 com.apple.CoreFoundation 0x92115a12 _CF_forwarding_prep_0 + 50 9 com.apple.Foundation 0x937485a0 -[NSProxy isKindOfClass:] + 160 10 ??? 0x0304d567 0 + 50648423 // ----> somewhere along the ?? functions is Monobjc, trying to execute the managed wrapper function NSProxy.Dealloc()! 11 ??? 0x16d00436 0 + 382731318 12 ??? 0x16d0021e 0 + 382730782 13 ??? 0x16d001ac 0 + 382730668 14 ??? 0x02ad0bfa 0 + 44895226 15 com.apple.Foundation 0x93708695 -[NSDistantObject dealloc] + 117 16 com.apple.CoreFoundation 0x9202c823 CFBagApplyFunction + 131 17 com.apple.Foundation 0x93748094 invalidateConnection + 596 18 com.apple.Foundation 0x93747815 -[NSConnection invalidate] + 613 19 com.apple.Foundation 0x93740238 +[NSConnection _portInvalidated:] + 712 20 com.apple.Foundation 0x936c91da _nsnote_callback + 106 21 com.apple.CoreFoundation 0x92077aba __CFXNotificationPost + 362 22 com.apple.CoreFoundation 0x92077d93 _CFXNotificationPostNotification + 179 23 com.apple.Foundation 0x936c6440 -[NSNotificationCenter postNotificationName:object:userInfo:] + 128 24 com.apple.Foundation 0x93711c7a _NSPortDeathNotify + 106 25 com.apple.CoreFoundation 0x920723eb CFMachPortInvalidate + 219 26 com.apple.CoreFoundation 0x92072de6 __CFNotifyDeadMachPort + 294 27 com.apple.CoreFoundation 0x92072635 __CFMachPortPerform + 117 28 com.apple.CoreFoundation 0x92096908 CFRunLoopRunSpecific + 3896 29 com.apple.CoreFoundation 0x92096cf8 CFRunLoopRunInMode + 88 30 com.apple.Foundation 0x93750ef0 -[NSConcreteTask waitUntilExit] + 128 31 com.myapp.plugin 0x17207c79 -[plugin waitUntilExit] + 89 (plugin.m:150) 32 com.myapp.plugin 0x17207a31 -[plugin stop] + 93 (plugin.m:87) 33 com.myapp.plugin 0x1720700b -[plugin(scripting) stopPlayback] + 164 (plugin.m:47) 34 com.myapp.plugin 0x17206eac -[plugin(scripting) url:] + 43 (plugin.m:30) 35 com.apple.CoreFoundation 0x92115a7d __invoking___ + 29 36 com.apple.CoreFoundation 0x92115468 -[NSInvocation invoke] + 136 37 com.apple.JavaScriptCore 0x90b70cfd KJS::Bindings::ObjcInstance::invokeMethod(KJS::ExecState*, WTF::Vector<KJS::Bindings::Method*, 0ul> const&, KJS::List const&) + 397 38 com.apple.JavaScriptCore 0x90b66646 KJS::RuntimeMethod::callAsFunction(KJS::ExecState*, KJS::JSObject*, KJS::List const&) + 278 39 com.apple.JavaScriptCore 0x90b2ddd6 KJS::FunctionCallDotNode::evaluate(KJS::ExecState*) + 806 40 com.apple.JavaScriptCore 0x90b34329 KJS::ExprStatementNode::execute(KJS::ExecState*) + 25 41 com.apple.JavaScriptCore 0x90b3b340 KJS::BlockNode::execute(KJS::ExecState*) + 64 42 com.apple.JavaScriptCore 0x90b472fa KJS::IfElseNode::execute(KJS::ExecState*) + 106 43 com.apple.JavaScriptCore 0x90b56490 KJS::CaseBlockNode::executeBlock(KJS::ExecState*, KJS::JSValue*) + 688 44 com.apple.JavaScriptCore 0x90b5618f KJS::SwitchNode::execute(KJS::ExecState*) + 79 45 com.apple.JavaScriptCore 0x90b34a71 KJS::FunctionBodyNode::execute(KJS::ExecState*) + 481 46 com.apple.JavaScriptCore 0x90b34529 KJS::FunctionImp::callAsFunction(KJS::ExecState*, KJS::JSObject*, KJS::List const&) + 265 47 com.apple.JavaScriptCore 0x90b2ddd6 KJS::FunctionCallDotNode::evaluate(KJS::ExecState*) + 806 48 com.apple.JavaScriptCore 0x90b34329 KJS::ExprStatementNode::execute(KJS::ExecState*) + 25 49 com.apple.JavaScriptCore 0x90b3b340 KJS::BlockNode::execute(KJS::ExecState*) + 64 50 com.apple.JavaScriptCore 0x90b342ce KJS::IfNode::execute(KJS::ExecState*) + 78 51 com.apple.JavaScriptCore 0x90b34a71 KJS::FunctionBodyNode::execute(KJS::ExecState*) + 481 52 com.apple.JavaScriptCore 0x90b34529 KJS::FunctionImp::callAsFunction(KJS::ExecState*, KJS::JSObject*, KJS::List const&) + 265 53 com.apple.JavaScriptCore 0x90b2ddd6 KJS::FunctionCallDotNode::evaluate(KJS::ExecState*) + 806 54 com.apple.JavaScriptCore 0x90b34329 KJS::ExprStatementNode::execute(KJS::ExecState*) + 25 55 com.apple.JavaScriptCore 0x90b3b340 KJS::BlockNode::execute(KJS::ExecState*) + 64 56 com.apple.JavaScriptCore 0x90b472fa KJS::IfElseNode::execute(KJS::ExecState*) + 106 57 com.apple.JavaScriptCore 0x90b34a71 KJS::FunctionBodyNode::execute(KJS::ExecState*) + 481 58 com.apple.JavaScriptCore 0x90b34529 KJS::FunctionImp::callAsFunction(KJS::ExecState*, KJS::JSObject*, KJS::List const&) + 265 59 com.apple.JavaScriptCore 0x90b2ddd6 KJS::FunctionCallDotNode::evaluate(KJS::ExecState*) + 806 60 com.apple.JavaScriptCore 0x90b34329 KJS::ExprStatementNode::execute(KJS::ExecState*) + 25 61 com.apple.JavaScriptCore 0x90b34a71 KJS::FunctionBodyNode::execute(KJS::ExecState*) + 481 62 com.apple.JavaScriptCore 0x90b34529 KJS::FunctionImp::callAsFunction(KJS::ExecState*, KJS::JSObject*, KJS::List const&) + 265 63 com.apple.JavaScriptCore 0x90b2ddd6 KJS::FunctionCallDotNode::evaluate(KJS::ExecState*) + 806 64 com.apple.JavaScriptCore 0x90b34329 KJS::ExprStatementNode::execute(KJS::ExecState*) + 25 65 com.apple.JavaScriptCore 0x90b34a71 KJS::FunctionBodyNode::execute(KJS::ExecState*) + 481 66 com.apple.JavaScriptCore 0x90b34529 KJS::FunctionImp::callAsFunction(KJS::ExecState*, KJS::JSObject*, KJS::List const&) + 265 67 com.apple.JavaScriptCore 0x90b788b7 KJS::JSObject::call(KJS::ExecState*, KJS::JSObject*, KJS::List const&) + 135 68 com.apple.WebCore 0x928474ee WebCore::JSAbstractEventListener::handleEvent(WebCore::Event*, bool) + 1390 69 com.apple.WebCore 0x927a3846 WebCore::EventTarget::handleLocalEvents(WebCore::EventTargetNode*, WebCore::Event*, bool) + 182 70 com.apple.WebCore 0x927a376f WebCore::EventTargetNode::handleLocalEvents(WebCore::Event*, bool) + 79 71 com.apple.WebCore 0x927a3206 WebCore::EventTarget::dispatchGenericEvent(WebCore::EventTargetNode*, WTF::PassRefPtr<WebCore::Event>, int&, bool) + 454 72 com.apple.WebCore 0x927a2f4f WebCore::EventTargetNode::dispatchEvent(WTF::PassRefPtr<WebCore::Event>, int&, bool) + 255 73 com.apple.WebCore 0x92960c1d WebCore::EventTargetNode::dispatchMouseEvent(WebCore::AtomicString const&, int, int, int, int, int, int, bool, bool, bool, bool, bool, WebCore::Node*, WTF::PassRefPtr<WebCore::Event>) + 509 74 com.apple.WebCore 0x929609d5 WebCore::EventTargetNode::dispatchMouseEvent(WebCore::PlatformMouseEvent const&, WebCore::AtomicString const&, int, WebCore::Node*) + 165 75 com.apple.WebCore 0x929604d5 WebCore::EventHandler::dispatchMouseEvent(WebCore::AtomicString const&, WebCore::Node*, bool, int, WebCore::PlatformMouseEvent const&, bool) + 101 76 com.apple.WebCore 0x928d21c2 WebCore::EventHandler::handleMouseReleaseEvent(WebCore::PlatformMouseEvent const&) + 722 77 com.apple.WebCore 0x928d1df9 WebCore::EventHandler::mouseUp(NSEvent*) + 393 78 com.apple.WebKit 0x90a698bc -[WebHTMLView mouseUp:] + 220 79 com.apple.AppKit 0x95e59809 -[NSWindow sendEvent:] + 5539 80 com.apple.AppKit 0x95e26311 -[NSApplication sendEvent:] + 2941 81 com.apple.AppKit 0x95d83d0f -[NSApplication run] + 847 82 com.apple.AppKit 0x95d50f14 NSApplicationMain + 574 83 com.MyApp 0x00002ebb main + 133 (main.m:22) 84 com.MyApp 0x00002e0a start + 54

