2012-02-03 57 views
1

我有一个程序,当设备断开或连接时随机发生崩溃。当我在gdb运行bt命令我得到如下结果:这个回溯告诉我的说明

#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突破上NSApplicationMain,没有在任何地方在我的代码,我已经告诉了所有的异常中断。这导致我认为这是蓝牙堆栈本身发生的事情。这是正确的吗?有什么办法可以防止这种情况发生,或者至少试着抓住这个来清理并防止崩溃?

回答

1

虽然很难说,但让我们推测并假设框架没有错误:您可能在IOBluetoothRFCOMMChannel上设置了一个委托,并且此代理已被释放,而渠道仍然想要与其通话。

您应该确保您的委托保持有效状态,直到通道完全关闭或将通道的代理设置为nil

更一般地说,这种类型的崩溃表示对一个释放对象的访问。跟踪这类问题的最好方法是使用Zombie Instruments。它会指向你访问对象的位置,它是什么对象,还可以帮助你跟踪对象的生命周期。

0

接收并分派蓝牙事件。尝试访问目标对象时,分派代码失败。这表明一个物体被摧毁或被撕毁,而它仍然是未决事件的目标。

查看您的代码用于处理蓝牙消息的任何对象或结构。也许它被拆除或损坏了。