我有一个iOS应用程序,似乎随机在具有UIWebView的屏幕上崩溃。看起来崩溃主要发生在iPhone 5C设备上(74%的时间),并且在iOS 10.X上100%发生。
异常信息为:
EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x00000028
从这个低内存地址,我认为有些东西是nil
。
以下是回溯信息(这不是主线程):
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
,但我不确定如何解释。我也不确定在这种情况下“frames”和“trees”具体是什么。
从回溯信息来看,似乎有些定时器被触发了,可能是在视图控制器或 Web 视图被销毁之后?这个定时器是否由 JavaScript 的 setTimeout
调用产生的?
此外,我注意到每次出现这种崩溃时,都会在崩溃之前调用 [UIWebViewDelegate webView:didFailLoadWithError:]
。在该委托方法中返回的最常见错误是:
- 框架加载被中断
- HTTP 重定向太多
- 请求超时
但我没有安装分析工具来将错误消息与崩溃相关联,因此不确定哪个(如果有的话)会解释这个问题。当该委托方法被触发时,我在模态框中向用户显示错误消息。这是否与崩溃有关?我尝试重现“框架加载被中断”和“HTTP 重定向太多”错误,但在模拟器中都没有引起崩溃。
我已经遵循了这个答案中的建议(大部分),在viewWillDisappear
中调用[webview stopLoading]
,并在包含视图控制器的dealloc
中调用self.webView.delegate = nil
,但没有帮助。