I've got a program, randomly when a device disconnects or connects I get a crash. when I run a bt
command in gdb
I get the following:
#0 0x00007fff881cf150 in objc_msgSend_vtable5 ()
#1 0x00007fff8cceabf3 in -[IOBluetoothRFCOMMChannel(IOBluetoothRFCOMMChannelPrivate) processIncomingData:] ()
#2 0x00007fff8cce8ee1 in -[IOBluetoothRFCOMMChannel(IOBluetoothRFCOMMChannelPrivate) handleMachMessage:] ()
#3 0x00007fff8d142ba5 in __NSFireMachPort ()
#4 0x00007fff8ad41e42 in __CFMachPortPerform ()
#5 0x00007fff8ad41cac in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ ()
#6 0x00007fff8ad419db in __CFRunLoopDoSource1 ()
#7 0x00007fff8ad78117 in __CFRunLoopRun ()
#8 0x00007fff8ad77676 in CFRunLoopRunSpecific ()
#9 0x00007fff8c88731f in RunCurrentEventLoopInMode ()
#10 0x00007fff8c88e5c9 in ReceiveNextEventCommon ()
#11 0x00007fff8c88e456 in BlockUntilNextEventMatchingListInMode ()
#12 0x00007fff92404f5d in _DPSNextEvent ()
#13 0x00007fff92404861 in -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] ()
#14 0x00007fff9240119d in -[NSApplication run] ()
#15 0x00007fff9267fb88 in NSApplicationMain ()
#16 0x00000001000020d2 in main (argc=3, argv=0x7fff5fbff8e0) at main.m:13
XCode breaks on NSApplicationMain, not anywhere in my code and I've told it to break on all exceptions. This is leading me to think this is happening insite the bluetooth stack itself. Is this right? Is there any way I can prevent this, or at least try/catch this to clean things up and prevent the crash?
Difficult to say as is, but let's speculate and assume the framework has no bug: you likely setup a delegate on the
IOBluetoothRFCOMMChannel
and this delegate has been deallocated while the channel still wants to talk to it.You should make sure your delegate remains alive until the channel is totally shut down or set the channel's delegate to
nil
.More generally, this kind of crash indicates access to a deallocated object. The best thing to track this kind of problems is to use Zombie Instruments. It will point you to where the object is accessed, what object it was and also helps you track the object's lifetime.