1

我有一个程序,当设备断开或连接时随机发生崩溃。当我在其中运行bt命令时,gdb我得到以下信息:

#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 上中断,而不是在我的代码中的任何地方,我已经告诉它在所有异常上都中断。这让我认为这是在蓝牙堆栈本身发生的。这是正确的吗?有什么办法可以防止这种情况发生,或者至少尝试/抓住它来清理东西并防止崩溃?

4

2 回答 2

1

很难说,但让我们推测并假设框架没有错误:您可能在 上设置了一个委托,IOBluetoothRFCOMMChannel并且该委托已被释放,而通道仍想与它通信。

您应该确保您的代理保持活动状态,直到通道完全关闭或将通道的代理设置为nil.

更一般地说,这种崩溃表明访问了已释放的对象。跟踪此类问题的最佳方法是使用 Zombie Instruments。它将指向您访问对象的位置,它是什么对象,还可以帮助您跟踪对象的生命周期。

于 2012-02-03T00:36:59.660 回答
0

蓝牙事件被接收和发送。尝试访问目标对象时调度代码失败。这表明一个对象在它仍然是未决事件的目标时被破坏或拆除。

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

于 2012-02-03T00:34:30.613 回答