UIWebViewを持つ画面でランダムにクラッシュするようなiOSアプリケーションがあります。クラッシュがiPhone 5Cデバイス(74%)で発生し、100%がiOS 10.Xで発生したようです。iOS UIWebViewがWebCore :: FrameTree :: topでランダムにクラッシュする
例外メッセージは、次のとおりです。それは私が何かがnil
だったと思わせる、低メモリアドレスから
EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x00000028
。ここで
は(これがメインスレッドではありません)、バックトレースです:
0 WebCore WebCore::FrameTree::top() + 0
1 WebCore WebCore::ContentSecurityPolicy::allowFrameAncestors() + 33
2 WebCore WebCore::DocumentLoader::responseReceived() + 413
3 WebCore WebCore::DocumentLoader::handleSubstituteDataLoadNow() + 203
4 WebCore WebCore::ThreadTimers::sharedTimerFiredInternal() + 149
5 WebCore WebCore::timerFired() + 23
6 CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 15
7 CoreFoundation __CFRunLoopDoTimer + 833
8 CoreFoundation __CFRunLoopDoTimers + 189
9 CoreFoundation __CFRunLoopRun + 781
10 CoreFoundation CFRunLoopRunSpecific + 471
11 CoreFoundation CFRunLoopRunInMode + 105
12 WebCore RunWebThread() + 427
13 libsystem_pthread.dylib _pthread_body + 217
14 libsystem_pthread.dylib _pthread_start + 235
私はこのクラッシュを自分で再現することはできません。
WebKitはオープンソースなので、クラッシュするコードを見つけました。WebCore::FrameTree::top。そのコードを見ると、私はm_thisFrame->tree()
がNULL
だと推測していますが、それを説明する方法がわかりません。その文脈で「フレーム」と「ツリー」が何であるか正確にはわかりません。
バックトレースからは、View ControllerまたはWeb Viewが既に割り当て解除された後に、いくつかのタイマーが起動しているように見えますか?そのタイマーはJavaScript setTimeout
コールに起因するのですか?
また、このクラッシュが発生するたびに、クラッシュする直前に[UIWebViewDelegate webView:didFailLoadWithError:]
に電話がかかります。そのデリゲートメソッドで返される最も一般的なエラーは以下のとおりです。
- フレームの負荷が
- があまりにも多くのHTTP要求が
をタイムアウトし
は、私はすでに(主に)this answerでのアドバイスに従うとviewWillDisappear
で[webview stopLoading]
を呼び出して、私は含んでビューコントローラのdealloc
にself.webView.delegate = nil
を呼ぶが、それは助けにはなりませんでした。
私は同じ問題に直面しています。何か解決策を見つけましたか? – OMK
私はこのことを答えにするつもりはありません。しかし、私はWKWebViewへの切り替えがこの種のクラッシュを解決できると思います。 –
ありがとうございます。試してみます。 – OMK