崩溃:reason: There doesn't seem to

2023-03-26  本文已影响0人  彬琪

最近遇到一个奇怪的崩溃!
app启动后,打开一个需要加载storyboard的ViewController,可以正常使用,然后,放在前台20分钟以上,继续打开这个ViewController,会爆出如下的崩溃:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'There doesn't seem to be a valid compiled storyboard at path '/private/var/containers/Bundle/Application/2157F15D-E07C-4BC8-A805-80C79F322A0B/XXXXX.app/XXXXX.storyboardc''
terminating with uncaught exception of type NSException

崩溃原因

打开文件过多,导致Linux层面,文件句柄数超过限制(1024),iOS层打开新的文件时,就会报奇怪的错误。
打开文件不仅局限于打开文件本身,录制音视频,发起Socket长链接等等,也会打开和创建文件,结束后需要及时结束或关闭。

排查过程

最开始猜测:

排查

猜测1、2很快就能排除
猜测3,我查阅了iOS系统Storyboard和内存相关的文档,没有查到关于这种猜测的一丝丝的蛛丝马迹。
猜测4,如果可能,肯定不会是只有发现。

搜索

于是乎,开始了漫长的谷歌、百度、bing……

经过海量的搜索、排查,发现这个问题的报错信息检索出来的结果只有两类:

我的项目完全没有这些问题…那我们的崩溃是什么原因呢,之前从来没有哪个必现的bug,能让我感觉到绝望,这次我真的有点绝望了…

转机

就在苦苦搜素并不断尝试修改问题的第二天下午,负责安全的伙伴,给我发过来一个SDK的更新包(这个版本开发初,也给过一个),让我抽空替换一下,我没搭理他,老子都被这个崩溃整疯了,于是又搞了一下午…
依然没解决,测试催着要提测,只能带着问题先提测,于是我撤销了所有无力的修改,然后替换了新的SDK, Common+R 运行了一下,准备提测前的最后自测。
然后,20几分钟周,app居然一切正常,之前必现的崩溃,居然就这么消失了。
于是,赶紧跑过去问他改了啥,他说优化了一下代码,再具体问,说修改了Socket长链接的发起策略,以前是会频繁发起,现在是检测了业务场景,需要的时候才发起。
于是,我跟他看了我之前崩溃,他也是一脸懵逼,说iOS他不懂,我说替换了你的新SDK,这个崩溃就好了!
他好像恍然大悟,说应该是:Linux类系统的文件句柄限制规则,他在安卓上遇到过,iOS应该也限制,文件句柄最大限制是1024,类似的可以参考Java 的FileDescriptor。
终于找到原因了

崩溃原因

之所以会触发FileDescriptor文件句柄最大限制,是以为每次发起Socket长链接时,都会创建新的文件,如果不及时关闭Socket,这些文件也不会关闭,所以随着时间的增加,创建的并打开的文件越来越多,当我再去打开Storyboard文件,加载新的界面的时候,就会触发一开始的崩溃。
因此,需要养成好的习惯,创建、打开文件,一定要及时关闭,关闭后句柄数会减少,这样就不会出现类似奇奇怪怪的崩溃了。

思考

搞iOS和安卓开发,一定要学习Linux系统,里面有很多限制不会反馈都上层,导致出现问题后,很难定位。

上一篇下一篇

猜你喜欢

热点阅读