首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在获取getaddrinfo期间,BAD_ACCESS的用户数非常少

在获取getaddrinfo期间,BAD_ACCESS的用户数非常少
EN

Stack Overflow用户
提问于 2010-10-05 00:47:18
回答 2查看 549关注 0票数 1

好吧,我完全不知所措了。有一小部分用户似乎在我的主机名转换中出现了BAD_ACCESS错误。

下面是完整的崩溃:

代码语言:javascript
复制
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 (重要部分)的代码。我是不是漏掉了什么?我可以添加更多的支票吗?这只是一个非常低的用户数量,所以成千上万的用户没有问题。

我的主机名解析代码的一部分: my CFNetworkStream openBSDSocket::method

代码语言:javascript
复制
-(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
    }
}

它依次调用complete方法下面的self getHostAddress:xxxx方法:

代码语言:javascript
复制
-(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上没有内存泄漏。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-06 17:16:51

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

我认为真正的问题是,当用户有连接问题时,许多连接线程可能会过度泛滥getaddrinfo,直到它崩溃。

票数 1
EN

Stack Overflow用户

发布于 2010-10-05 01:19:54

首先,测试if (hostNameC!=NULL)并没有完成任何事情:hostnameC是一个数组(不是指针),它永远不会是== NULL。那么,您是否正在处理hostname==NULL或主机名长度为零的情况?

您没有检查-getCString: maxLength: encoding:的返回值;如果调用失败,您将向getaddrinfo传递未初始化的垃圾。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3857343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档