모듈 로그 카테고리와 빌드·로드 디버깅
13강. 모듈 로그 카테고리와 빌드·로드 디버깅
1. 이번 강의에서 해결할 문제
“The following modules are missing or built with a different engine version” 메시지만 보고 Binary를 복사하거나 Rebuild를 반복합니다. 원인은 Plugin 비활성화, Descriptor 이름 불일치, 현재 Target용 Binary 부재, 엔진 버전·Toolchain 차이 또는 선행 Module 로드 실패일 수 있습니다. 빌드 성공과 로드 성공을 분리해야 합니다.
2. 학습 목표
3. 핵심 개념
로그는 “실패했다”가 아니라 어느 Target·Module·경로·단계에서 무엇을 기대했는지를 남겨야 합니다. UBT 빌드 로그, UnrealEditor 시작 로그, Project Saved/Logs와 Crash Context는 서로 다른 증거입니다.
Missing Module 진단 순서:
.uplugin이 Plugin 검색 경로에 존재하는가?- Plugin이 프로젝트에서 활성화됐는가?
- Descriptor Module 이름과 Source/Build.cs/IMPLEMENT_MODULE 이름이 같은가?
- 현재 Engine·Platform·Target·Configuration용 Binary가 있는가?
- 첫 번째 선행 Module 로드 실패는 무엇인가?
4. 단계별 실습
#pragma once
#include "Logging/LogMacros.h"
REUSABLEINTERACTION_API DECLARE_LOG_CATEGORY_EXTERN(
LogReusableInteraction, Log, All);
#include "ReusableInteractionLog.h"
DEFINE_LOG_CATEGORY(LogReusableInteraction);
#include "Interfaces/IPluginManager.h"
#include "Modules/ModuleManager.h"
#include "ReusableInteractionLog.h"
class FReusableInteractionModule final : public IModuleInterface
{
public:
virtual void StartupModule() override
{
const TSharedPtr<IPlugin> Plugin =
IPluginManager::Get().FindPlugin(TEXT("ReusableInteraction"));
UE_LOG(LogReusableInteraction, Display,
TEXT("Startup BaseDir=%s"),
Plugin.IsValid() ? *Plugin->GetBaseDir() : TEXT("NotFound"));
}
virtual void ShutdownModule() override
{
UE_LOG(LogReusableInteraction, Display, TEXT("Shutdown"));
}
};
IMPLEMENT_MODULE(FReusableInteractionModule, ReusableInteraction)
FindPlugin 실패를 무시하고 경로를 사용하지 않습니다. 배포 로그에는 사용자 계정 경로나 민감한 환경 정보를 불필요하게 남기지 않고, 진단 빌드에서만 필요한 범위를 기록합니다.
5. 코드가 동작하는 이유
전용 Category는 LogTemp보다 Module 출처와 필터링 범위를 명확히 합니다. PluginManager는 Engine이 실제로 발견한 Descriptor 기준 경로를 제공하므로 상대 경로 추측을 피합니다. ModuleManager 상태와 첫 로드 오류를 함께 보면 Binary 누락과 초기화 실패를 구분할 수 있습니다.
6. 자주 하는 실수와 해결법
7. 직접 실습
8. 이해 점검 질문 3개
9. 핵심 요약
모듈 로그 카테고리와 빌드·로드 디버깅 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.