@main处报EXC_BAD_ACCESS错误,异常断点不显示出错行如何调试
强制Xcode展示崩溃具体位置的调试方案
- 开启僵尸对象诊断:打开Xcode的Scheme编辑界面(快捷键
⌘ + <),切换到Run - Diagnostics标签,勾选Zombie Objects。EXC_BAD_ACCESS (code=2) 代表尝试向非法内存地址写入数据,大多是访问已释放对象、属性访问冲突导致,开启后崩溃时会打印对应僵尸对象的信息和完整调用栈。 - 添加全范围断点:除了默认的Swift/OC异常断点,额外添加两个符号断点:
objc_exception_throw、malloc_error_break,可以捕获到默认异常断点漏抓的底层异常触发点。 - 手动解析调用栈:崩溃后打开左侧Debug导航栏,找到Thread 1的完整调用栈列表,忽略系统框架的符号,找到带你的项目名称的符号行,点击即可跳转到对应的业务代码位置。
当前场景排查思路
你给出的崩溃发生在@main入口,且代码中使用了@AppStorage属性包装器,可按以下顺序排查:
@main struct Secret0App: App { @AppStorage("isOnboarding") var isOnboarding = true
- 检查
isOnboarding的读写逻辑:如果存在多线程同时读写该值、或者在App初始化完成前就有其他实例提前访问该属性的情况,都可能触发野指针崩溃。 - 回滚最近变更:如果崩溃是新增代码后出现,优先回滚最近修改的App初始化逻辑、根视图逻辑、全局存储相关代码,验证崩溃是否复现。
- 最小化验证:临时注释掉App入口的自定义初始化逻辑、根视图的入参,只保留最简启动代码,逐步恢复逻辑定位触发崩溃的代码块。
内容的提问来源于stack exchange,提问作者Nat Serrano
相关产品推荐
相关产品推荐

