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在主线程调用时会导致死锁。