Ответ 1
"CoreBluetooth [ERROR] Соединение XPC прервано, сброс" означает, что демон blued
разбился. Вы можете увидеть более подробную информацию, открыв консоль и посмотрев системный журнал и DiagnosticReports.
В моем случае кажется, что исключение внутри blued происходит потому, что SerialNumber где-то ничто. У меня нет обходного пути и сообщил об этом bugreport.apple.com(ошибка 16075785).
Метод, который фактически вызывает исключение, является детерминированным, но зависит от компьютера. На одном компьютере с внутренним чипом Bluetooth 4.0 это вызов -[CBPeripheral discoverCharacteristics:forService:]
. На другом компьютере с USB-адаптером Bluetooth 4.0 это вызов -[CBPeripheral writeValue:forCharacteristic:type:]
или -[CBPeripheral setNotifyValue:forCharacteristic:]
'NSInvalidArgumentException', reason: '*** setObjectForKey: object cannot be nil (key: SerialNumber)'
*** First throw call stack:
(
0 CoreFoundation 0x00007fff91b1141c __exceptionPreprocess + 172
1 libobjc.A.dylib 0x00007fff9231de75 objc_exception_throw + 43
2 CoreFoundation 0x00007fff91a0c62e -[__NSDictionaryM setObject:forKey:] + 1102
3 blued 0x0000000103d5d422 blued + 336930
4 blued 0x0000000103d4b115 blued + 262421
5 IOBluetooth 0x00007fff97354093 -[IOBluetoothL2CAPChannel processIncomingData:] + 576
6 IOBluetooth 0x00007fff97353e3c -[IOBluetoothL2CAPChannel handleMachMessage:] + 45
7 Foundation 0x00007fff94d98e35 __NSFireMachPort + 94
8 CoreFoundation 0x00007fff91a42d04 __CFMachPortPerform + 388
9 CoreFoundation 0x00007fff91a42b69 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 41
Редактирование 2014-02-27: мой особый сбой происходит из-за того, что таблица GATT устройства содержит недопустимое значение не UTF8 для характеристики 2A25 "Serial Number String" в Service 180A "Информация об устройстве", а blued-daemon создает NSString * от него и помещая его в NSMutableDictionary. Временным обходным путем является создание setObject: forKey: никогда не терпит неудачу, если вы прыгаете до ближайшей команды ret:
sudo /Applications/Xcode.app/Contents/Developer/usr/bin/lldb <<PID of blued>>
breakpoint set --fullname "-[__NSDictionaryM setObject:forKey:]" --condition "$rdx == 0"
breakpoint command add 1
register write pc `$pc+967`
continue
DONE