Xcode 14 beta运行时Firebase Database触发QoS线程等待报错
问题现象
应用在Xcode 13环境下运行状态正常,从未触发该类错误,但在Xcode 14 beta版本中运行时,收到来自Firebase Database的报错:QOS_CLASS_USER_INITIATED waiting on a lower QoS thread running at QOS_CLASS_DEFAULT
错误堆栈回溯
Backtrace ================================================================= 3 FirebaseDatabase 0x000000011267c6eb -[_FSRRunLoopThread runLoop] + 43 4 FirebaseDatabase 0x000000011267c443 __45+[NSRunLoop(FSRWebSocket) FSR_networkRunLoop]_block_invoke + 115 5 libdispatch.dylib 0x00000001198eefeb _dispatch_client_callout + 8 6 libdispatch.dylib 0x00000001198f0645 _dispatch_once_callout + 66 7 FirebaseDatabase 0x000000011267c39e +[NSRunLoop(FSRWebSocket) FSR_networkRunLoop] + 78 8 FirebaseDatabase 0x00000001126758be -[FSRWebSocket _connect] + 78 9 FirebaseDatabase 0x0000000112674562 -[FSRWebSocket open] + 258 10 FirebaseDatabase 0x00000001126a409e -[FWebSocketConnection open] + 270 11 FirebaseDatabase 0x0000000112614268 -[FConnection open] + 120 12 FirebaseDatabase 0x000000011264ed4a -[FPersistentConnection openNetworkConnectionWithContext:] + 698 13 FirebaseDatabase 0x000000011264e92b __45-[FPersistentConnection tryScheduleReconnect]_block_invoke_2 + 347 14 FirebaseDatabase 0x000000011262671e __80-[FIRDatabaseConnectionContextProvider fetchContextForcingRefresh:withCallback:]_block_invoke.87 + 110 15 libdispatch.dylib 0x00000001198edda8 _dispatch_call_block_and_release + 12 16 libdispatch.dylib 0x00000001198eefeb _dispatch_client_callout + 8 17 libdispatch.dylib 0x00000001198f6dd1 _dispatch_lane_serial_drain + 1064 18 libdispatch.dylib 0x00000001198f7bab _dispatch_lane_invoke + 441 19 libdispatch.dylib 0x0000000119905f63 _dispatch_workloop_worker_thread + 959 20 libsystem_pthread.dylib 0x0000000119efcfd0 _pthread_wqthread + 326 21 libsystem_pthread.dylib 0x0000000119efbf57 start_wqthread + 15
错误原因
- 该报错是Xcode 14新增的线程性能检测工具
Thread Performance Checker触发的优先级倒置告警,Xcode 13未默认开启该类QoS违规的强检测,因此不会弹出提示。 - 问题根源在旧版本Firebase Database SDK的内部线程调度逻辑:SDK通过
dispatch_once初始化全局网络RunLoop单例时,初始化任务默认运行在QOS_CLASS_DEFAULT优先级线程,但调用初始化逻辑的代码运行在优先级更高的QOS_CLASS_USER_INITIATED线程,高优先级线程同步阻塞等待低优先级线程完成任务,触发了QoS优先级倒置的检测规则。 - 从堆栈调用链可明确,问题完全出在Firebase SDK内部实现,和上层业务代码无关,该提示本身不会导致应用崩溃,仅在调试阶段触发。
修复方案
- 最优方案是升级Firebase SDK:Firebase官方已在后续版本修复该线程调度问题,升级至9.0.0及以上稳定版本即可解决问题,无需修改任何业务代码。
- 若暂时无法升级SDK,可临时关闭检测屏蔽提示:打开Xcode的
Edit Scheme菜单,选择Run->Diagnostics标签,取消勾选Thread Performance Checker选项即可。注意这只是临时调试规避手段,不建议长期关闭该检测,该检测可以有效发现业务代码中的线程性能问题。 - 禁止通过swizzle等手段自行修改Firebase SDK内部的线程QoS等级,极易引发不可预期的线程安全问题。
内容的提问来源于stack exchange,提问作者Hitarth Bhatt
相关产品推荐
相关产品推荐

