“线程6 com.apple.NSURLConnectionLoader:编程接收信号:EXC_BAD_ACCESS”

应用程序启动后约15秒崩溃,XCode只是在一个地址rest,并给我一个popup,说:“线程6 com.apple.NSURLConnectionLoader:编程接收到的信号:EXC_BAD_ACCESS”

我一直无法跟踪这个问题。 它运行在iOS 4上运行正常,但我猜这只是因为它更容忍的错误或什么的。 我尝试过设置断点,然后在僵尸configuration文件中运行它,但它只是炸popup来,并没有告诉我在哪里。 我没有警告和一个清晰的分析,所以我有点在哪里看下一个损失。 任何人都可以提供任何build议吗? 谢谢。

回溯是:

(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 () 

在debugging器中设置NSZombieEnabled , MallocStackLogging和guard malloc 。 然后,当你的应用程序崩溃时,在gdb控制台中input:

 (gdb) info malloc-history 0x543216 

用导致崩溃的对象的地址replace0x543216 ,您将得到一个更有用的堆栈跟踪,它应该可以帮助您找出导致问题的代码中的确切行。

有关更多详细说明,请参阅此文章。

感谢iamichi在追踪这个bug方面的努力。 这解决了我的问题。

有一件事要注意:

我像从前一样从应用中删除了以下代码:

 NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil]; [NSURLCache setSharedURLCache:sharedCache]; [sharedCache release]; 

并在应用程序委托中放置以下代码(未删除):

 [[NSURLCache sharedURLCache] setMemoryCapacity:0]; [[NSURLCache sharedURLCache] setDiskCapacity:0]; 

一切都很好。 谢谢!

上面的注释中的修复并没有最终修复它,它仍然随机崩溃,几乎没有debugging信息。

debugging器连接到我的iPhone它给模拟器一个不同的错误,我看到一个NSURLCache对象的引用。 然后我记得我有一些旧的代码试图修复NSURLConnection对象中的内存泄漏…

 NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil]; [NSURLCache setSharedURLCache:sharedCache]; [sharedCache release]; 

还有另外一个class呢

  [[NSURLCache sharedURLCache] setMemoryCapacity:0]; [[NSURLCache sharedURLCache] setDiskCapacity:0]; 

取消这些解决了这个问题,并向我解释为什么这是很难追查。 这在我看来像是苹果代码中的一个bug,因为它几乎没有任何错误信息是一个非常痛苦的追踪。

我希望能帮助别人。