2010-07-06 53 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