[UE5] 패키지된 게임 디버그 하는 법
개요
네트워크 기능이 있는 게임을 만들었는데 PIE상에서는 괜찮았는데 패키지를 하니 버그가 발생했다.
이게 네트워크에서 발생한 것인지 아니면 내부 구조 로직에서 충돌이 일어난 것인지 알길이 없어서 디버그를 해야만 했다.
언리얼 디버그에 관한 지식이 전무 했었기 때문에 이 기회에 패키지된 게임을 디버그하는 방법을 공부하여 정리하는 시간을 가져보았다.
사전 준비
디버깅을 위한 편집기 심볼
- 엔진에서 디버깅에 필요한 심볼 기호들이 저장되어있다.
- 엔진 레벨에서 어떻게 동작하는지 알고 싶다면 체크해야 한다.
- 용량이 30기가 이상으로 굉장히 크다.
디버그 심볼
디버그에 필요한 정보. 이 디버그 심볼이 들은걸 디버그 심볼 파일(프로그램 데이터베이스 파일, PDB) 이라고 한다.
- 디버그 심볼은 ‘정보’ 이기 때문에, 빌드 종류에 따라 달라지는 최적화 정도에 따라서 일부 혹은 전부가 ‘손실’ 된다.
- 왜냐하면 최적화 과정에서 컴파일러가 심볼을 삭제하기 때문이다.
- 그렇기에 디버그 모드로 패키지를 해야 자세한 디버그가 가능하다..
디버그 모드로 패키징 하기
- 디버깅을 자세하게 하고 싶으면 패키징 구성을 DebugGame으로 설정한다.
디버그 방법들
1. 텍스트 파일 로그 확인하기
- Build>Windows>MultiShooter>Saved>Logs
2. Visual Studio 창에서 실시간 확인
- 비쥬얼 스튜디오를 킨다.
-
디버그 탭 > 프로세스에 연결 을 누른다.
- 패키징한 프로그램을 실행한다.
- 창이 뜨면 현재 실행중인 프로세스들이 확인된다.
-
그중 패키킹 프로그램의 이름 + Debuggame.exe 파일을 선택한다.
- 그러면 실시간으로 로그가 보이는 것을 알 수 있다.
3. 직접 로그창 열지 않고 에러창이 나오게 하기
-
Project Setting > Packaging > Project > Build Configuration
-
직접 로그창을 열지 않아도 자동으로 크래쉬 로그가 뜬다.
4. 덤프파일을 통해 상황 재현하기
- 언리얼 엔진에서 크래시가 나는 경우 minidump 파일을 Saved/Crashes 디렉터리에 스테이징한다.
- 덤프파일을 이용하면 크래시가 난 시점의 메모리 상태로 디버깅을 진행할 수 있다.
- 이 파일을 visual studio에 드래그하고 오른쪽 네이티브 전용(으)로 디버그 버튼을 누르면 디버깅을 진행할 수 있다.
그 외
소스코드로 디버그 관리하기
스택트레이스를 로그로 남길 수 있다.
FDebug::DumpStackTraceToLog(ELogVerbosity::Type::Error);
현재 호출되는 스레드 ID를 알 수 있다.
uint32 ThreadId = FPlatformTLS::GetCurrentThreadId();
FString ThreadName = FThreadManager::Get().GetThreadName(ThreadId);
FullName과 Outer 객체를 활용하여 현재 오브젝트의 인스턴스를 확인할 수 있다.
FString FullName = GetFullName();
FString OuterFullName = GetOuter()->GetFullName();
FString FuncName(__FUNCTION__);
UE_LOG(LogTemp, Error, TEXT("%s FullName : %s OuterFullName : %s"),
*FuncName, *FullName, *OuterFullName);
DebugGame Editor
Editor가 안 붙은 것을 선택하고 디버거를 돌리면 exe 파일이 만들어지는데, Editor가 붙은 것을 선택하고 디버거를 돌리면 dll 파일이 만들어진다.
이것을 선택하면 언리얼 에디터를 켠 다음에 dll만 교체해서 컨텐츠를 엔진에 올리는 식으로 동작을 하기 때문에, 아까처럼 글로벌 셰이더가 없다는 식의 alert가 뜨지 않는다.
댓글남기기