작성
·
207
0
7강 마무리 서버코드를 받아서 릴리즈로 실행하기 위한 작업을 몇가지 한뒤에,
로컬에서 돌려서 정상작동하는걸 확인하고, aws에 올려서 테스트 했습니다만, 서버쪽에선 이상한 곳에서 함수 동작이 멈춰버리고, 클라쪽에선 접속하고 캐릭터가 스폰되지 않아 배경만 덩그러니 있습니다.
멀티스레딩 비동기 프로그래밍에 익숙하지 않은 저로선 전혀 예상이 안가는 이상한 동작을 하여 질문드립니다.
aws에서 인바운드규칙 설정하였고, public IP DNS로 Liseten걸어놨습니다.
1) 클라쪽 동작 로그
2) 서버쪽 동작 로그
3. 이상 동작을 확인하기위해 함수 한줄마다 Log를 찍어놨습니다.
public void EnterGame(GameObject gameObject)
{
int checkCount = 0;
Console.WriteLine($"EnterGame{++checkCount} int checkCount = 0;");
if (gameObject == null)
return;
Console.WriteLine($"EnterGame{++checkCount} if (gameObject == null)");
GameObjectType type = ObjectManager.GetObjectTypeById(gameObject.Id);
if (type == GameObjectType.Player)
{
Console.WriteLine($"EnterGame{++checkCount} if (type == GameObjectType.Player)");
Player player = gameObject as Player;
Console.WriteLine($"EnterGame{++checkCount} Player player = gameObject as Player");
_players.Add(gameObject.Id, player);
Console.WriteLine($"EnterGame{++checkCount} _players.Add");
player.Room = this;
Console.WriteLine($"EnterGame{++checkCount} player.Room = this;");
Map.ApplyMove(player, new Vector2Int(player.CellPos.x, player.CellPos.y));
Console.WriteLine($"EnterGame{++checkCount} Map.ApplyMove");
// 본인한테 정보 전송
{
Console.WriteLine($"EnterGame{++checkCount} ---------- me -----------");
S_EnterGame enterPacket = new S_EnterGame();
Console.WriteLine($"EnterGame{++checkCount} new S_EnterGame()");
enterPacket.Player = player.Info;
Console.WriteLine($"EnterGame{++checkCount} enterPacket.Player = player.Info");
player.Session.Send(enterPacket);
Console.WriteLine($"player.Session.Send(enterPacket); {enterPacket.Player}");
S_Spawn spawnPacket = new S_Spawn();
Console.WriteLine($"S_Spawn spawnPacket = new S_Spawn(); {enterPacket.Player}");
foreach (Player p in _players.Values)
{
if (player != p)
spawnPacket.Objects.Add(p.Info);
}
Console.WriteLine($"EnterGame{++checkCount}");
foreach (Monster m in _monsters.Values)
spawnPacket.Objects.Add(m.Info);
foreach (Projectile p in _projectiles.Values)
spawnPacket.Objects.Add(p.Info);
player.Session.Send(spawnPacket);
}
}
else if (type == GameObjectType.Monster)
{
Monster monster = gameObject as Monster;
_monsters.Add(gameObject.Id, monster);
monster.Room = this;
Map.ApplyMove(monster, new Vector2Int(monster.CellPos.x, monster.CellPos.y));
}
else if (type == GameObjectType.Projectile)
{
Projectile projectile = gameObject as Projectile;
_projectiles.Add(gameObject.Id, projectile);
projectile.Room = this;
}
// 타인한테 정보 전송
{
Console.WriteLine($"EnterGame{++checkCount} ---------- other -----------");
S_Spawn spawnPacket = new S_Spawn();
spawnPacket.Objects.Add(gameObject.Info);
Console.WriteLine($"EnterGame{++checkCount} spawnPacket.Objects.Add(gameObject.Info);");
foreach (Player p in _players.Values)
{
if (p.Id != gameObject.Id)
p.Session.Send(spawnPacket);
}
}
}
답변 1
1
라이브에서 운영하려면 crash dump를 남겨서
크래시날 때의 상황에 히스토리를 추출해야 합니다.
.NET crash dump 관련해서 검색하면 다양한 방법이 나옵니다.
위와 같은 설정이 귀찮으면,
개발 단계에서는 aws에서 그냥 visual studio를 설치해서 띄우시면 세상 편합니다.
보통은 null 크래시 등이나 네트워크 exception 처리 누락한 등의 상황 때문에 터지는 경우가 많을거에요.
위 내용만으로는 정확한 원인을 저도 알기 힘듭니다.
클라가 재접하면 Connect는 된다면, 문제 상황에 대해 Exception 처리를 해줘서
그런 것일 수도 있고 다양한 원인이 있겠네요.
처음엔 VS로 하시면 기존과 동일하니 보기가 편합니다.
그리고 그 정도로 사용량이 폭발하진 않습니다.
프리티어가 사용량도 실시간으로 체크할 수 있으니
다 사용했으면 EC2를 내려주시면 됩니다.
감사합니다. 자꾸 수정을해버려서 답변을 꼬이게 만들어버렸네요. 작은거에 신경을 많이 쓰는 타입이라;;
전체 솔루션 검색했을때 눈에보이는 try catch 로 잡는 부분도 없어서 당혹스럽습니다.
일단 aws에 비주얼스튜디오 설치 해보겠습니다. 다운로드 속도가 엄청 느리던데 오늘 하루안에 디버깅이 가능할지 모르겠습니다 ^^;
ㅋㅋ 네 좀 오래 걸릴 수 있어요.
아무튼 긍정적인 소식을 전해드리자면,
Part9 코드 기반으로 토이 프로젝트 만들어서 연초에 안드로이드 출시까지 해봤는데
AWS 잘 붙었고 아무런 문제 없이 몇일 동안 잘 굴러갔었습니다. (일부 NULL 크래시 제외)
답변 감사합니다.
서버가 터지는건 아니고, 클라이언트가 다시 접속하면 Connect는 계속 받습니다.
터지지 않아도 crashDump로 로그가 남나요?
함수가 중간에 실행만 중단되고 나머지는 정상동작하는 거라서 디버깅을 어떻게 해야될지 감이 안옵니다.
만약에 다른쓰레드에서 건드리는거라면 break point잡아서 디버깅하는것도 쉽지않아 보이는데, 멀티쓰레드 디버깅하는 색다른 방법이 있을까요?
혹시 ec2 프리티어가 기간제로 알고는 있는데 혹시나 비주얼스튜디오같은 대용량 파일을 다운로드하면 추가요금이 나올 가능성이 있을까요?