2013-07-28 112 views
0

我在iOS中創建了套接字連接機制。它工作得很好。但時不時(大約1%)它崩潰了。這裏是崩潰日誌,你知道它爲什麼會發生。iOS Socket連接崩潰

Thread 0 Crashed: 
0 libobjc.A.dylib      0x3b01b5b0 _objc_msgSend + 16 
1 CoreFoundation      0x332957cf _signalEventSync + 75 
2 CoreFoundation      0x3329b623 _cfstream_solo_signalEventSync + 75 
3 CoreFoundation      0x33295507 _CFStreamSignalEvent + 327 
4 CFNetwork       0x32ffa6ff CoreWriteStreamCFStreamSupport::coreStreamWriteEvent(__CoreWriteStream*, unsigned long) + 99 
5 CFNetwork       0x32ffa0b5 CoreWriteStreamClient::coreStreamEventsAvailable(unsigned long) + 37 
6 CFNetwork       0x32ffb365 CoreStreamBase::_callClientNow() + 45 
7 CFNetwork       0x32ffb0f9 CoreStreamBase::_streamSetEventAndScheduleDelivery(unsigned long, unsigned char) + 89 
8 CFNetwork       0x32ffb4ff CoreStreamBase::_streamInterface_SignalEvent(unsigned long, CFStreamError const*) + 35 
9 CFNetwork       0x32f69b57 SocketStream::socketCallback(__CFSocket*, unsigned long, __CFData const*, void const*) + 135 
10 CFNetwork       0x32f69ab3 SocketStream::_SocketCallBack_stream(__CFSocket*, unsigned long, __CFData const*, void const*, void*) + 75 
11 CoreFoundation      0x332cfd81 __CFSocketPerformV0 + 385 
12 CoreFoundation      0x332cd683 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15 
13 CoreFoundation      0x332ccf7f __CFRunLoopDoSources0 + 363 
14 CoreFoundation      0x332cbcb7 __CFRunLoopRun + 647 
15 CoreFoundation      0x3323eebd _CFRunLoopRunSpecific + 357 
16 CoreFoundation      0x3323ed49 _CFRunLoopRunInMode + 105 
17 GraphicsServices     0x36e172eb _GSEventRunModal + 75 
18 UIKit        0x35154301 _UIApplicationMain + 1121 
19 Okey101Plus       0x000e19ab main (main.m:16) 
+0

我遇到了完全相同的堆棧。我關閉套接字時(也在dealloc中)將分配委託設置爲零,任何線索?你是如何擺脫這個的? –

回答

1

我真的不很確定,但基於您的報告,它看起來像座寫入失敗 -

CoreWriteStreamCFStreamSupport::coreStreamWriteEvent(__CoreWriteStream*, unsigned long) + 99 

有可能是一種方式,你如何避免這個錯誤。 CFNetworks框架有一個很好的功能,稱爲CFNetDiagnostics參考。請仔細看看蘋果文檔。

從蘋果文檔: 在許多基於網絡的應用程序,可能會出現基於網絡的錯誤是無關的應用程序(他們可能這裏的意思,例如:你可以閱讀套接字錯誤,如果當網絡連接丟失時,界面變得不可用)但是,大多數用戶可能不知道應用程序失敗的原因。 CFNetDiagnostics API使您能夠快速簡便地幫助用戶解決網絡問題,而您的工作只需很少的工作。

要通過網絡診斷助手診斷問題,請調用CFNetDiagnosticDiagnoseProblemInteractively函數並傳遞網絡診斷參考。清單6-1顯示瞭如何在運行循環中使用實現的流來使用CFNetDiagnostics。

case kCFStreamEventErrorOccurred: 
     CFNetDiagnosticRef diagRef = 
      CFNetDiagnosticCreateWithStreams(NULL, stream, NULL); 
     (void)CFNetDiagnosticDiagnoseProblemInteractively(diagRef); 
     CFStreamError error = CFReadStreamGetError(stream); 
     reportError(error); 
     CFReadStreamClose(stream); 
     CFRelease(stream); 
     break; 

你可以在這裏閱讀更多 - Using Network DiagnosticsCFNetDiagnostics Reference

+1

不,寫入系統調用要麼成功,要麼失敗,要麼掛起(如果沒有空間並且套接字被阻塞)。我很確定這次崩潰發生在堆棧試圖嚮應用程序指示有空間可用於寫入時,這表明殭屍代表。 – dgatwood

2

它看起來像座類試圖將消息發送到您的委託,和委託已成爲一具行屍走肉。

的NSStream類不保留其委託,在不同的iOS/OS X大多數其他網絡類,所以如果你沒有什麼地方保留它,它就會消失。然後,當這個類試圖告訴你的類,這個流有讀取數據或寫入空間的時候,你會在objc_msgSend中發生崩潰,就像這樣。

如果確實保留它,請確保在清除該保留的代表之前完全拆除該流,並注意將哪些線拆下來,以確保沒有已安排的回調在釋放委託之後將會觸發的主運行循環中。

無論是您還是您未能實現所需的委託方法。但是,這不符合「很少發生」一點。 :-)