[GAS] 스켈레탈 메쉬 크래시 해결: EXCEPTION_ACCESS_VIOLATION

2026. 2. 3. 23:46·Dev./UE 언리얼 엔진

 

프로젝트의 몬스터 에셋의 스켈레탈 메쉬(Skeletal Mesh; 캐릭터의 뼈대와 피부 정보가 포함된 3D 모델)를 여는 것만으로 에디터가 닫혀버린다... 아마 예전에 LOD 관련으로 작업을 하다가 파일이 꼬인 문제에 대한 연장선인 것으로 추정된다...ㅠ

 

2026.01.06 - [Dev./UE 언리얼 엔진] - [GAS] LOD 설정 실수로 인한 빌드 크래시, 원인 분석과 해결까지

 

[GAS] LOD 설정 실수로 인한 빌드 크래시, 원인 분석과 해결까지

“내 PC에서는 되는데?” — 협업 환경에서 가장 무서운 말노트 PC에서만 크래시가 발생했다문제는 내 PC에서는 아무런 이상이 없었다는 점이다. 같은 Git 저장소, 같은 브랜치, 같은 커밋. 그런데

raindrovvv.tistory.com

현재 개발 중인 'Guardian & Seeker'의 몬스터인 ‘아이언팽(IronFang)’ 작업 중...

발생한 치명적인 메모리 오류와 그 해결 과정을 기록한다.


1. 문제 정의

“메쉬를 건드리는 순간 에디터가 죽는다”

증상은 명확했다.

  • 특정 캐릭터 메쉬인 SK_DragonWarrior를 더블 클릭하여 메쉬 에디터를 열 경우
  • 아이언팽이 설치돼있던 레벨에서 벗어나 다른 레벨에 입장할 경우

➡️ 엔진이 즉시 종료

더보기
Unhandled Exception: EXCEPTION_ACCESS_VIOLATION reading address 0x0000000000000058

UnrealEditor_Engine!UAssetImportData::GetFirstFilename() [D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\EditorFramework\AssetImportData.cpp:268]
UnrealEditor_MeshBuilder!SkeletalMeshBuilderPrivate::FContext::PerformReductions() [D:\build\++UE5\Sync\Engine\Source\Developer\MeshBuilder\Private\SkeletalMeshBuilder.cpp:397]
UnrealEditor_MeshBuilder!FinalizeContext() [D:\build\++UE5\Sync\Engine\Source\Developer\MeshBuilder\Private\SkeletalMeshBuilder.cpp:605]
UnrealEditor_MeshBuilder!FSkeletalMeshBuilder::Build() [D:\build\++UE5\Sync\Engine\Source\Developer\MeshBuilder\Private\SkeletalMeshBuilder.cpp:716]
UnrealEditor_MeshBuilder!FMeshBuilderModule::BuildSkeletalMesh() [D:\build\++UE5\Sync\Engine\Source\Developer\MeshBuilder\Private\MeshBuilderModule.cpp:83]
UnrealEditor_Engine!USkeletalMesh::BuildLODModel() [D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\SkeletalMesh.cpp:6200]
UnrealEditor_Engine!FSkeletalMeshRenderData::Cache() [D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\SkeletalMeshRenderData.cpp:317]
UnrealEditor_Engine!USkeletalMesh::CacheDerivedData() [D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\SkeletalMesh.cpp:5299]
UnrealEditor_Engine!USkeletalMesh::ExecutePostLoadInternal() [D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\SkeletalMesh.cpp:3838]
UnrealEditor_Engine!FSkinnedAssetAsyncBuildWorker::DoWork() [D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\SkinnedAssetAsyncCompileUtils.cpp:41]
UnrealEditor_Engine!FAsyncTaskBase::DoWork() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Public\Async\AsyncWork.h:289]
UnrealEditor_Engine!FAsyncTaskBase::DoThreadedWork() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Public\Async\AsyncWork.h:313]
UnrealEditor_Core!FQueuedThreadPoolWrapper::FScheduledWork::DoThreadedWork() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Public\Misc\QueuedThreadPoolWrapper.h:144]
UnrealEditor_Engine!FQueuedThreadPoolWrapper::FScheduledWork::DoThreadedWork() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Public\Misc\QueuedThreadPoolWrapper.h:144]
UnrealEditor!`LowLevelTasks::FTask::Init<`FQueuedLowLevelThreadPool::AddQueuedWork'::`2'::<lambda_1> >'::`13'::<lambda_1>::operator()() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Public\Async\Fundamental\Task.h:499]
UnrealEditor!LowLevelTasks::TTaskDelegate<LowLevelTasks::FTask * __ptr64 __cdecl(bool),48>::TTaskDelegateImpl<`LowLevelTasks::FTask::Init<`FQueuedLowLevelThreadPool::AddQueuedWork'::`2'::<lambda_1> >'::`13'::<lambda_1>,0>::CallAndMove() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Public\Async\Fundamental\TaskDelegate.h:171]
UnrealEditor_Core!LowLevelTasks::FTask::ExecuteTask() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Public\Async\Fundamental\Task.h:627]
UnrealEditor_Core!LowLevelTasks::FScheduler::ExecuteTask() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Private\Async\Fundamental\Scheduler.cpp:365]
UnrealEditor_Core!LowLevelTasks::FScheduler::WorkerLoop() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Private\Async\Fundamental\Scheduler.cpp:724]
UnrealEditor_Core!`LowLevelTasks::FScheduler::CreateWorker'::`2'::<lambda_1>::operator()() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Private\Async\Fundamental\Scheduler.cpp:188]
UnrealEditor_Core!FThreadImpl::Run() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Private\HAL\Thread.cpp:69]
UnrealEditor_Core!FRunnableThreadWin::Run() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Private\Windows\WindowsRunnableThread.cpp:159]

