ウィンドウタイトルに日本語が含まれているとDumpGPUの出力データが破損します

不具合の詳細

DumpGPU.cpp(409)でパス情報をファイルに書き込むときにエンコーディングオプションにをAutoDetectに設定されているため複数のエンコーディングとBOMがファイル内に混在し破損したファイルが生成されてしまいます。具体的にはElementBatchのParentEventScopesに日本語のウィンドウタイトル(例:エディタの環境設定)が入ることによってファイル中にUTF-16文字列が混入してしまいます。

エンコーディングオプションにForceUTF8WithoutBOMを指定することで修正されます。事前にファイルの先頭にUTF8のBOMを書き込んでおくとより安全な出力になります。

UnrealEditor-RenderCore.dll!FRDGResourceDumpContext::DumpStringToFile(TStringView<wchar_t> OutputString, const FString & FileName, unsigned int WriteFlags) Line 409 C++ UnrealEditor-RenderCore.dll!FRDGResourceDumpContext::DumpJsonToFile(const TSharedPtr<FJsonObject,1> & JsonObject, const FString & FileName, unsigned int WriteFlags) Line 426 C++ UnrealEditor-RenderCore.dll!FRDGBuilder::DumpResourcePassOutputs(const FRDGPass * Pass) Line 2614 C++ UnrealEditor-RenderCore.dll!FRDGBuilder::SetupAuxiliaryPasses(FRDGPass * Pass) Line 2587 C++ UnrealEditor-RenderCore.dll!FRDGBuilder::SetupEmptyPass(FRDGPass * Pass) Line 2626 C++ UnrealEditor-RenderCore.dll!FRDGBuilder::Execute() Line 1754 C++ UnrealEditor-SlateRHIRenderer.dll!FSlateRHIRenderer::DrawWindows_RenderThread(FRHICommandListImmediate & RHICmdList, TArrayView<FSlateDrawWindowPassInputs const ,int> Windows, TArrayView<FRenderThreadUpdateContext const ,int> DeferredUpdates) Line 1099 C++ UnrealEditor-SlateRHIRenderer.dll!FSlateRHIRenderer::DrawWindows_Private::__l99::<lambda_3>::operator()(FRHICommandListImmediate & RHICmdList) Line 1377 C++ [Inline Frame] UnrealEditor-RenderCore.dll!UE::Core::Private::Function::TFunctionRefBase<UE::Core::Private::Function::TFunctionStorage<1>,void __cdecl(FRHICommandListImmediate &)>::operator()(FRHICommandListImmediate &) Line 470 C++ UnrealEditor-RenderCore.dll!FRenderThreadCommandPipe::EnqueueAndLaunch::__l5::<lambda>() Line 1541 C++ [Inline Frame] UnrealEditor-RenderCore.dll!UE::Core::Private::Function::TFunctionRefBase<UE::Core::Private::Function::TFunctionStorage<1>,void __cdecl(void)>::operator()() Line 470 C++ [Inline Frame] UnrealEditor-RenderCore.dll!TFunctionGraphTaskImpl<void __cdecl(void),1>::DoTaskImpl(TUniqueFunction<void __cdecl(void)> & Function, ENamedThreads::Type) Line 1710 C++ [Inline Frame] UnrealEditor-RenderCore.dll!TFunctionGraphTaskImpl<void __cdecl(void),1>::DoTask(ENamedThreads::Type) Line 1703 C++ UnrealEditor-RenderCore.dll!TGraphTask<TFunctionGraphTaskImpl<void __cdecl(void),1>>::ExecuteTask() Line 634 C++ UnrealEditor-Core.dll!UE::Tasks::Private::FTaskBase::TryExecuteTask() Line 504 C++ [Inline Frame] UnrealEditor-Core.dll!FBaseGraphTask::Execute(TArray<FBaseGraphTask *,TSizedDefaultAllocator<32>> &) Line 482 C++ UnrealEditor-Core.dll!FNamedTaskThread::ProcessTasksNamedThread(int QueueIndex, bool bAllowStall) Line 779 C++ UnrealEditor-Core.dll!FNamedTaskThread::ProcessTasksUntilQuit(int QueueIndex) Line 668 C++ UnrealEditor-RenderCore.dll!RenderingThreadMain(FEvent * TaskGraphBoundSyncEvent) Line 317 C++ UnrealEditor-RenderCore.dll!FRenderingThread::Run() Line 470 C++ UnrealEditor-Core.dll!FRunnableThreadWin::Run() Line 159 C++ UnrealEditor-Core.dll!FRunnableThreadWin::GuardedRun() Line 71 C++

再現手順
Version 5.5.4

  1. エディタの言語設定を日本語にする
  2. エディタの環境設定を開く
  3. コンソールからDumpGPUを実行する
  4. 出力されたデータのBase/Passes.jsonを開くと最下部のElementBachイベント以降のデータが破損する

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

本件確認させていただいたところ、問題としましては以下Issue報告と同様の問題のように見受けられました。

※言語環境によって同様の問題が起きる旨、今回提案頂いた再現手順を含めて改めて内部で報告させていただきました。

UE-254502 Invalid DumpGPU capture when ProjectDisplayedTitle contains special utf8 chars

エンジン修正が必要となり大変恐縮ですが、現状はForceUTF8WithoutBOMの設定等で回避運用頂けますと幸いです。

ご不便をおかけしますが、よろしくお願いいたします。

承知いたしました。ご回答ありがとうございました!