[UE4]Navigation SystemでのFatal Error調査事例
症状
UE4.21.2
C++ Projectで発生。
Win64向けShipping Buildでアプリ起動直後にFatal Errorが出る(添付画像参照)。
Editor起動やDevelopment Buildでは出ない。
原因
直接の死因はエラー文の通り、純粋仮想関数の呼び出し警告
AIModuleが含まれていない構成なのにNavigation Systemが起動しようとした結果こうなったようだ
対策
起動直後に表示されるLevelのWorld Settingで、Navigation System Configを “Null Nav Sys Config” に変更
調査手順
詳細なCrash情報を得る
Project Setting -> Project -> Packaging -> Project -> Include Debug Files を有効化
Project Setting -> Project -> Packaging -> Packaging-> Include Crash Reporter を有効化
search欄に”Include”と入れると両方すぐ見つかる
もう一度Shipping Buildする
実行してCrash Reportを見る
HarvestGame_Win64_Shipping!FDebug::AssertFailed() HarvestGame_Win64_Shipping!UCrowdManagerBase::Tick() HarvestGame_Win64_Shipping!UNavigationSystemV1::Tick() HarvestGame_Win64_Shipping!UWorld::Tick() HarvestGame_Win64_Shipping!UGameEngine::Tick() HarvestGame_Win64_Shipping!FEngineLoop::Tick() HarvestGame_Win64_Shipping!GuardedMain() HarvestGame_Win64_Shipping!GuardedMainWrapper() HarvestGame_Win64_Shipping!WinMain()
コードレベルで原因調査
Visual StudioでProjectを開き、UCrowdManagerBaseで検索して該当コードを見る
クラッシュの原因になるインスタンスを作っているところを見つける(NavigationSystem.cpp L372)
UClass* Class = StaticLoadClass(UCrowdManagerBase::StaticClass(), nullptr, TEXT("/Script/AIModule.CrowdManager")); CrowdManagerClass = Class ? Class : UCrowdManagerBase::StaticClass();
AIModuleが入っている前提になっているようだが…
とりあえずの対策実施
プロジェクトのBuild.cs で PublicDependencyModuleNames に “AIModule” 追加
再度Shipping Buildする
問題が発生しなくなった
現状NavgationSystemを使っていないが、どこかしらで有効になってしまっている?
コンパイルエラーにはならないので、コードの問題ではなさそう
Developmentビルドだと実行できるのは、おそらくデバッグ機能側の都合でAIModuleが含まれている為か?
NavigationSystemを利用していないのに、なぜ使う処理に入っているのだろう?
Visual StudioからDebugGame Editor構成で起動して、上記CrowdManagerClass処理の呼び出し履歴を遡って調べる
設定でNavigationSystemを有効にしているとここに来るということがわかる
やってないけどなぁ…World Settings見てみるか
やってますねこれは
っていうかこれチェック外せねぇ…DEPRECATEDだから、もう触るなってことかな
ポップアップで出た説明に従い、Navigation System Configを “Null Nav Sys Config”に変更
Build.csの記述は元に戻す(AIModuleを含めないようにする)
再度Shipping Build
問題が発生しなくなった
オチ
なにもしてないのにこわれた?
このあたりの設定をいじった記憶がない
bEnableNavigationSystemが有効になった経緯が不明
新規Levelを作ると、当然無効な状態で作られる
問題が発生するLevelは、git管理下に置いた当初から今回のような状態になっていた。
4.21のPreview版をこのProjectで試していた可能性がある
コミットログには残していなかったが、日付的に時期が被る
誰かのせいにしたいが自分の顔しか思い浮かばない
Navigation System Configの項目自体は4.20で入ったようだが、やっちゃった可能性高し
製品ProjectでPreview版を使うのは、やめよう!
なおPreview版リリースノートには毎回「製品Projectには使うな」と書いてある模様
以上