🔍 크래시 로그 분석

엔진이 남긴 크래시 리포트의 핵심 문구는 다음과 같았다.

Unhandled Exception: EXCEPTION_ACCESS_VIOLATION reading address 0x0000000000000058

이 오류는 프로그램이 존재하지 않는 메모리 주소(Null; 아무것도 없는 상태)를 참조하려 할 때 발생한다.

 

콜스택(Call Stack; 프로그램이 실행되어 온 경로 역추적)을 따라가면

UAssetImportData::GetFirstFilename()에서 문제가 시작됨을 알 수 있다.

 

즉, 엔진이 이 메쉬를 처음에 어디서 가져왔는지 확인하는 데이터(Asset Import Data)를 읽으려다 길을 잃은 것이다.


2. 원인 분석

왜 이런 일이 벌어지는가?

문제는 단순한 버그가 아니라, 에셋 메타데이터(Metadata; 데이터를 설명하는 데이터)의 구조적 오염 때문이었다.

  1. Null 포인터 참조
    엔진은 LOD를 재빌드하기 위해 원본 경로를 참조하려 했으나 읽어온 값이 Null이었기에 충돌이 발생했다.
  2. DDC(Derived Data Cache) 충돌
    에셋의 파생 데이터가 이전 버전의 정보와 충돌하며 빌드 프로세스를 방해했다.

3. 해결 과정

단순히 파일 이름을 바꾸거나 DDC, Saved 폴더를 지우는 것만으로는 해결되지 않았다.
에셋 내부의 깨진 정보를 ‘세탁’해야 했다. 나는 익스포트(Export) 후 재임포트(Reimport) 방식을 선택했다.

 

Step 1. FBX 추출

일단 오류가 있는 에셋 이름 뒤에 '_OLD'를  붙여 이름을 바꿨다.
Asset Actions → Export 기능을 사용해 외부 파일(FBX)로 뽑아냈다.

