【问题标题】:Seg fault on Android Cocos2D-x app in lambda callbacklambda回调中Android Cocos2D-x应用程序的Seg错误
【发布时间】:2017-06-02 07:01:16
【问题描述】:

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

在很多地方我都有回调,当其他动作完成时执行,像这样调用:

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 上运行良好。我什至已经在 XCode for iOS 上逐步执行了回调,并验证了该对象在 iOS 上是有效的。

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


我已经尝试过的事情:

  • 使用[&] 而不是[this] 进行捕获
  • 创建一个只有两个状态的 StateMachine 的全新实例,这也会导致崩溃。

还有一些我现在忘记的事情。请随时向我发送任何和所有建议,我不知道是什么原因造成的。

【问题讨论】:

    标签: android c++ lambda segmentation-fault cocos2d-x


    【解决方案1】:

    我想通了。

    我仍然不知道 Android 会导致什么问题,所以如果你知道,请告诉我。

    本质上,当m_animationStateMachine->changeState被执行时,会播放一个新的动画,它会清除当前正在运行的动画,并使用cocos2d-x方法来清除动画回调。

    我相信这会导致m_animationStateMachine->changeState 之后的所有行在某些未定义的上下文中执行。

    我通过将m_animationStateMachine->changeState 作为回调的最后一行并在播放新动画之前更改类的状态来解决此问题。


    将此作为答案发布,以便我在几天内解决该问题,也许这对其未来的其他人会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-17
      • 1970-01-01
      • 2014-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多