2.0.10 AudioEngineImpl崩溃

  • Creator 版本:2.0.10

  • 目标平台: IOS

  • 重现方式:切前后台

  • 出现概率:不是必现 堆栈是bugly上收集的

  • 额外线索: 切后台的时候调用了cc.audioEngine.stopAll();

0 std::__1::__hash_table<std::__1::__hash_value_type<int, cocos2d::AudioPlayer*>, std::__1::__unordered_map_hasher<int, std::__1::__hash_value_type<int, cocos2d::AudioPlayer*>, std::__1::hash, true>, std::__1::__unordered_map_equal<int, std::__1::__hash_value_type<int, cocos2d::AudioPlayer*>, std::__1::equal_to, true>, std::__1::allocator<std::__1::__hash_value_type<int, cocos2d::AudioPlayer*> > >::remove(std::__1::__hash_const_iterator<std::__1::__hash_node<std::__1::__hash_value_type<int, cocos2d::AudioPlayer*>, void*>>) + 56
1 std::__1::__hash_table<std::__1::__hash_value_type<int, cocos2d::AudioPlayer
>, std::__1::__unordered_map_hasher<int, std::__1::__hash_value_type<int, cocos2d::AudioPlayer*>, std::__1::hash, true>, std::__1::__unordered_map_equal<int, std::__1::__hash_value_type<int, cocos2d::AudioPlayer*>, std::__1::equal_to, true>, std::__1::allocator<std::__1::__hash_value_type<int, cocos2d::AudioPlayer*> > >::erase(std::__1::__hash_const_iterator<std::__1::__hash_node<std::__1::__hash_value_type<int, cocos2d::AudioPlayer*>, void*>*>) + 28
2 cocos2d::AudioEngineImpl::update(float) + 136
3 cocos2d::TimerTargetCallback::trigger(float) + 40
4 cocos2d::timer::update(float) + 196
5 cocos2d::Scheduler::update(float) + 120
6 -[MainLoop doCaller:] + 140

@337031709 @huanxinyin 大佬 有时间帮忙看下 谢谢

2.0.10 已经不更新了,建议升级到2.2版本,看下能否复现

@huanxinyin 目前由于一些原因没办法升级项目 请问可以提供一下这个crash的查找思路么 例如如何调用会产生这种情况 我好去检查代码 由于代码比较多 目前查起来效率太低了

可能跟这个有关系,你看下这个修复
https://github.com/cocos-creator/cocos2d-x-lite/issues/1958

好的 非常感谢

@huanxinyin 看了下修复的代码

首先 2.0.10 是没有 AudioEngine::onEnterBackground 和 AudioEngine::onEnterForeground 这2个方法的 而且这里面的实现逻辑是 进入后台将正在播放的暂停并缓存起来 切回来的时候 在恢复播放 和我这边的需求不太一致 我这边要求只要切后台 那就stop所有 回来不用恢复 所以我这边没有合并这2个方法

其次是AudioEngine-inl.mm 我看最新的版本是新增了 _checkAudioIdValid 这个方法
bool AudioEngineImpl::_checkAudioIdValid(int audioID) {
return _audioPlayers.find(audioID) != _audioPlayers.end();
}
实现上和这条 https://github.com/cocos-creator/cocos2d-x-lite/pull/1930/files 也不态一致 所以选择和并最新版的这个方法的修复

想问下 如果单独合并这个修复 在没有切回来恢复的需求 是不是也可以修复这个问题呢

谢谢

同崩溃,先回复一下

跟这个问题应该是一样,可以先自己试着合并
https://github.com/cocos-creator/cocos2d-x-lite/pull/2358