인프런 커뮤니티 질문&답변
ProtoBuf UE 연동 문제
해결된 질문
작성
·
40
0
- 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) 등이 말한 내용을 적용하고자 하였으나 빌드를 실패하여 그 부분은 진행하지 못하였습니다)
 다음 이미지는 실행했을 때 크래쉬가 발생하는 부분과 로그 일부 입니다

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


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
확실하진 않지만 아마도 이 부분은 네트워크 라이브러리 쪽 문제일 것으로 예상합니다.
가령 서버 강의에서 몇몇 수강생 분들이 리포트한 버그들이 있긴 합니다.
https://inf.run/QzH3x
저 부분도 의심되고 혹은 메모리 사용을 어떤 Allocator로 하는지 등을 봐야할 것 같습니다.
0
안녕하세요, 인프런 AI 인턴입니다. 니체님.
ProtoBuf와 Unreal Engine을 연동하는 과정에서 발생한 메모리 크래시 문제를 겪고 계신 것 같습니다. 특히 Unreal Engine에서의 메모리 할당 및 해제 오버라이드로 인해 문제가 발생하는 것으로 보입니다.
우선적으로 이 문제는 Unreal Engine이 메모리 관리를 C++ 표준과 다르게 처리하기 때문에 발생할 수 있습니다. Unreal은 메모리 작업을 위해 자체적인 allocator를 사용하며, 이는 ProtoBuf의 메모리 관리와 충돌할 수 있습니다.
해결 방안
- Static Library 사용: Unreal Engine에서 ProtoBuf를 사용할 때 - /MT옵션을 사용해 정적 라이브러리로 빌드하는 것이 좋습니다. 이렇게 하면 Unreal의 메모리 관리와 충돌할 가능성을 줄일 수 있습니다. 정적 라이브러리로 빌드하기 위해서는 CMake를 사용하셔야 할 수 있습니다.
- 메모리 충돌 디버깅: - ProtoBuf 객체가 생성되고 소멸되는 위치를 디버깅하여 각각 new와delete호출이 올바르게 이뤄지고 있는지 확인하세요.
 
- delete호출 문제가 있다면, Unreal의- FMemory::Free함수를 사용하여 메모리를 해제하는 방식으로 수정해 보실 수 있습니다.
 
 
- ProtoBuf 객체가 생성되고 소멸되는 위치를 디버깅하여 각각 
- DLL 사용 시 주의: DLL로 포함하는 경우, 다른 CRT(C Runtime)의 메모리 할당 함수를 사용할 수 있으므로, 이는 충돌로 이어질 수 있습니다. 이를 피하기 위해서는 DLL 사용을 지양하고 정적 링크를 권장합니다. 
관련 질문 URL
- 참고할 답변이 있는 게시물은 Unreal과 ProtoBuf를 사용할 때 발생하는 메모리 문제를 확인해 보세요. 이 게시물에서는 다소 다른 문제를 다룹니다만, 메모리 관리 측면에서 유사한 문제를 다루고 있어 도움이 될 수 있습니다.
 
이와 같이 해결 방안을 시도해 보시고 추가적인 문제가 있다면 다시 질문해 주세요.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.





