GatherTextFromAssetsCommandletにてクラッシュが発生します

お疲れ様です。

ローカライズテキストの更新を行う目的で、​LocalizationDashboardを更新するコマンドレットを作成して利用しております。

​作成したコマンドレットの中で、GatherTextを実行しているのですが、UE5.6にアップデート以降、5回に2回程度FatalErrorが発生しております。

・GatherText(GetGatherTextConfigPath)を実行しない場合、エラーは発生しない

・Editor中のLocalizationDashboardメニューから​GatherTextを実行した場合、エラーは発生しない

​▼FatalError時のコールスタックは下記になります​

LogGatherTextFromAssetsCommandlet: Display: Loaded 5 packages. 0 failed.

LogGatherTextFromAssetsCommandlet: Display: UGatherTextFromAssetsCommandlet::LoadAndProcessUncachedPackages took 4.92 sec

LogGatherTextFromAssetsCommandlet: Display: Loading packages took 5.00 seconds.

LogGatherTextFromAssetsCommandlet: Display: UGatherTextFromAssetsCommandlet::Main took 13.9 sec

LogGatherTextCommandlet: Display: Completed GatherTextStep0: GatherTextFromAssetsCommandlet in 14.00 seconds

LogWindows: Error: === Critical error: ===

LogWindows: Error:

LogWindows: Error: Fatal error!

LogWindows: Error:

LogWindows: Error: Unhandled Exception: EXCEPTION_ACCESS_VIOLATION reading address 0xffffffffffffffff

LogWindows: Error:

LogWindows: Error: [Callstack] 0x00007ffc42558230 UnrealEditor-UnrealEd.dll!UGatherTextCommandlet::ProcessGatherConfig() [XXX\Engine\Source\Editor\UnrealEd\Private\Commandlets\GatherTextCommandlet.cpp:314]

LogWindows: Error: [Callstack] 0x00007ffc4253646e UnrealEditor-UnrealEd.dll!UGatherTextCommandlet::Execute() [XXX\Engine\Source\Editor\UnrealEd\Private\Commandlets\GatherTextCommandlet.cpp:178]

LogWindows: Error: [Callstack] 0x00007ffc4254ac38 UnrealEditor-UnrealEd.dll!UGatherTextCommandlet::Main() [XXX\Engine\Source\Editor\UnrealEd\Private\Commandlets\GatherTextCommandlet.cpp:49]

LogWindows: Error: [Callstack] 0x000001c9e600feb0 XXX

LogWindows: Error: [Callstack] 0x000001c9e60105d8 XXX

LogWindows: Error: [Callstack] 0x000001c9e600ddb0 XXX

LogWindows: Error: [Callstack] 0x000001c9e60061e1 XXX

LogWindows: Error: [Callstack] 0x00007ff6a40e8ed1 UnrealEditor-Cmd.exe!FEngineLoop::PreInitPostStartupScreen() [XXX\Engine\Source\Runtime\Launch\Private\LaunchEngineLoop.cpp:3860]

LogWindows: Error: [Callstack] 0x00007ff6a40de2ac UnrealEditor-Cmd.exe!GuardedMain() [XXX\Engine\Source\Runtime\Launch\Private\Launch.cpp:143]

LogWindows: Error: [Callstack] 0x00007ff6a40de5ca UnrealEditor-Cmd.exe!GuardedMainWrapper() [XXX\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:128]

LogWindows: Error: [Callstack] 0x00007ff6a40e1fae UnrealEditor-Cmd.exe!LaunchWindowsStartup() [XXX\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:282]

LogWindows: Error: [Callstack] 0x00007ff6a40f4d84 UnrealEditor-Cmd.exe!WinMain() [XXX\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:339]

LogWindows: Error: [Callstack] 0x00007ff6a40f73a6 UnrealEditor-Cmd.exe!__scrt_common_main_seh() [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288]

LogWindows: Error: [Callstack] 0x00007ffd5cabe8d7 KERNEL32.DLL!UnknownFunction

LogWindows: Error:

こちらのエラーに関して、何か情報をお持ちではありませんでしょうか。​

再現手順
GatherTextFromAssetsCommandletを実行した際に、5回中2回程度FatalErrorが発生します。

エラーが発生する箇所は毎回同じ箇所になります。

お世話になっております。

