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 で中断しますが、コードのどこにもありません。すべての例外で中断するように指示しました。これは、これがBluetoothスタック自体の内部で起こっていると私に思わせています。これは正しいですか?これを防ぐ方法はありますか、または少なくともこれを試してキャッチして、クリーンアップしてクラッシュを防ぐ方法はありますか?

4

2 に答える 2

1

そのまま言うのは難しいですが、フレームワークにバグがないことを推測し、仮定しましょう: でデリゲートを設定する可能性が高くIOBluetoothRFCOMMChannel、チャネルがまだそれと通信したいときに、このデリゲートの割り当てが解除されました。

チャネルが完全にシャットダウンされるか、チャネルのデリゲートが に設定されるまで、デリゲートが存続していることを確認する必要がありますnil

より一般的には、この種のクラッシュは、割り当て解除されたオブジェクトへのアクセスを示します。この種の問題を追跡する最善の方法は、Zombie Instruments を使用することです。オブジェクトがアクセスされた場所、それがどのオブジェクトであったかを示し、オブジェクトの存続期間を追跡するのにも役立ちます。

于 2012-02-03T00:36:59.660 に答える
0

Bluetooth イベントが受信され、ディスパッチされます。ターゲット オブジェクトにアクセスしようとすると、ディスパッチ コードが失敗します。これは、オブジェクトがまだ保留中のイベントのターゲットである間に、オブジェクトが破棄または取り壊されたことを示しています。

Bluetooth メッセージを処理するためにコードが使用するオブジェクトまたは構造を調べてください。おそらく、取り壊されたか、破損していたのでしょう。

于 2012-02-03T00:34:30.613 に答える