2017-05-18 2 views
5

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要求が

をタイムアウトし

  • リダイレクトしかし、私が代わりに分析していない中断しましたエラーメッセージとクラッシュを関連付けるので、どのようなものがあるかはわかりません。そのデリゲートメソッドが起動すると、モーダルでエラーメッセージが表示されます。これはクラッシュに関連していますか?私は "Frame load interrupted"と "too many HTTP redirects"エラーを再現しようとしましたが、どちらもシミュレータで私のクラッシュを引き起こしませんでした。

    は、私はすでに(主に)this answerでのアドバイスに従うとviewWillDisappear[webview stopLoading]を呼び出して、私は含んでビューコントローラのdeallocself.webView.delegate = nilを呼ぶが、それは助けにはなりませんでした。

  • +0

    私は同じ問題に直面しています。何か解決策を見つけましたか? – OMK

    +0

    私はこのことを答えにするつもりはありません。しかし、私はWKWebViewへの切り替えがこの種のクラッシュを解決できると思います。 –

    +0

    ありがとうございます。試してみます。 – OMK

    答えて

    0

    これは実際の回答ではありませんが、このクラッシュはコンテンツフィルタリング(親コントロール)が有効になっている場合に関連しているようです。 UIWebViewのアプリケーションがiOSの親コントロールのブロックリストにロードされているドメインを追加すると、このエラーがアプリケーションログに表示されます(WebKitのWebFilterから内部的に送信されます)。何らかの形でUIWebViewを無効にしているようですので、再びUIWebViewとやり取りすると、アプリケーション全体がクラッシュします。おそらくWKWebViewに切り替えることでクラッシュを避けることができます。

    WF: WebFilterEvaluator:addData: https://some-blocked-url.com is restricted: blacklisted

    関連する問題