返信が遅くなりまして申し訳ございません。社内で確認しましたが今のところ同様の報告などは見受けられませんでした。エディタのGatherTextを実行した際には問題がなく、作成したコマンドレットでGatherTextした際には問題が発生したとのことですが、作成されたコマンドレットの内容はどういったものでしょうか?おそらくカスタムのコマンドレットによる違いか、エディタ実行の状態だと発生しない問題かが疑われますが、問題の切り分けとしてエディタでGatherTextを実行した際のコマンドと同じ内容をUATから実行することで、後者の問題に起因するかどうかが切り分けることができるかと思われます。同じコマンドをコマンドレットで実行して問題が無い場合、カスタムの部分が影響しているものと推測されます。

お疲れ様です。

コマンドレット内容としましは、LocalizationDashboardのテキストを更新するものになります。

コマンドレットにて、StringTable及び.poを更新した後、ExecuteCommandletから下記を順番に実行しております。

GatherText(GetGatherTextConfigPath)

ImportText(GetImportTextConfigPath)

CompileText(GetCompileTextConfigPath)

WordCountReport(GetWordCountReportConfigPath)

コマンド実行

ExecuteCommandlet(TEXT(“/Script/UnrealEd.GatherTextCommandlet”), FString::Format(TEXT(“-config=\”{0}\“”), { ConfigPath }));

お知らせ頂きありがとうございます。

>コマンドレットにて、StringTable及び.poを更新した後、ExecuteCommandletから下記を順番に実行しております。

>GatherText(GetGatherTextConfigPath)

上記の処理中で、GatherText のタイミング(プロセス)にクラッシュが発生しているという理解でよろしいでしょうか?

もしそうであるとしたら、「StringTable及び.poを更新」する処理自体か、この処理と GatherText の処理で関連して問題が発生していることかと推測されます。

例えば、上記をそれぞれ別のコマンドレットで実行した際に問題は起きますでしょうか?別々のコマンドレット実行でも問題があるようでしたら前者の処理が疑わしいですが、コマンドレットを分けないケースで発生するとしたら上記の処理の競合などが可能性として考えられます。まずはここの問題を切り分けて頂くとよろしいかと思われます。

別の問題の切り分けとして、AsyncLoader自体に問題がある可能性を考慮し、以下のオプションを追加してコマンドレットを実行した際に問題があるかどうかをご確認頂くことで、ZenLoader自体の問題かどうかを切り分けることもできます。

[/Script/Engine.EditorStreamingSettings]
s.ZenLoaderEnabled=False

お疲れ様です。

ご回答ありがとうございます。

s.ZenLoaderEnabled=False を試したのですが、変わらずFatalErrorが発生しましたので、コマンドレットを分けての実行を試してみます。

お疲れ様です。

コマンドレットを分けての実行を試してみました。

結果として、「StringTable及び.poを更新」を行わずGatherText を実行するだけでFatalErrorが発生いたしました。

コマンドレットコードは下記になります。

int32 ULocalizationTextCommandlet::Main(const FString& InParams)
{
	TSharedPtr<LocalizationSettings> Settings;
	Settings = MakeShareable(new XXXX);
 
	UE_LOG(LogTemp, Display, TEXT("// GatherText //////////////////////////////////////////////////"));
	ILocalizationModule& LocalizationModule = ILocalizationModule::Get();
	ULocalizationTarget* LocalizationTarget = LocalizationModule.GetLocalizationTargetByName(Settings->GameTargetName(), false);
 
	FString ConfigPath = LocalizationConfigurationScript::GetGatherTextConfigPath(LocalizationTarget);
	ConfigPath = FPaths::ConvertRelativePathToFull(ConfigPath);
 
	UClass* commandletClass = FindObject<UClass>(nullptr, TEXT("/Script/UnrealEd.GatherTextCommandlet"), false);
	check(::IsValid(commandletClass));
	UCommandlet* commandlet = NewObject<UCommandlet>(GetTransientPackage(), commandletClass);
	check(::IsValid(commandlet));
	commandlet->Main(FString::Format(TEXT("-config=\"{0}\""), { ConfigPath }));
	return 0;
}

ご確認ありがとうございます。

GatherText の実行方法を見直す必要がありそうということですね。実際にEditorでコマンドレットを実行する際(クラッシュが発生しないケースで)は、LocalizationCommandletTasks::GatherTextForTarget および LocalizationCommandletExecution::Execute でコマンドレットの実行を処理しています。ここの処理と比較して、問題がありそうな箇所や相違, 過不足箇所がないかをご確認頂けますと幸いです。

お疲れ様です。

ご返答ありがとうございます。

承知しました、実装箇所を比較しつつ調査を進めます。