我得到一個abort(),我無法在代碼中「捕捉」。或許我錯過了一些理解;你可以給我一些見解,或者可以幫我用abort()嗎?abort()在gethostbyname中調用 - 如何處理
請注意;該代碼適用於我擁有的成千上萬的用戶;但是很少(現在兩個)報告了這次事故。
首先代碼(簡化):
244: -(void)openBSDSocket:(NSString*)hostname useSSL:(bool)useSSL {
245: // Look up host
246: if ((remoteHost = gethostbyname([hostName cStringUsingEncoding:NSUTF8StringEncoding])) == NULL) {
247: [NSException raise:SOCKET_EX_HOST_NOT_FOUND format:SOCKET_EX_HOST_NOT_FOUND_F, strerror(errno)];
248: }
導致此崩潰(轉儲)
Thread 34 Crashed:
0 libSystem.B.dylib 0x00007fff8550fb6e __semwait_signal_nocancel + 10
1 libSystem.B.dylib 0x00007fff8550fa70 nanosleep$NOCANCEL + 129
2 libSystem.B.dylib 0x00007fff8556c3c6 usleep$NOCANCEL + 57
3 libSystem.B.dylib 0x00007fff8558b97c abort + 93
4 libSystem.B.dylib 0x00007fff854a3615 free + 128
5 libSystem.B.dylib 0x00007fff854f409b _mdns_search + 1469
6 libSystem.B.dylib 0x00007fff854f8564 _mdns_hostbyname + 287
7 libSystem.B.dylib 0x00007fff854f826d search_host_byname + 139
8 libSystem.B.dylib 0x00007fff854f8186 gethostbyname + 98
9 com.NZBVortex.NZBVortex 0x0000000100021346 -[CFNetworkStream openBSDSocket::] + 246
所有openBSDSocket的正確包裹着的例外逮住,這當然不趕中止()
你能幫我在這裏提供一些見解嗎?
感謝您的信息。這是發生在極少數用戶,但在相同的地方akways,不應該是我的應用程序的堆問題導致更多的隨機崩潰?它不是自己的地址空間中的libsystem嗎?很難解決我的猜測。 – 2010-07-06 20:33:45
@Ger Teunis:你是否正在複製返回的「hostent」?文檔說:「函數gethostbyname()和gethostbyaddr()可能會返回指向靜態數據的指針,這些指針可能會被以後的調用覆蓋。複製struct hostent並不足夠,因爲它包含指針;需要深度複製。」 – 2010-07-06 20:43:41
謝謝再次,我將hostent-> h_addr的bcopy複製到sockaddr_in-> sin_addr.s_addr中,之後不再使用hostent。我現在已經切換到getaddrinfo並將向客戶發送一個新的測試版本。雖然我認爲他甚至不能重現原始錯誤(這是零星的) – 2010-07-06 22:13:05