Объяснение того, что говорит мне этот след - PullRequest
1 голос
/ 03 февраля 2012

У меня есть программа, случайно, когда устройство отключается или подключается, я получаю сбой.когда я запускаю команду 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, а не где-нибудь в моем коде, и я сказал, чтобы он прерывался на все исключения.Это заставляет меня думать, что это происходит внутри самого стека Bluetooth.Это правильно?Есть ли способ, которым я могу предотвратить это или, по крайней мере, попытаться / поймать это, чтобы очистить вещи и предотвратить сбой?

Ответы [ 2 ]

1 голос
/ 03 февраля 2012

Сложно сказать, как есть, но давайте порассуждаем и предположим, что в фреймворке нет ошибки: вы, вероятно, настроили делегата на IOBluetoothRFCOMMChannel, и этот делегат был освобожден, пока канал все еще хочет с ним общаться.

Вы должны убедиться, что ваш делегат остается активным до тех пор, пока канал не будет полностью закрыт, или не установите делегата канала на nil.

В более общем случае, этот вид сбоя указывает на доступ к освобожденному объекту.Лучшее, что нужно для отслеживания такого рода проблем, - это использование Zombie Instruments.Он укажет вам, где находится объект, к какому объекту он был, а также поможет вам отследить время жизни объекта.

0 голосов
/ 03 февраля 2012

Событие Bluetooth получено и отправлено.Код отправки не выполняется при попытке доступа к целевому объекту.Это говорит о том, что объект был разрушен или разрушен, в то время как он все еще являлся целью ожидающих событий.

Посмотрите на любой объект или структуру, которые ваш код использует для обработки сообщений Bluetooth.Возможно, он был снесен или поврежден.

...