강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

니체님의 프로필 이미지
니체

작성한 질문수

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part5: UE5 & IOCP 서버 연동

Despawn

ProtoBuf UE 연동 문제

해결된 질문

작성

·

29

0

  1. Spawn #2 따라하고 실행해보는데 메모리 충돌로 인해 언리얼 크래쉬가 발생하네요
    혼자 열심히 시도해 본 결과 UE FMemeory와 ProtoBuf 소멸자에서 delete 되는 부분에서 UE delete 오버라이드 문제인 것 까진 알게 되었으나 어떻게 해결해야 할 지 모르겠어서 질문 드립니다
    UE 5.6 버전이고, ProtoBuf는 C++ 5.29.5(29.5) 버전입니다
    vcpkg를 사용해서 라이브러리 다운 받았고 /MD 동적 라이브러리로 UE 프로젝트에 포함시켰습니다 (dll로 인해서 new/delete 오버라이드로 인한 메모리 충돌 문제가 더 쉽게 발생하여 /MT로 포함하는 것이 나을 수도 있겠다고 LLM(gpt, grok) 등이 말한 내용을 적용하고자 하였으나 빌드를 실패하여 그 부분은 진행하지 못하였습니다)

    다음 이미지는 실행했을 때 크래쉬가 발생하는 부분과 로그 일부 입니다

스크린샷 2025-10-20 220302.png.webp

LoginId:468bde9140a0ef5bd78746b7d5b86a2c

EpicAccountId:e6607fa7037e41448797c486f54e5315

Unhandled Exception: EXCEPTION_ACCESS_VIOLATION reading address 0x0000023d9d00116f

UnrealEditor_Core

UnrealEditor_Core

UnrealEditor_S1!operator delete() [C:\Program Files\Epic Games\UE_5.6\Engine\Source\Runtime\Core\Public\HAL\PerModuleInline.inl:9]

UnrealEditor_S1!Protocol::PlayerInfo::`scalar deleting destructor'()

libprotobuf!google::protobuf::internal::RepeatedPtrFieldBase::DestroyProtos() [C:\Users\yudle\vcpkg\buildtrees\protobuf\src\v5.29.5-5bafd96eab.clean\src\google\protobuf\repeated_ptr_field.cc:90]

UnrealEditor_S1!Protocol::S_LOGIN::~S_LOGIN() [D:\GitHub\S1\Source\S1\Network\Protocol.pb.cc:586]

UnrealEditor_S1!std::_Func_impl_no_allocServerPacketHandler::Init'::2'::<lambda_1>,bool,TSharedPtr<PacketSession,1> &,unsigned char *,int>::_Do_call() [C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\INCLUDE\functional:810]

UnrealEditor_S1!PacketSession::HandleRecvPackets() [D:\GitHub\S1\Source\S1\Network\PacketSession.cpp:37]

UnrealEditor_CoreUObject

UnrealEditor_CoreUObject

UnrealEditor_CoreUObject

UnrealEditor_CoreUObject

UnrealEditor_CoreUObject

UnrealEditor_CoreUObject

UnrealEditor_CoreUObject

UnrealEditor_CoreUObject

UnrealEditor_CoreUObject

UnrealEditor_CoreUObject

UnrealEditor_CoreUObject

UnrealEditor_Engine

UnrealEditor_Engine

UnrealEditor_Engine

UnrealEditor_Engine

UnrealEditor_Engine

UnrealEditor_Core

UnrealEditor_Core

UnrealEditor_Core

UnrealEditor_Core

UnrealEditor_Engine

UnrealEditor_Engine

UnrealEditor_Engine

UnrealEditor_Engine

UnrealEditor_UnrealEd

UnrealEditor_UnrealEd

UnrealEditor

UnrealEditor

UnrealEditor

UnrealEditor

UnrealEditor

UnrealEditor

kernel32

ntdll

스크린샷 2025-10-20 220501.png.webpimage.png

S_LOGIN 패킷의 소멸자에서 오염된 메모리 접근 문제로 크래시가 발생한 것으로 보입니다

답변 3

0

니체님의 프로필 이미지
니체
질문자

우선은 /MT 버전으로 Static Library로 연동하려고 하였으나 2019에러로 자꾸 미스매치 에러가 발생하여 UE 5.6 환경에서 특정 모듈만 /MT로 설정하는 방법을 모르겠어서 버전 다운 그레이드 하여
https://github.com/protocolbuffers/protobuf/tree/21.x-20241125

위 링크 21.x (3.21.x) 버전으로 CMake 다시 하여서 서버 프로젝트에는 Static 라이브러리 연결하고
UE 프로젝트 (S1)에는 /MD로 연결하여 작동하도록 하였습니다

0

Rookiss님의 프로필 이미지
Rookiss
지식공유자

확실하진 않지만 아마도 이 부분은 네트워크 라이브러리 쪽 문제일 것으로 예상합니다.
가령 서버 강의에서 몇몇 수강생 분들이 리포트한 버그들이 있긴 합니다.
https://inf.run/QzH3x
저 부분도 의심되고 혹은 메모리 사용을 어떤 Allocator로 하는지 등을 봐야할 것 같습니다.

0

안녕하세요, 인프런 AI 인턴입니다. 니체님.

ProtoBuf와 Unreal Engine을 연동하는 과정에서 발생한 메모리 크래시 문제를 겪고 계신 것 같습니다. 특히 Unreal Engine에서의 메모리 할당 및 해제 오버라이드로 인해 문제가 발생하는 것으로 보입니다.

우선적으로 이 문제는 Unreal Engine이 메모리 관리를 C++ 표준과 다르게 처리하기 때문에 발생할 수 있습니다. Unreal은 메모리 작업을 위해 자체적인 allocator를 사용하며, 이는 ProtoBuf의 메모리 관리와 충돌할 수 있습니다.

해결 방안

  1. Static Library 사용: Unreal Engine에서 ProtoBuf를 사용할 때 /MT 옵션을 사용해 정적 라이브러리로 빌드하는 것이 좋습니다. 이렇게 하면 Unreal의 메모리 관리와 충돌할 가능성을 줄일 수 있습니다. 정적 라이브러리로 빌드하기 위해서는 CMake를 사용하셔야 할 수 있습니다.

  2. 메모리 충돌 디버깅:

    • ProtoBuf 객체가 생성되고 소멸되는 위치를 디버깅하여 각각 newdelete 호출이 올바르게 이뤄지고 있는지 확인하세요.
    • delete 호출 문제가 있다면, Unreal의 FMemory::Free 함수를 사용하여 메모리를 해제하는 방식으로 수정해 보실 수 있습니다.
  3. DLL 사용 시 주의: DLL로 포함하는 경우, 다른 CRT(C Runtime)의 메모리 할당 함수를 사용할 수 있으므로, 이는 충돌로 이어질 수 있습니다. 이를 피하기 위해서는 DLL 사용을 지양하고 정적 링크를 권장합니다.

관련 질문 URL

이와 같이 해결 방안을 시도해 보시고 추가적인 문제가 있다면 다시 질문해 주세요.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

니체님의 프로필 이미지
니체

작성한 질문수

질문하기