iOS后台崩溃问题0xdead10cc解决方案

我们苹果后台有大量的崩溃上报,崩溃信息如下:

Exception Type: EXC_CRASH (SIGKILL)

Exception Codes: 0x0000000000000000, 0x0000000000000000

Termination Reason: RUNNINGBOARD 0xdead10cc

我们也接到不少用户反馈存在崩溃问题,现象就是App退到后台一段时间后,有概率崩溃,有的用户反馈崩溃的很频繁,我们自测又没有问题,毫无规律。由于我们是TestFlight分发的应用,所以崩溃了会特别明显,因为会弹一个"XX应用已崩溃,是否上报"的系统弹框。如果是AppStore分发的应用,即使存在这个问题,可能也容易察觉,因为你切到别的应用,再切回来发现应用重启了,你也没法分辨是系统正常的杀掉应用了,还是应用崩溃了。

苹果后台崩溃日志的堆栈虽然各不相同,但都涉及到数据库操作,所以我们猜测,这类崩溃和后台操作数据库有关。

崩溃的原因:

异常码 0xdead10cc,意味着应用程序因为在后台操作系统资源(而非App沙盒内资源)而被 iOS 系统终止

我们的应用包含一个ShareExtensionApp,为了方便主App和ShareExtensionApp共享数据,我们把数据库默认存放应用的共享容器(containerURLForSecurityApplicationGroupIdentifier)中,这就是问题的关键所在

我们打印并观察一下,主App沙盒路径和共享容器路径区别:

沙盒目录(NSDocumentDirectory):

/var/mobile/Containers/Data/Application/A4B74E98-9B7D-4DA0-BA15-DFE03AA580E1/Documents/test.db

共享目录(containerURLForSecurityApplicationGroupIdentifier):
/private/var/mobile/Containers/Shared/AppGroup/806B3545-5ECE-46FF-91E0-C138449A684E/test.db

可以看到,共享目录是"private"开头的私有系统目录,并不是主App的沙盒子目录。

iOS文件的锁机制对在共享区域的文件有更严格的要求。当iOS准备挂起一个应用的时候,系统会检查这个应用是否正在使用一些可能被其他进程使用的文件(即存在对非沙盒文件的锁),如果有,iOS就会直接终止这个应用

我们的应用退到后台后,在被挂起前,如果仍在进行数据库操作,访问系统private目录下的文件,系统就杀死了我们的应用,触发0xdead10cc状态码。

如何重现崩溃:

偶现的bug最让人头疼的就是如何复现,即使有方案修复,也不确定是否真的修复了。所以,重现崩溃至关重要,没法复现,那就创造条件让它复现!

既然我们怀疑是退到后台后,进行数据库操作导致的崩溃。那我们开发就可以通过写临时代码的方式做暴力测试,退到后台后疯狂访问和修复数据,看会不会崩溃。

经过我们的测试,复现了崩溃,且崩溃错误类型和苹果后台的一致,验证了我们的猜想。

需要注意的是,Debug模式下,错误码是3735883980,网上查了下资料,该值就对应Release模式下的0xdead10cc错误码。

Exception Type: EXC_CRASH (SIGKILL)

Exception Codes: 0x0000000000000000, 0x0000000000000000

Termination Reason: RUNNINGBOARD 3735883980

解决方案:

起初,我们想的方案是,应用退到后台前,暂停数据库操作,回到前台后恢复操作。但这似乎并不容易,你需要保留现场和状态,如何恢复是一个考验。

我们最终采用的方案是,把主App的数据库文件挪到App沙盒目录中存放,然后在合适的时机同步一份到ShareExtensionApp的共享目录。这样,就不存在退到后台仍然访问private目录加锁的问题了。

如何同步:删除共享目录的.db文件,拷贝App沙盒目录的.db文件到共享目录。

同步时机:这个结合自己的业务场景制定即可,比如 App启动时、App回到前台时。尽量避免App处于后台时做同步操作。

总之,iOS系统对于private目录下的文件会更敏感,文件的操作尽量在自己的沙盒目录下进行(比如先把文件从private目录拷贝到沙盒目录),减少对private目录文件的访问和修改,避免各种异常情况发生

参考文献:
如何避免应用崩溃
0xdead10cc问题调研
Crash in iOS 15 EXC_CRASH (SIGKILL) without reason on TestFlight

相关推荐
游戏开发爱好者829 分钟前
日常开发与测试的 App 测试方法、查看设备状态、实时日志、应用数据
android·ios·小程序·https·uni-app·iphone·webview
黑码哥1 小时前
ViewHolder设计模式深度剖析:iOS开发者掌握Android列表性能优化的实战指南
android·ios·性能优化·跨平台开发·viewholder
2501_915106322 小时前
app 上架过程,安装包准备、证书与描述文件管理、安装测试、上传
android·ios·小程序·https·uni-app·iphone·webview
2501_915106323 小时前
使用 Sniffmaster TCP 抓包和 Wireshark 网络分析
网络协议·tcp/ip·ios·小程序·uni-app·wireshark·iphone
熊猫钓鱼>_>3 小时前
移动端开发技术选型报告:三足鼎立时代的开发者指南(2026年2月)
android·人工智能·ios·app·鸿蒙·cpu·移动端
徐同保1 天前
通过ip访问nginx的服务时,被第一个server重定向了,通过设置default_server解决这个问题
ios·iphone
2501_915918411 天前
在 iOS 环境下查看 App 详细信息与文件目录
android·ios·小程序·https·uni-app·iphone·webview
2501_916007471 天前
没有 Mac 用户如何上架 App Store,IPA生成、证书与描述文件管理、跨平台上传
android·macos·ios·小程序·uni-app·iphone·webview
夏幻灵2 天前
HTTPS全面解析:原理、加密机制与证书体
ios·iphone
TheNextByte12 天前
如何在iPhone上恢复已删除的笔记的综合指南
笔记·ios·iphone