我得到一个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