记录一个iOS App卡死问题修复

app卡死问题修复是非常困难的问题,对于release版本,他会被watchDog杀掉,在崩溃日志里面的堆栈通常是这样:<RBSTerminateContext| domain:10 code:0x8BADF00D explanation:[application<com.xxxx.xxxx>:21665] failed to terminate gracefully after 5.0s,下面的堆栈信息通常无法分析出卡死的原因。
分享一些辅助分析方案:
1、通过经验分析,卡死通常由于死循环、死锁、及运行过重任务导致。
2、无法复现时,使用dev工具比如DoKit,去抓取卡顿堆栈辅助分析,卡顿不意味着卡死。
3、开发机复现时,点击代码下方debug栏的pause,可以直接查看到当前的堆栈,通过堆栈分析。
我复现的卡死由于死锁导致:

private func fetchAuthorizationStatus() -> UNAuthorizationStatus? {
        var notificationSettings: UNNotificationSettings?
        let semaphore = DispatchSemaphore(value: 0)
        DispatchQueue.global().async {
            UNUserNotificationCenter.current().getNotificationSettings { setttings in
                notificationSettings = setttings
                semaphore.signal()
            }
        }
        semaphore.wait()
        return notificationSettings?.authorizationStatus
    }

以上代码在iOS15、16上,getNotificationSettings的回调可能在主线程调用,当fetchAuthorizationStatus在主线程调用时会导致死锁。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容