lambda回调中Android Cocos2D-X应用程序上的SEG故障

Seg fault on Android Cocos2D-x app in lambda callback

本文关键字:程序上 SEG 故障 应用程序 应用 回调 Android Cocos2D-X lambda      更新时间:2023-10-16

我在cocos2d-x游戏的Android版本中遇到了一个奇怪的崩溃问题。

在许多地方,我有回调在完成其他操作时执行的回调,如下调用:

playAnimationOnce(animationName, [this] {
    m_animationStateMachine->changeState(TWITCHING_ANIM_STATE);
    m_stateMachine->changeState(DEAD);
});

在Android上,m_animationStateMachine可以很好地更改状态,但是,对m_stateMachine进行任何参考是造成崩溃的,特别是:

signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x3f800044
Stack frame #00 pc 008ed5ec  /data/app/com.bundleID.appname/lib/arm/libcocos2dcpp.so (_ZN12StateMachine11changeStateEPK5StatePKv+52): Routine StateMachine::changeState(State const*, void const*) at /path/to/project/proj.android-studio/app/jni/../../../Platform/Util/StateMachine.cpp:158
Stack frame #01 pc 007ef73c  /data/app/com.bundleID.appname/lib/arm/libcocos2dcpp.so: Routine operator() at /path/to/project/proj.android-studio/app/jni/../../../Source/Actors/Hero.cpp:1291

游戏在iOS上正常工作。我什至已经在iOS的XCode上介绍了回调的执行,并验证了该对象在iOS上有效。

我没有办法在Android上使用调试器,因此我不能比日志语句更好地检查每个变量。


我已经尝试过的事情:

  • 使用[&]而不是[this]
  • 捕获
  • 仅使用两个状态制作StateMachine的全新实例,这也导致崩溃。

还有我目前忘记的其他几件事。随时向我发送所有建议,我不知道会导致这一点。

我弄清楚了。

我仍然不知道Android会引起问题,因此,如果您这样做,请告诉我。

本质上,执行m_animationStateMachine->changeState时,新的动画会播放当前运行动画的新动画,并使用COCOS2D-X方法清除动画回调。

我相信,这会导致m_animationStateMachine->changeState之后的所有线路在某些不确定的上下文中执行。

我通过使m_animationStateMachine->changeState成为回调的最后一行,并在播放新动画之前更改类状态。


将此作为答案,以便我可以在几天内解决这个问题,也许将来对其他人有帮助。