用 Fabric 收集到了奇怪的 UIWebView 内部出现问题导致崩溃的记录

2015-12-13 20:54:41 +08:00
 ainopara

如图所示, UIWebView 在调用 delegate 的时候崩溃,原因是访问了无效的地址。
这个问题只在 iOS9 的设备上出现,可按理说这里不会出现崩溃,苹果在实现这个方法的时候,也在发送消息前做了检查。
如果只有我这里有这个问题,肯定还是哪里写的不标准触到了 iOS9 的 bug ,如果大家都见到了,那可能还是苹果的 UIKit 自己的问题。有点好奇,这个 UIWebView 在 iOS9 设备上的 Crash 记录大家都能见到吗?
5044 次点击
所在节点    iDev
22 条回复
SeanChense
2015-12-13 22:53:00 +08:00
访问到了被释放的内存
今天也遇到一个,最后检查发现是 NSString 被声明成 assign 了
ainopara
2015-12-13 23:01:09 +08:00
@SeanChense 这里完全不涉及我的代码,看上去能让 app 在这个位置崩溃,只可能是 UIWebView 的 delegate 指针变成了 nil 但仍然向其发送了消息?
SeanChense
2015-12-13 23:03:44 +08:00
@ainopara 向 nil 发送消息是安全的。
11
2015-12-13 23:04:26 +08:00
@ainopara 可是向 nil 发送消息是安全的。。
SeanChense
2015-12-13 23:12:07 +08:00
你的 WebView 是怎么加载资源的?
访问链接还是加载一段给定的 html 字符串?
ainopara
2015-12-13 23:22:54 +08:00
@SeanChense
@11
这样一来,问题就更奇怪了。。
ainopara
2015-12-13 23:29:53 +08:00
@SeanChense 你提醒我了,我的 app 里既使用了前者,也存在后者。
而且在 Crash 信息中还看不出来是哪一个。个人感觉给定字符串的情况出问题的可能行比较小。
SeanChense
2015-12-13 23:50:08 +08:00
@ainopara 非也,我觉得给传参传一个字符串然后出这个问题反而可能性大。
就像我今天碰到的一样 property 声明成 assign ,再从对象总取出来插入数据库的时候就出现这个问题了。
11
2015-12-13 23:51:33 +08:00
@ainopara 附言里的是用的什么软件?
ainopara
2015-12-14 08:13:34 +08:00
@11 Hopper Disassembler v3
ainopara
2015-12-14 08:17:03 +08:00
@SeanChense 有道理,比如向 delegate 发送了消息,而 delegate 已经不存在了却没有变为 nil 。
或者向 delegate 发送消息附带的参数出现你说的情况。
另外观察发现,崩溃时同时还存在这种线程:
com.apple.coremedia.player.async
AVAudioSession Notify Thread
怀疑和浏览器中的视频播放有关。
skylancer
2015-12-14 09:53:38 +08:00
这个好像是已知的问题,好像是出在视频解码上
SeanChense
2015-12-14 10:36:40 +08:00
@ainopara 没有实际代码不好分析,你可以用 NSZombie 定位查一下
ainopara
2015-12-14 11:17:24 +08:00
@skylancer 如果是这样,就确认是苹果的问题了。之前主要是担心是自己配置 UIWebView 的时候没做好导致的。

@SeanChense 有实际代码也不好分析,因为我没办法复现这个崩溃问题,我自己用的时候也从来没遇到过。。只能靠 Fabric 收集到的记录推测。
11
2015-12-14 11:27:14 +08:00
@ainopara 看看有没有其他线程访问数据之类的?
ainopara
2015-12-14 13:30:30 +08:00
@11 没有,其他线程基本都是
__psynch_cvwait + 8
mach_msg_trap + 8
这种状态。
我猜测是过去的某个步骤传入了错误的数据,当时没访问数据,但执行到这里需要访问了才崩溃的。
numbbuaa
2016-01-01 22:35:06 +08:00
感觉是 UIWebView 的 delegate (比如 VC )被释放了,建议最好在 delegate 类的 dealloc 方法里面把 UIWebView 的 delegate 置成 nil
ainopara
2016-02-06 20:43:12 +08:00
@SeanChense
@11
@skylancer
@numbbuaa
最终问题解决了。解决方案在这里:
http://stackoverflow.com/questions/29139034/iosexc-bad-access-for-webview-delegate
最终通过 dealloc 的时候向 webview 发送 stopLoading 消息解决了。( delegate 设置为 nil 这个之前有做过,但是不配合 stopLoading 一起用并不能消除这种 Crash )
SeanChense
2016-02-06 21:03:45 +08:00
@ainopara 哈哈,恭喜恭喜。
skylancer
2016-02-07 00:05:04 +08:00
@ainopara 恭喜

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/243257

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX