You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 09:22:45