2010-07-06 57 views
1

我得到一個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的正確包裹着的例外逮住,這當然不趕中止()

你能幫我在這裏提供一些見解嗎?

回答

2

你堆處於損壞。 gethostbyname()正在呼叫free()釋放它分配的一些內存。 free()有一些內部一致性檢查:如果它檢測到堆已損壞,那麼它會調用abort()來終止程序 - 一旦堆損壞,您幾乎無法從中恢復,因此最好的做法是一旦你發現它就會失敗。

不幸的是,搞清楚你的​​堆正在損壞的地方並不容易。您可以設置一些Malloc Debug Environment Variables來幫助追蹤此問題。

+0

感謝您的信息。這是發生在極少數用戶,但在相同的地方akways,不應該是我的應用程序的堆問題導致更多的隨機崩潰?它不是自己的地址空間中的libsystem嗎?很難解決我的猜測。 – 2010-07-06 20:33:45

+0

@Ger Teunis:你是否正在複製返回的「hostent」?文檔說:「函數gethostbyname()和gethostbyaddr()可能會返回指向靜態數據的指針,這些指針可能會被以後的調用覆蓋。複製struct hostent並不足夠,因爲它包含指針;需要深度複製。」 – 2010-07-06 20:43:41

+0

謝謝再次,我將hostent-> h_addr的bcopy複製到sockaddr_in-> sin_addr.s_addr中,之後不再使用hostent。我現在已經切換到getaddrinfo並將向客戶發送一個新的測試版本。雖然我認爲他甚至不能重現原始錯誤(這是零星的) – 2010-07-06 22:13:05

0

man page說,這是線程安全的,但仍建議使用getaddrinfo在多線程環境(man page)...

+0

感謝您的選擇。但如果它是上面提到的堆問題,它不會解決問題。 – 2010-07-06 20:29:11