iOS18系统 [YYKVStorage _dbClose] 偶现崩溃

一. 背景

项目线上会偶现[YYKVStorage _dbClose]的相关崩溃问题,崩溃堆栈如下:

二. 分析与治理

通过分析代码,这个崩溃发生在App应用退出的时候,YYDiskCache会调用_appWillBeTerminated,将YYKVStorage置为nil,接着YYKVStorage会调用dealloc方法,最后调用[YYKVStorage _dbClose],在调用sqlite3_close的时候出现了崩溃。

第一次治理

一开始从YYCache的github上面发现,线上也有反馈过类似的问题

github.com/ibireme/YYC...

因此采用了这里的治理方法,但上线后依然存在着result = sqlite3_close(_db);崩溃问题。

第二次治理

因为崩溃是EXC_BAD_ACCESS (SIGSEGV)类型,觉得可能是多线程导致的野指针问题。

从代码里面排查YYDiskCache里面的YYKVStorage *_kv;基本所有的操作都添加了锁操作。

只有极少数的读取操作没有添加锁操作。

因此调整了加锁的范围

但上线之后,也依然存在这个崩溃问题,显然也不是这里引起的。

第三次治理

因为前两次治理都没有解决这个问题,依据AI和网上给的一些建议是替换sqlite3_close函数,替换为sqlite3_close_v2,并且去掉当关闭状态为result == SQLITE_BUSY || result == SQLITE_LOCKED时候的重试逻辑。

该方案上线之后,也依然存在这个崩溃。

第四次治理

因为崩溃基本全是出现在iOS18的系统,结合DeepSeek以及一些文章给得的结论,有部分文章说iOS18在应用程序退出时候,系统会对sqlite3进行关闭回收操作,而YYCache内部在应用即将退出UIApplicationWillTerminateNotification的时候,会主动调用一次关闭,导致了关闭的时候,刚好系统关闭回收了sqlite3,因此出现野指针。我们观察其他三方比如神策里面sqlite3的使用逻辑,并没有在应用即将退出的时候调用关闭sqlite3的操作。

针对这个添加了降级方案,在iOS18及以上的系统,当UIApplicationWillTerminateNotification的时候,就不去调用_kv = nil的操作,上线后,经验证,这个崩溃确实没出现。由于sqlite3没有调用close,但操作系统会帮忙回收,因此下次启动,打开也是正常的。

相关推荐
2501_915921437 小时前
KXBuild CI 实操,Windows/Linux 服务器接入 Jenkins 打包 iOS IPA
服务器·windows·vscode·ios·ci/cd·个人开发·敏捷流程
狗凯之家源码网7 小时前
iOS C2 V2 与 Python FastAPI 全链路远控系统深度评测
python·ios·fastapi
看浪的路人8 小时前
第6讲:Streaming 优化——告别“转圈圈“的用户体验
ios·iphone·xcode
传奇开心果编程19 小时前
【Flutter踩坑排雷】第7课:巨型 build 函数坑|全部 UI 写在同一个 build,维护难、隐性异常
android·flutter·ios·移动开发·跨平台·dart·声明式ui
瓦瓦gogo1 天前
第一次了解 iOS 开发:从 Swift、SwiftUI 到公共组件
ios·swiftui·swift
Liben1 天前
Weex开发踩坑记录
android·前端·ios
season_zhu1 天前
Skills For Real Engineers 系列之三:需求聊清楚了,怎么一步步走主流程,做到交付?
ios·ai编程
茶底世界之下1 天前
窗边花瓶太暗?用 Awaking 看提亮室内的代价
ios
2501_915909061 天前
Windows 上用 VS Code 调试 iPhone 真机 App,KXBuild 断点、崩溃定位实操
ide·windows·vscode·ios·iphone·个人开发·敏捷流程
2501_916007472 天前
抓包工具功能对比,TraceEagle、Charles、Fiddler、Wireshark、mitmproxy 差别
前端·网络协议·ios·adb·https·fiddler·wireshark