Android SEGV_ACCERR房间创建后谷歌游戏服务
我正在用Cocos2d-x和googleplay游戏服务为网络编写游戏。 我正在使用以下代码创建一个实时房间:Android SEGV_ACCERR房间创建后谷歌游戏服务,android,c++,cocos2d-x,google-play-games,Android,C++,Cocos2d X,Google Play Games,我正在用Cocos2d-x和googleplay游戏服务为网络编写游戏。 我正在使用以下代码创建一个实时房间: auto scene = BattleScene::createScene(); BattleScene *layer; if (scene->getChildByName("layer")) { layer = static_cast<BattleScene *>(scene->getChildByName("layer"));
auto scene = BattleScene::createScene();
BattleScene *layer;
if (scene->getChildByName("layer")) {
layer = static_cast<BattleScene *>(scene->getChildByName("layer"));
} else {
log("Cannot get layer!");
return;
}
log("Creating room...");
auto gameServices = StateManager::getGameServices();
gpg::RealTimeRoomConfig config = gpg::RealTimeRoomConfig::Builder()
.SetMinimumAutomatchingPlayers(1)
.SetMaximumAutomatchingPlayers(1)
.Create();
log("config created");
gameServices->RealTimeMultiplayer().CreateRealTimeRoom(
config, layer,
[&](gpg::RealTimeMultiplayerManager::RealTimeRoomResponse const
&response) {
log("created a room %d", response.status);
if (gpg::IsSuccess(response.status)) {
gameServices->RealTimeMultiplayer().ShowWaitingRoomUI(
response.room, 1,
[&](gpg::RealTimeMultiplayerManager::
WaitingRoomUIResponse const &wait_response) {
log("WaitingRoomUIResponse");
if (IsSuccess(wait_response.status)) {
log("Game started");
Director::getInstance()->replaceScene(scene);
}
});
} else
log("Error1");
});
auto-scene=BattleScene::createScene();
战场*层;
如果(场景->getChildByName(“层”)){
层=静态_投射(场景->getChildByName(“层”);
}否则{
日志(“无法获取层!”);
返回;
}
日志(“创建房间…”);
auto gameServices=StateManager::getGameServices();
gpg::RealTimeRoomConfig config=gpg::RealTimeRoomConfig::Builder()
.SetMinimumAutoMatchingPlayer(1)
.SetMaximumAutoMatchingPlayer(1)
.Create();
日志(“配置已创建”);
gameServices->RealTimeMultiplayer().CreateRealTimeRoom(
配置,层,
[&](gpg::RealTimeMultiplayerManager::RealTimeRoomResponse常量
&(答复){
日志(“创建了房间%d”,响应状态);
if(gpg::issucess(response.status)){
gameServices->RealTimeMultiplayer().ShowWaitingRoomUI(
答复:1号会议室,
[&](gpg::RealTimeMultiplayerManager::
WaitingRoomUIResponse常量和wait_响应){
日志(“WaitingRoomUIResponse”);
if(IsSuccess(等待响应状态)){
日志(“游戏开始”);
Director::getInstance()->ReplaceSecene(场景);
}
});
}否则
日志(“错误1”);
});
但随后(当第二个播放器连接时)应用程序因该日志而失败:
signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 00584918
Stack frame #00 pc 00584918 [heap]
Stack frame #01 pc 004d4526 /data/data/com.railon.luck/lib/libMyGame.so: Routine std::_Function_handler<void (gpg::RealTimeRoom const&, gpg::MultiplayerParticipant const&), gpg::RealTimeEventListenerHelperImpl::RealTimeEventListenerHelperImpl(gpg::IRealTimeEventListener*)::{lambda(gpg::RealTimeRoom const&, gpg::MultiplayerParticipant const&)#5}>::_M_invoke(std::_Any_data const&, gpg::RealTimeRoom const&, gpg::MultiplayerParticipant const&) at libgcc2.c:?
Stack frame #02 pc 004ec9c8 /data/data/com.railon.luck/lib/libMyGame.so (_ZNKSt8functionIFvRKN3gpg12RealTimeRoomERKNS0_22MultiplayerParticipantEEEclES3_S6_): Routine std::function<void (gpg::RealTimeRoom const&, gpg::MultiplayerParticipant const&)>::operator()(gpg::RealTimeRoom const&, gpg::MultiplayerParticipant const&) const at ??:?
Stack frame #03 pc 004eca08 /data/data/com.railon.luck/lib/libMyGame.so: Routine std::_Function_handler<void (), gpg::RealTimeEventListenerHelperImpl::WrappedRealTimeEventListener::OnParticipantStatusChanged(gpg::RealTimeRoom const&, gpg::MultiplayerParticipant const&)::{lambda()#1}>::_M_invoke(std::_Any_data const&) at libgcc2.c:?
Stack frame #04 pc 00509f6a /data/data/com.railon.luck/lib/libMyGame.so: Routine gpg::PlatformExecuteOperation(std::function<void ()> const&) at libgcc2.c:?
信号11(SIGSEGV),代码2(SEGV_ACCERR),故障地址00584918
堆栈帧#00 pc 00584918[堆]
堆栈帧#01 pc 004d4526/data/data/com.railon.luck/lib/libMyGame.so:Routine std:_Function_handler::_M_invoke(std:_Any_data const&,gpg::RealTimeRoom const&,gpg::multiplayerpartiparticipant const&)在libgcc2.c:?
堆栈帧#02 pc 004ec9c8/data/data/com.railon.luck/lib/libMyGame.so(_ZNKSt8functionIFvRKN3gpg12RealTimeRoomERKNS0_22多层参与者eecles3_S6):例程std::function::operator()(gpg::RealTimeRoom const&,gpg::多层参与者const&)const at?
堆栈帧#03 pc 004eca08/data/data/com.railon.luck/lib/libMyGame.so:例程std::_函数_处理程序::_M_调用(std:_Any_data const&)在libgcc2.c:?
堆栈帧#04 pc 00509f6a/data/data/com.railon.luck/lib/libMyGame.so:libgcc2.c上的例程gpg::PlatformExecuteOperation(std::function const&)?
问题似乎出现在BattleSceneClass
中的OnParticipantStatusChanged
func中,但即使该func为空,也会出现错误
你有什么想法吗?
是的,
BattleScene
在父母中有IRealTimeEventListener
。如果你使用ndk堆栈
并将一个包含整个跟踪的文件传递给它,从***
开始,你可能会得到一个改进的回溯。@TankorSmash不幸的是,它是ndk堆栈的输出(我在其中传递了logcat结果)哦,糟糕,我通常会得到文件路径。@TankorSmash在其他情况下,我有完整的文件路径可以销毁场景吗?“自动场景”变量的范围是什么?如果您不声明它而是静态的,它的行为是否会有所不同?是否有其他方法可以销毁层对象,从而使回调地址无效?如果您使用ndk堆栈,并将一个包含整个跟踪的文件传递给它,从***
开始,您可能会得到一个改进的回溯。@TankorSmash不幸的是,它是ndk堆栈的输出(我在其中传递了logcat结果)哦,糟糕,我通常会得到文件路径。@TankorSmash在其他情况下,我有完整的文件路径可以销毁场景吗?“自动场景”变量的范围是什么?如果您不声明它而是静态的,它的行为是否会有所不同?是否有其他方法可以销毁层对象,从而使回调地址无效?