使用AVAudioSession搭配AVAudioEngine时Notify Thread崩溃问题咨询
AVAudioSession搭配AVAudioEngine崩溃问题分析
堆栈中两次InterruptionListener的成因
- 这不是回调在返回前被重复调用,也不属于并发问题。堆栈中出现两次相同函数名,是系统底层库编译时的尾调用优化、或者符号回溯时的地址偏移计算偏差导致的重复符号展示,实际该函数仅被调用了一次。
- 崩溃发生在系统专属的
AVAudioSession Notify Thread,这是串行RunLoop线程,所有音频会话回调都会在该线程串行派发,不存在同一时间触发多次回调的并发场景。
该崩溃的常见触发原因
崩溃发生在系统调用音频中断监听器的阶段,常见的触发点有两类:
- 主动注册的AVAudioSession中断通知逻辑存在野指针,比如销毁音频相关对象时没有提前移除中断监听,回调触发时访问了已经释放的对象。
- 中断回调逻辑中直接执行了AVAudioEngine启停、音频链修改、AVAudioSession激活/失活等重操作,和其他线程的音频操作产生了状态冲突。
对应崩溃堆栈如下:
Crashed: AVAudioSession Notify Thread 0 libEmbeddedSystemAUs.dylib 0x1dbc3333c InterruptionListener(void*, unsigned int, unsigned int, void const*) 1 libEmbeddedSystemAUs.dylib 0x1dbc33270 InterruptionListener(void*, unsigned int, unsigned int, void const*) 2 AudioToolbox 0x1c86e6484 AudioSessionPropertyListeners::CallPropertyListeners(unsigned int, unsigned int, void const*) + 596 3 AudioToolbox 0x1c8740798 HandleAudioSessionCFTypePropertyChangedMessage(unsigned int, unsigned int, void*, unsigned int) + 1144 4 AudioToolbox 0x1c873fec0 ProcessDeferredMessage(unsigned int, __CFData const*, unsigned int, unsigned int) + 2452 5 AudioToolbox 0x1c873f17c ASCallbackReceiver_AudioSessionPingMessage + 632 6 AudioToolbox 0x1c87ad398 _XAudioSessionPingMessage + 44 7 libAudioToolboxUtility.dylib 0x1c8840430 mshMIGPerform + 264 8 CoreFoundation 0x1bd42b174 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 56 9 CoreFoundation 0x1bd42a880 __CFRunLoopDoSource1 + 444 10 CoreFoundation 0x1bd425634 __CFRunLoopRun + 1888 11 CoreFoundation 0x1bd424ba8 CFRunLoopRunSpecific + 424 12 AVFAudio 0x1ca1f4a2c GenericRunLoopThread::Entry(void*) + 156 13 AVFAudio 0x1ca2457a0 CAPThread::Entry(CAPThread*) + 204 14 libsystem_pthread.dylib 0x1bd1c2d98 _pthread_start + 156 15 libsystem_pthread.dylib 0x1bd1c674c thread_start + 8
修复建议
- 检查所有AVAudioSession中断通知的监听逻辑,确保持有监听的对象销毁前主动移除监听,避免野指针访问。
- 中断回调中不要直接执行AVAudioEngine启停、音频Session激活/失活等重操作,建议将这类操作派发到主线程或者专属音频串行队列执行,同时做好状态标记,避免重复执行操作。
- 若没有主动注册过InterruptionListener,说明是AVAudioEngine内部的中断处理出现状态冲突,需要检查是否在音频会话已经被系统中断的场景下,仍在操作AVAudioEngine的输入输出节点、修改音频格式。
内容的提问来源于stack exchange,提问作者Dan Halliday
相关产品推荐
相关产品推荐

