gpt4 book ai didi

objective-c - getaddrinfo 期间用户数量极少时出现 BAD_ACCESS

转载 作者:行者123 更新时间:2023-12-03 17:17:01 34 4
gpt4 key购买 nike

好吧,我完全不知所措了。一小部分用户在我的主机名翻译中似乎存在 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 结果(if (retval != 0)),但我的 Mac 上没有内存泄漏。

最佳答案

好的,我已经修复了这个问题,确保 getaddrinfo 不会被太多线程同时调用太频繁。还添加了结果的本地缓存(应用程序中的 DNS 缓存)。

我认为真正的问题是,当用户遇到连接问题时,许多连接线程可能会过度淹没 getaddrinfo 直至其损坏。

关于objective-c - getaddrinfo 期间用户数量极少时出现 BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3857343/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com