abort () вызывается в gethostbyname - как обработать - PullRequest
1 голос
/ 06 июля 2010

Я получаю прерывание (), которое не могу «поймать» в своем коде.Возможно, мне не хватает понимания;Можете ли вы дать мне некоторое представление или, возможно, помочь мне с прерыванием ()?

Пожалуйста, обратите внимание;код отлично работает для тысяч моих пользователей;но очень немногие (сейчас два) сообщили об этом сбое.

Сначала код (упрощенный):

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 ]

2 голосов
/ 06 июля 2010

Ваша куча повреждена. gethostbyname() вызывает free() для освобождения выделенной памяти. free() имеет некоторые внутренние проверки согласованности: если он обнаруживает, что куча была повреждена, то он вызывает abort(), чтобы завершить программу - как только ваша куча повреждена, вы почти не можете восстановить ее, поэтому Лучше всего потерпеть неудачу, как только вы это обнаружите.

К сожалению, определить, где именно твоя куча повреждена, нелегко. Есть несколько Malloc Debug Environment Variables , которые вы можете установить, чтобы отследить это.

0 голосов
/ 06 июля 2010

Справочная страница говорит, что она безопасна для потоков, но все же рекомендует использовать getaddrinfo ( справочная страница ) в многопоточной среде ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...