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

AddressSanitizer环境下调用DirectSoundBuffer的Play方法致崩溃

ASAN环境下DirectSoundBuffer::Play崩溃排查方案

在ASAN环境运行程序时调用DirectSoundBuffer::Play崩溃,非ASAN环境正常,且已确认声音对象初始化流程、sound_buffer_指针及关联数据均有效,但崩溃发生在dsound.dll汇编代码中,rdi寄存器值为0。以下是针对性的排查和解决方向:

1. 排查ASAN与DirectSound的兼容性冲突

  • 排除dsound.dll的ASAN检测:DirectSound内部可能存在ASAN无法正确追踪的内存操作,导致误判或破坏对象结构。运行程序前设置环境变量:
    set ASAN_OPTIONS=exclude_modules=dsound.dll
    
    若使用CMake或编译脚本,可在编译阶段添加对应的ASAN参数。
  • 调整ASAN的内存对齐检测:DirectSound对内存对齐有严格要求,ASAN的默认内存分配可能改变了对齐规则。尝试禁用对齐检查:
    set ASAN_OPTIONS=detect_stack_use_after_return=0:strict_string_checks=0:detect_invalid_pointer_pairs=0
    
    或在创建DirectSoundBuffer时,确保WAV数据缓冲区按WAVEFORMATEX要求的字节对齐(比如用_aligned_malloc分配音频数据)。

2. 检查DirectSoundBuffer的生命周期与初始化完整性

  • 验证CreateSoundBuffer的参数正确性:确保DSBUFFERDESC结构体的dwSize字段严格设置为sizeof(DSBUFFERDESC),lpwfxFormat指向的WAVEFORMATEX结构未被提前释放或篡改。例如:
    DSBUFFERDESC desc = {};
    desc.dwSize = sizeof(DSBUFFERDESC);
    desc.lpwfxFormat = &wave_data_.format; // wave_data_需确保生命周期覆盖sound_buffer_
    
  • 排查多线程竞态问题:若存在多线程操作sound_buffer_,ASAN会更敏感地检测到内存竞争。检查是否在Play调用前有其他线程修改或释放了sound_buffer_的内部资源,可添加线程同步机制验证。

3. 解决ASAN堆替换与DirectSound的内存冲突

ASAN会替换系统堆分配函数,而DirectSound可能依赖系统堆的特定行为。尝试以下环境变量调整:

  • 禁用ASAN对内部函数的替换:
    set ASAN_OPTIONS=replace_intrin=0
    
  • 调整ASAN的信号处理方式:
    set ASAN_OPTIONS=use_sigaltstack=0
    

4. 定位rdi=0的深层原因

x64调用约定中rdi通常指向成员函数的this指针,rdi=0说明DirectSoundBuffer的内部this指针无效,可能是ASAN标记的内存区域被破坏:

  • 检查内存越界写入:排查WAV数据加载过程中是否存在缓冲区溢出,ASAN会标记溢出区域为无效,导致DirectSound访问时崩溃。可使用ASAN的__asan_check_buffer工具检测音频数据缓冲区的有效性。
  • 临时解除对象内存检测:若仅用于排查,可手动解除对sound_buffer_内存区域的ASAN检测:
    __asan_unpoison_memory_region(sound_buffer_, sizeof(*sound_buffer_));
    

内容的提问来源于stack exchange,提问作者Sora Aoi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 14:52:17