"Thread 6 com.apple.NSURLConnectionLoader: принятый программный сигнал: EXC_BAD_ACCESS"
Приложение запускается через 15 секунд после запуска, и XCode просто ломается по адресу и дает мне всплывающее сообщение, в котором говорится: "Thread 6 com.apple.NSURLConnectionLoader: Программный принятый сигнал: EXC_BAD_ACCESS"
Я полностью не смог отследить проблему. Он отлично работает на iOS 4, но я предполагаю, что только потому, что он более терпим к ошибке или чему-то еще. Я пробовал устанавливать точки останова повсюду и перешагивать, запуская его в Инструменты под профилем Zombies, но он просто бомбит и не говорит мне, где. У меня нет предупреждений и чистого анализа, так что я немного потеряю, чтобы посмотреть дальше. Может ли кто-нибудь предложить какие-либо рекомендации? Спасибо.
Возврат:
(gdb) backtrace
#0 0x024fb939 in _dispatch_retain ()
#1 0x024fbc02 in dispatch_source_cancel ()
#2 0x0109e492 in _CFURLCacheDeallocate ()
#3 0x0205a4e3 in CFRelease ()
#4 0x010331b1 in HTTPProtocol::~HTTPProtocol ()
#5 0x0100c75d in CFClass::FinalizeObj ()
#6 0x0205a4e3 in CFRelease ()
#7 0x02110af0 in __CFDictionaryStandardReleaseValue ()
#8 0x020714b1 in __CFBasicHashDrain ()
#9 0x0205a4e3 in CFRelease ()
#10 0x01024237 in SocketStream::~SocketStream ()
#11 0x0100c75d in CFClass::FinalizeObj ()
#12 0x0205a4e3 in CFRelease ()
#13 0x01023e0b in SocketStream::finalize ()
#14 0x01023dc6 in virtual thunk to SocketStream::finalize(void const*) ()
#15 0x01023da1 in ReadStreamCallbacks::_finalize ()
#16 0x0208201a in __CFStreamDeallocate ()
#17 0x0205a4e3 in CFRelease ()
#18 0x01030a6c in HTTPReadFilter::~HTTPReadFilter ()
#19 0x0100c75d in CFClass::FinalizeObj ()
#20 0x0205a4e3 in CFRelease ()
#21 0x010c22bc in non-virtual thunk to HTTPReadFilter::readStreamFinalize(__CFReadStream*) ()
#22 0x0102ff1c in CFNetworkReadStream::httpStreamFinalize ()
#23 0x0208201a in __CFStreamDeallocate ()
#24 0x0205a4e3 in CFRelease ()
#25 0x0103070f in NetConnection::shutdownConnectionStreams ()
#26 0x010bf1fc in NetConnection::closeStreamsIfPossibleOrSignalThatThatNeedsToBeDonePrettyPlease ()
#27 0x0103485b in HTTPConnectionCacheEntry::removeUnauthConnection ()
#28 0x010d6d2d in HTTPConnectionCacheEntry::purgeIdleConnections ()
#29 0x010d3c1e in ConnectionCacheTLS::resetCacheForThisThread ()
#30 0x0101b739 in ConnectionTimerTLS::_timerPurgeEntries ()
#31 0x02122966 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ ()
#32 0x02122407 in __CFRunLoopDoTimer ()
#33 0x020857c0 in __CFRunLoopRun ()
#34 0x02084db4 in CFRunLoopRunSpecific ()
#35 0x02084ccb in CFRunLoopRunInMode ()
#36 0x00206e40 in +[NSURLConnection(Loader) _resourceLoadLoop:] ()
#37 0x001184e6 in -[NSThread main] ()
#38 0x00118457 in __NSThread__main__ ()
#39 0x98d6b259 in _pthread_start ()
#40 0x98d6b0de in thread_start ()
Ответы
Ответ 1
Исправление в вышеприведенном комментарии не закончило его исправление, и оно все еще громогласно в случайном порядке, практически без отладочной информации.
С отладчиком, подключенным к моему iPhone, он дал другую ошибку эмулятору, и я увидел ссылку на объект NSURLCache. Затем я вспомнил, что у меня остался старый код, пытающийся исправить утечку памяти в объекте NSURLConnection...
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];
[sharedCache release];
а также в другом классе, который у меня был...
[[NSURLCache sharedURLCache] setMemoryCapacity:0];
[[NSURLCache sharedURLCache] setDiskCapacity:0];
Удаление этих исправленных проблем, а также объяснил мне, почему так трудно отследить. Это выглядит как ошибка где-то в коде Apple, поскольку это была полная боль, чтобы отслеживать почти без сообщений об ошибках.
Я надеюсь, что это поможет кому-то другому.
Ответ 2
Установите NSZombieEnabled, MallocStackLogging, и guard malloc в отладчике. Затем, когда ваше приложение выйдет из строя, введите его в консоли gdb:
(gdb) info malloc-history 0x543216
Замените 0x543216
адресом объекта, который вызвал сбой, и вы получите гораздо более полезную трассировку стека, и это поможет вам точно определить точную строку в коде, вызывающую проблему.
Подробнее см. в этой статье.
Ответ 3
Спасибо iamichi за ваши усилия по отслеживанию этой ошибки. Это исправило мою проблему.
Одно замечание:
Я удалил следующий код из своего приложения так же, как вы:
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];
[sharedCache release];
и поместил следующий код (не удалялся) в делегат приложения:
[[NSURLCache sharedURLCache] setMemoryCapacity:0];
[[NSURLCache sharedURLCache] setDiskCapacity:0];
Все хорошо. Спасибо!