이때 데이터 유실을 막기 위해 다음과 같이 설정했다.

  • Level of Detail (LOD): 체크 해제 → LOD 때문에 발생했던 오류라서... 해제
  • Materials & Textures: 체크 해제 → 중복 생성 방지

⚠️Smoothing Groups (스무딩 그룹): 임포트하면 스무딩 그룹 오류가 나는데, 익스포트할 때 어디를 설정해야 해결되는지는... 찾지 못했다

Step 2. 데이터 재주입 및 메타데이터 초기화

기존 에셋을 삭제하고 새로 만들면 연결된 모든 참조가 깨진다.

설정 항목  선택 값 이유
Common Meshes Skeleton 스켈레탈 메시임을 명시
Normal Import Method Compute Normals 추출 시 빠진 표면 정보를 엔진이 직접 재계산
Import Materials Do Not Create 프로젝트 내 기존 머티리얼 유지

 


Step 3. 블루프린트 복구

재임포트된 메쉬는 이제 깨끗한 메타데이터를 가진다.
이를 BP_IronFang과 같은 캐릭터 블루프린트의 메쉬 컴포넌트에 다시 할당했다.


4. 결과

해결 후, SK_DragonWarrior 메쉬는 크래시 없이 정상적으로 열렸으며 게임 내에서도 원활하게 작동했다.

  • 안정성 확보
    메타데이터 초기화를 통해 엔진이 잘못된 메모리를 참조할 여지를 차단했다.
  • 유지보수 용이
    기존 스켈레톤과 머티리얼을 그대로 유지했기 때문에 추가적인 리소스 작업 없이 복구가 완료되었다.

'Dev. > UE 언리얼 엔진' 카테고리의 다른 글

언리얼 엔진5 :: 모션 매칭(Motion Matching)에 대해서  (0) 2026.02.10
[GAS] 모션매칭 SandboxCharacter를 MyCharacter로 전환하기  (0) 2026.02.07
[NodeToCode + 로컬 AI 가이드] 블루프린트를 N초 만에 C++로?  (0) 2026.01.27
언리얼 엔진 GAS(Gameplay Ability System)  (1) 2026.01.21
[GAS] Unreal Engine 1인칭/3인칭 카메라 전환 시스템  (1) 2026.01.19
'Dev./UE 언리얼 엔진' 카테고리의 다른 글
  • 언리얼 엔진5 :: 모션 매칭(Motion Matching)에 대해서
  • [GAS] 모션매칭 SandboxCharacter를 MyCharacter로 전환하기
  • [NodeToCode + 로컬 AI 가이드] 블루프린트를 N초 만에 C++로?
  • 언리얼 엔진 GAS(Gameplay Ability System)
raindrovvv
raindrovvv
raindrovvv 님의 블로그 입니다.
  • raindrovvv
    raindrovvv 님의 블로그
    raindrovvv
  • 전체
    오늘
    어제
    • 분류 전체보기 (170) N
      • Dev. (163) N
        • AI 인공지능 (27)
        • UE 언리얼 엔진 (81) N
        • Unity 유니티 (0)
        • Wwise 와이즈 (7)
        • 게임 네트워크 (8)
        • 그래픽스 Graphics (22)
        • 프로젝트 (8)
        • 기타 개발 관련 (10)
      • Computer Science (0)
        • 하드웨어 HW (0)
        • 소프트웨어 SW (0)
        • 통신 (0)
        • 데이터 (0)
      • 블로그 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    언리얼
    Unreal
    그래픽스
    unrealengine
    UE
    devlog
    dev
    AI
    트러블슈팅
    네트워크
    깃
    게임개발
    바이브코딩
    Wwise
    TA
    생산성
    인디게임
    언리얼엔진
    Git
    에이전트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
raindrovvv
[GAS] 스켈레탈 메쉬 크래시 해결: EXCEPTION_ACCESS_VIOLATION
상단으로

티스토리툴바