Xcode出现Thread 10: EXC_BREAKPOINT崩溃,无法定位代码求帮助
主线程外UI操作导致的dispatch断言崩溃排查
错误日志
Xcode调试窗口输出以下错误:
2023-06-06 07:46:15.412684-0500 Courier[8456:442818] [LayoutConstraints] Unsupported layout off the main thread for _UIModernBarButton with nearest ancestor view controller, UINavigationController 2023-06-06 07:46:15.413268-0500 Courier[8456:442818] [Assert] -[UIImageView _invalidateImageLayouts] must be called on the main queue 2023-06-06 07:46:15.413730-0500 Courier[8456:442818] [Assert] -[UIImageView _layoutForImage:inSize:cachePerSize:forBaselineOffset:] must be called on the main queue (lldb)
崩溃现场信息
- 编辑器红色提示栏:
Thread 10: EXC_BREAKPOINT (code=1, subcode=0x10515fd44)
- 调试导航器中代码停在:
#0 0x000000010515fd44 in _dispatch_assert_queue_fail ()
- 对应汇编代码:
0x10515fd10 <+68>: add x9, x9, #0xf2f ; "BUG IN CLIENT OF LIBDISPATCH: Assertion failed: " 0x10515fd14 <+72>: stp x9, x8, [sp] 0x10515fd18 <+76>: adrp x1, 65 0x10515fd1c <+80>: add x1, x1, #0xefa ; "%sBlock was %sexpected to execute on queue [%s (%p)]" 0x10515fd20 <+84>: sub x0, x29, #0x18 0x10515fd24 <+88>: bl 0x10519cfc8 ; symbol stub for: asprintf 0x10515fd28 <+92>: ldur x19, [x29, #-0x18] 0x10515fd2c <+96>: str x19, [sp] 0x10515fd30 <+100>: adrp x0, 65 0x10515fd34 <+104>: add x0, x0, #0xf65 ; "%s" 0x10515fd38 <+108>: bl 0x1051986b0 ; _dispatch_log 0x10515fd3c <+112>: adrp x8, 98 0x10515fd40 <+116>: str x19, [x8, #0x268] -> 0x10515fd44 <+120>: brk #0x1
当前排查困境
- 无法定位触发错误的代码
- 设置
LayoutConstraints符号断点未触发 - 未收到主线程外操作UI的紫色警告
- 未找到针对性解决方案
运行环境
- 设备:iPhone 13 Pro Max(iOS 16.5)
- Xcode版本:14.3
- Mac系统:Ventura 13.4
解决方案建议
启用主线程检查工具
打开Xcode的Edit Scheme->Run->Diagnostics,勾选Main Thread Checker后重新运行。该工具会精准定位所有主线程外的UI操作代码,直接给出调用栈提示。添加全局异常断点
在断点导航器点击+选择Symbolic Breakpoint,输入objc_exception_throw作为符号。崩溃触发时,查看完整调用栈,找到项目代码中处于非主线程的UI操作逻辑。重点排查导航栏按钮相关代码
错误日志指向_UIModernBarButton,检查:- 异步任务(网络请求、后台计算)中是否有更新导航栏按钮图片、布局或状态的代码
- 自定义导航栏按钮的初始化、配置逻辑,确保所有UI操作通过
DispatchQueue.main.async包裹
检查UIImageView的后台操作
针对UIImageView的断言错误,排查:- 是否在后台线程设置图片、调整frame或约束
- 第三方图片加载库的回调逻辑,确保图片加载完成后在主线程更新UI
展开完整调用栈
崩溃时在调试导航器中展开线程10的调用栈(勾选Show Threads Stack),找到属于自己项目的代码条目,定位具体触发点。
内容的提问来源于stack exchange,提问作者daniel
相关产品推荐
相关产品推荐

