在gethostbyname中调用的abort() - 如何处理

时间:2010-07-06 19:37:12

标签: objective-c cocoa networking

我得到了一个我无法在我的代码中“捕获”的中止()。 也许我错过了一些理解;你可以给我一些见解或者帮助我中止()吗?

请注意;该代码适用于我拥有的数千名用户;但是很少(现在有两个)报告了这次事故。

首先是代码(简化):

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都被正确包装,异常被捕获,当然不会捕获abort()

你能帮我提一些见解吗?

2 个答案:

答案 0 :(得分:2)

您的堆已损坏。 gethostbyname()正在调用free()来释放它分配的内存。 free()中有一些内部一致性检查:如果它检测到堆已经损坏,那么它会调用abort()来终止程序 - 一旦你的堆被破坏,你几乎无法恢复它,所以最好的办法就是在你发现它后立即失败。

不幸的是,弄清楚堆被破坏的确切位置并不容易。您可以设置一些Malloc Debug Environment Variables来帮助跟踪此问题。

答案 1 :(得分:0)

man page表示它是线程安全的,但仍建议在线程环境中使用getaddrinfoman page)......