Hard to say without seeing the code. Are you using the Cocoa garbage collector? This will have odd issues unless you ensure the ref count is set correctly. I use a GC enabled Cocoa app to embed my mono library... I had lots of random crashes (impossible to trace as the crash report was misleading) until I added my mono created objects to a Cocoa container so the GC would not come along and destroy them. Best of luck.
On Tue, Dec 23, 2008 at 11:43 AM, yoni shalom <[email protected]> wrote: > 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 >

