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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 02:39:03