web-dev-qa-db-ja.com

「スレッド6com.Apple.NSURLConnectionLoader:プログラム受信信号:EXC_BAD_ACCESS」

起動後約15秒でアプリがクラッシュし、XCodeがアドレスで壊れて、「スレッド6 com.Apple.NSURLConnectionLoader:プログラム受信信号:EXC_BAD_ACCESS」というポップアップが表示されます。

私は問題を完全に突き止めることができませんでした。 iOS 4で問題なく動作しますが、それはバグなどに対する耐性が高いからだと思います。どこにでもブレークポイントを設定してステップスルーし、ゾンビプロファイルの下のInstrumentsで実行しようとしましたが、爆破されてどこにあるのかわかりません。警告もクリーンな分析も受けていないので、次にどこを見ればよいのか少し迷っています。誰かがアドバイスを提供できますか?ありがとう。

バックトレースは次のとおりです。

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

上記のコメントの修正は結局修正されませんでした、そしてそれはほとんどデバッグ情報なしでランダムな時間にまだクラッシュしていました。

デバッガーを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のコードのどこかにあるバグのように見えます。

それが他の誰かの助けになることを願っています。

5
iamichi

デバッガーで NSZombieEnabledMallocStackLogging 、および guard malloc を設定します。次に、アプリがクラッシュしたら、gdbコンソールに次のように入力します。

(gdb) info malloc-history 0x543216

0x543216をクラッシュの原因となったオブジェクトのアドレスに置き換えると、はるかに便利なスタックトレースが得られ、問題の原因となっているコード内の正確な行を特定するのに役立ちます。

詳細な手順については、この記事を参照してください。

8
chown

このバグを追跡するために努力してくれたiamichiに感謝します。これで私の問題は修正されました。

注意すべき1つのこと:

あなたと同じように、アプリから次のコードを削除しました。

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

そして、次のコード(削除しませんでした)をアプリケーションデリゲートに配置しました:

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

すべては順調です。ありがとう!

6
Jeremy