SwiftUI中EXC_BAD_ACCESS(KERN_INVALID_ADDRESS)崩溃排查求助
排查与修复建议
1. 优先获取精准崩溃栈信息
当前仅通过断点无法定位,需提取具体崩溃日志:
- 打开Xcode的
Organizer,找到对应设备的崩溃报告,查看崩溃类型(如EXC_BAD_ACCESS野指针、NSException未捕获异常)及调用栈,定位到具体的生物识别相关类/方法。 - 模拟崩溃时,开启Xcode控制台的
All Output,查看是否有未捕获的错误日志输出。
2. 修复NetworkMonitor的线程安全问题
当前网络监控代码存在线程隐患:后台线程直接修改属性后再异步通知主线程,可能导致状态不一致。修改为如下实现,确保状态更新与通知都在主线程完成:
class NetworkMonitor: ObservableObject { private let networkMonitor = NWPathMonitor() private let workerQueue = DispatchQueue(label: "Monitor") @Published var isConnected = false @Published var isNotConnected = false init() { networkMonitor.pathUpdateHandler = { [weak self] path in guard let self = self else { return } Task { @MainActor in self.isConnected = path.status == .satisfied self.isNotConnected = path.status == .unsatisfied } } networkMonitor.start(queue: workerQueue) } }
- 使用
@Published自动触发状态通知,无需手动调用objectWillChange.send() - 用
[weak self]避免潜在循环引用,确保实例释放后回调不会触发野指针 - 直接在
@MainActor的Task中更新属性,保证线程安全
3. 检查生物识别类的内存与生命周期问题
由于PIN验证无崩溃,重点排查生物识别相关逻辑:
- 给生物识别核心类添加
deinit方法,打印释放日志,确认实例是否在验证成功后被正确释放,是否存在强引用循环。 - 使用Xcode的
Memory Graph Debugger,在崩溃场景下捕获内存快照,查看是否有已释放的生物识别实例被网络回调、环境对象等引用(野指针访问)。 - 检查AppState环境对象与生物识别页面的绑定逻辑:当App从后台返回触发生物识别时,是否存在环境对象状态更新与生物识别实例初始化/释放的时序冲突?比如环境对象已更新,但生物识别视图还未完成初始化,导致空指针访问。
4. 完善断网场景下的错误处理
断网时生物识别验证成功后的后续操作(如token校验、用户信息拉取)可能抛出未处理异常:
- 遍历生物识别验证成功后的所有网络请求,确保用
do-catch包裹异步操作,或在Task中处理错误,避免未捕获异常导致崩溃。 - 检查生物识别框架的回调逻辑:断网是否会导致生物识别的回调方法(如
evaluatePolicy的completion)出现异常参数(如error为nil但实际网络不可用),需在回调中增加对网络状态的判断。
5. 针对性断点调试
- 在生物识别类的核心方法(如验证触发、回调处理)添加断点,同时在
NetworkMonitor的状态更新代码处添加断点,观察断网后两者的执行时序,确认是否存在状态冲突。 - 开启
Zombie Objects后,模拟崩溃流程,查看控制台是否有“发送消息给已释放对象”的提示,定位具体的野指针来源。
内容的提问来源于stack exchange,提问作者Pooja
相关产品推荐
相关产品推荐

