好的,我在这里完全不知所措。 一小部分用户似乎在我的主机名转换中出现BAD_ACCESS错误。
下面的完整崩溃:
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: 0x000000000000000d, 0x0000000000000000
Crashed Thread: 21
Thread 21 Crashed:
0 libSystem.B.dylib 0x00007fff8406a446 _mdns_query_callback + 275
1 libSystem.B.dylib 0x00007fff84057fc8 handle_query_response + 296
2 libSystem.B.dylib 0x00007fff84057433 DNSServiceProcessResult + 717
3 libSystem.B.dylib 0x00007fff84069cf3 _mdns_query_mDNSResponder + 1180
4 libSystem.B.dylib 0x00007fff84069090 _mdns_search + 1458
5 libSystem.B.dylib 0x00007fff840682f1 _mdns_addrinfo + 716
6 libSystem.B.dylib 0x00007fff84067373 search_addrinfo + 146
7 libSystem.B.dylib 0x00007fff84066d9c si_addrinfo + 1352
8 libSystem.B.dylib 0x00007fff840667ad getaddrinfo + 159
9 com.NZBVortex.NZBVortex 0x000000010002a4d7 -[CFNetworkStream getHostAddress:sockAddressIn:] + 152
10 com.NZBVortex.NZBVortex 0x000000010002a622 -[CFNetworkStream openBSDSocket::] + 252
这是我用来解决dns(重要部分)的代码。 我在这里遗漏了什么;我可以添加更多支票吗? 它只是一个非常少的用户,因此成千上万没有问题。
我的部分主机名解析代码: 我的[CFNetworkStream openBSDSocket ::]方法
-(bool)openBSDSocket:(NSString*)hostName:(int)port {
struct sockaddr_in remoteAddr;
remoteAddr.sin_family = AF_INET;
remoteAddr.sin_port = htons(port);
if ([self getHostAddress:hostName sockAddressIn:&remoteAddr]) {
//some non-related code
}
}
反过来调用[self getHostAddress:xxxx]方法 完整方法下面:
-(bool)getHostAddress:(NSString*)hostname sockAddressIn:(struct sockaddr_in*)result {
struct addrinfo hints, *res, *iterateRes;
int retval;
memset (&hints, 0, sizeof (struct addrinfo));
hints.ai_family = PF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags |= AI_CANONNAME;
int maxLength = [hostname length]+1;
const char hostNameC[maxLength];
struct in_addr *inAddr;
bool foundAddress = NO;
if (hostNameC!=NULL) {
[hostname getCString:(void*)&hostNameC maxLength:maxLength encoding:NSASCIIStringEncoding];
retval = getaddrinfo (hostNameC, NULL, &hints, &res);
if (retval == 0) {
iterateRes = res;
while (iterateRes && !foundAddress) {
switch (iterateRes->ai_family)
{
case AF_INET:
inAddr = &((struct sockaddr_in *) iterateRes->ai_addr)->sin_addr;
memcpy(&(result->sin_addr), inAddr, sizeof(inAddr));
foundAddress = YES;
}
iterateRes = iterateRes->ai_next;
}
}
freeaddrinfo (res);
}
return foundAddress;
}
你可以给我一个咨询吗?我真的好像被困在这里,乳清是那些(低)用户看到这个代码中的问题?我需要额外的检查吗?
我真的可以使用你的提示/咨询。
重要提示:受影响的用户表示只有在网络被丢弃时才会发生这种情况。但我不能接受丢失的网络连接可能会产生上述问题吗?
编辑: 我做了一次泄漏测试;很长一段时间没有伪造DNS结果(如果(retval!= 0)),但我的Mac上没有内存泄漏。
答案 0 :(得分:0)
嗯,首先,测试if (hostNameC!=NULL)
没有完成任何事情:hostnameC
是一个数组(不是指针),它永远不会是== NULL。那么,你在处理hostname == NULL或hostname是零长度的情况吗?
您没有检查-getCString: maxLength: encoding:
的返回值;如果该调用失败,您将把未初始化的垃圾传递给getaddrinfo
。
答案 1 :(得分:0)
好的,我已经修复了它,确保getaddrinfo不会被太多线程同时调用太多。还为结果添加了一个本地缓存(在app dns缓存中)。
我认为真正的问题是当用户遇到连接问题时,许多连接线程可能会过多地使getaddrinfo溢出,直到它崩溃。