cocos creator 1.9版本 调用EventDispatcher::setDirty方法 crash

  • Creator 版本:1.9

  • 目标平台:window 用vs2015编译, 其他平台没测试

  • 详细报错信息,包含调用堆栈:

    libcocos2d.dll!std::_Hash_seq(const unsigned char * _First, unsigned int _Count) 行 351 C++
    libcocos2d.dll!std::hash<std::basic_string<char,std::char_traits,std::allocator > >::operator()(const std::basic_string<char,std::char_traits,std::allocator > & _Keyval) 行 2649 C++
    libcocos2d.dll!std::_Uhash_compare<std::basic_string<char,std::char_traits,std::allocator >,std::hash<std::basic_string<char,std::char_traits,std::allocator > >,std::equal_to<std::basic_string<char,std::char_traits,std::allocator > > >::operator()(const std::basic_string<char,std::char_traits,std::allocator > & _Keyval) 行 115 C++
    libcocos2d.dll!std::_Hash<std::_Umap_traits<std::basic_string<char,std::char_traits,std::allocator >,enum cocos2d::EventDispatcher::DirtyFlag,std::_Uhash_compare<std::basic_string<char,std::char_traits,std::allocator >,std::hash<std::basic_string<char,std::char_traits,std::allocator > >,std::equal_to<std::basic_string<char,std::char_traits,std::allocator > > >,std::allocator<std::pair<std::basic_string<char,std::char_traits,std::allocator > const ,enum cocos2d::EventDispatcher::DirtyFlag> >,0> >::_Hashval(const std::basic_string<char,std::char_traits,std::allocator > & _Keyval) 行 859 C++
    libcocos2d.dll!std::_Hash<std::_Umap_traits<std::basic_string<char,std::char_traits,std::allocator >,enum cocos2d::EventDispatcher::DirtyFlag,std::_Uhash_compare<std::basic_string<char,std::char_traits,std::allocator >,std::hash<std::basic_string<char,std::char_traits,std::allocator > >,std::equal_to<std::basic_string<char,std::char_traits,std::allocator > > >,std::allocator<std::pair<std::basic_string<char,std::char_traits,std::allocator > const ,enum cocos2d::EventDispatcher::DirtyFlag> >,0> >::lower_bound(const std::basic_string<char,std::char_traits,std::allocator > & _Keyval) 行 593 C++
    libcocos2d.dll!std::_Hash<std::_Umap_traits<std::basic_string<char,std::char_traits,std::allocator >,enum cocos2d::EventDispatcher::DirtyFlag,std::_Uhash_compare<std::basic_string<char,std::char_traits,std::allocator >,std::hash<std::basic_string<char,std::char_traits,std::allocator > >,std::equal_to<std::basic_string<char,std::char_traits,std::allocator > > >,std::allocator<std::pair<std::basic_string<char,std::char_traits,std::allocator > const ,enum cocos2d::EventDispatcher::DirtyFlag> >,0> >::find(const std::basic_string<char,std::char_traits,std::allocator > & _Keyval) 行 577 C++

libcocos2d.dll!cocos2d::EventDispatcher::setDirty(const std::basic_string<char,std::char_traits,std::allocator > & listenerID, cocos2d::EventDispatcher::DirtyFlag flag) 行 1498 C++
libcocos2d.dll!cocos2d::EventDispatcher::updateDirtyFlagForSceneGraph() 行 1218 C++
libcocos2d.dll!cocos2d::EventDispatcher::dispatchEvent(cocos2d::Event * event) 行 818 C++
libcocos2d.dll!cocos2d::Director::drawScene() 行 312 C++
libcocos2d.dll!cocos2d::Director::mainLoop() 行 1443 C++
libcocos2d.dll!cocos2d::Application::run() 行 112 C++
youxia.exe!wWinMain(HINSTANCE__ * hInstance, HINSTANCE__ * hPrevInstance, wchar_t * lpCmdLine, int nCmdShow) 行 26 C++

  • 重现方式:随机

  • 之前哪个版本是正常的 :

  • 手机型号 :

  • 手机浏览器 :

  • 编辑器操作系统 win10:

  • 编辑器之前是否有其它报错 :

  • 出现概率:比较经常, 随机闪退

  • 额外线索:
    原因是调用到这个函数
    void EventDispatcher::updateDirtyFlagForSceneGraph()
    {
    if (!_dirtyNodes.empty())
    {
    for (auto& node : _dirtyNodes)
    {
    auto iter = _nodeListenersMap.find(node);
    if (iter != _nodeListenersMap.end())
    {
    for (auto& l : *iter->second)
    {
    setDirty(l->getListenerID(), DirtyFlag::SCENE_GRAPH_PRIORITY);
    }
    }
    }

      _dirtyNodes.clear();
    

    }
    }

