[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には使うな」と書いてある模様

以上