其中的
setDirty(l->getListenerID(), DirtyFlag::SCENE_GRAPH_PRIORITY);
这句的 ‘l’ 这个变量是野指针. 从局部变量观察. 他的_referenceCount == 0.

补充下. 其中
auto iter = _nodeListenersMap.find(node);
的node是个ClippingNode. _referenceCount == 1
_parent 为NULL
_children的数量为0

有Mask遮罩的时候播放动画比较容易出现,还不知道怎么处理

查了几天. 发现Mask组件, 和Button组件. 以及cc.Node.EventType.TOUCH_START事件对于同一个节点使用, 就容易出现这样的bug. 看开发团队的大大能查下不.

顶起:stuck_out_tongue:

我在android平台也遇到了相关问题。
keys' Revision: '0' ABI: 'arm' pid: 17827, tid: 17853, name: GLThread 10660 >>> com.game.demo <<< signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xfffffff4 r0 c6f7331c r1 c6f7331c r2 00000002 r3 fffffff4 r4 00000000 r5 13300b18 r6 000f4240 r7 ca97ce40 r8 00000000 r9 cb21e400 r10 ca97ce70 r11 ca97ccfc ip ca3b82e5 sp ca97cce8 lr c91487bc pc ca3b82e8 08-15 11:31:41.159 18117-18117/? A/DEBUG: backtrace: #00 pc 01ab42e8 /data/app/com.game.demo-S5hZARA_GEgopNkhZYc_4A==/lib/arm/libcocos2djs.so #01 pc 008447b8 /data/app/com.game.demo-S5hZARA_GEgopNkhZYc_4A==/lib/arm/libcocos2djs.so (std::hash<std::string>::operator()(std::string const&) const+36) #02 pc 017d5b98 /data/app/com.game.demo-S5hZARA_GEgopNkhZYc_4A==/lib/arm/libcocos2djs.so (std::__detail::_Hash_code_base<std::string, std::pair<std::string const, cocos2d::EventDispatcher::DirtyFlag>, std::__detail::_Select1st, std::hash<std::string>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, true>::_M_hash_code(std::string const&) const+40) #03 pc 017d124c /data/app/com.game.demo-S5hZARA_GEgopNkhZYc_4A==/lib/arm/libcocos2djs.so (_ZNSt10_HashtableISsSt4pairIKSsN7cocos2d15EventDispatcher9DirtyFlagEESaIS5_ENSt8__detail10_Select1stESt8equal_toISsESt4hashISsENS7_18_Mod_range_hashingENS7_20_Default_ranged_hashENS7_20_Prime_rehash_policyENS7_17_Hashtable_traitsILb1ELb0ELb1EEEE4findERS1_+52) #04 pc 017cdb98 /data/app/com.game.demo-S5hZARA_GEgopNkhZYc_4A==/lib/arm/libcocos2djs.so (_ZNSt13unordered_mapISsN7cocos2d15EventDispatcher9DirtyFlagESt4hashISsESt8equal_toISsESaISt4pairIKSsS2_EEE4findERS8_+32) #05 pc 017cb57c /data/app/com.game.demo-S5hZARA_GEgopNkhZYc_4A==/lib/arm/libcocos2djs.so (cocos2d::EventDispatcher::setDirty(std::string const&, cocos2d::EventDispatcher::DirtyFlag)+64) #06 pc 017ca384 /data/app/com.game.demo-S5hZARA_GEgopNkhZYc_4A==/lib/arm/libcocos2djs.so (cocos2d::EventDispatcher::updateDirtyFlagForSceneGraph()+332) #07 pc 017c8698 /data/app/com.game.demo-S5hZARA_GEgopNkhZYc_4A==/lib/arm/libcocos2djs.so (cocos2d::EventDispatcher::dispatchEvent(cocos2d::Event*)+176) #08 pc 017bc63c /data/app/com.game.demo-S5hZARA_GEgopNkhZYc_4A==/lib/arm/libcocos2djs.so (cocos2d::Director::drawScene()+188)