LoginSignup
10
8

More than 3 years have passed since last update.

[UE4] いつもどんな時もフルクラッシュダンプ

Posted at

クラッシュ原因の調査に有用なのがフルクラッシュダンプ。
ミニダンプでは変数の中身などが見えず、解決に有用な情報を得られないことも多い。

なので私は、

エディタを起動するときも

/path/to/UE4Editor.exe /path/to/project/MyGame.uproject -fullcrashdump

ビルドするときも

/path/to/engine/Build/BatchFiles/Build.bat ... -fullcrashdump

パッケージするときも

/path/to/engine/Build/BatchFiles/RunUAT.bat ... -fullcrashdump

クックやコマンドレットを起動するときも

/path/to/engine/Binaries/Win64/UE4Editor-Cmd.exe ... -fullcrashdump

常に -fullcrashdump をつけて作業していた。

それでも BuildSteps を利用した外部スクリプトが呼び出しているコマンドレットのクラッシュダンプは自動で取る手段がなかったので、デフォルトの出力をフルクラッシュダンプにしてみた。

Engine/Source/Runtime/CrashReportCore/Private/CrashDescription.cpp
FPrimaryCrashProperties::FPrimaryCrashProperties()
    ... // Initialize list
{
#if UE_BUILD_SHIPPING
    CrashDumpMode = ECrashDumpMode::Default;
#else
    CrashDumpMode = ECrashDumpMode::FullDump;
#endif
}

FCrashWERContext::FCrashWERContext( const FString& WERXMLFilepath )
    : FPrimaryCrashProperties()
{
    ...
#if UE_BUILD_SHIPPING
    CrashDumpMode = CommandLine.AsString().Contains( TEXT( "-fullcrashdump" ) ) ? ECrashDumpMode::FullDump : ECrashDumpMode::Default;
#else
    CrashDumpMode = CommandLine.AsString().Contains( TEXT( "-minicrashdump" ) ) ? ECrashDumpMode::Default: CrashDumpMode;
#endif
    ...
}
Engine/Runtime/Core/Private/GenericPlatform/GenericPlatformCrashContext.cpp
void FGenericCrashContext::Initialize()
{
    ...
#if UE_BUILD_SHIPPING
    NCached::Session.CrashDumpMode = (int32)ECrashDumpMode::Default;
#else
    NCached::Session.CrashDumpMode = (int32)ECrashDumpMode::FullDump;
#endif
    if (FPlatformMisc::SupportsFullCrashDumps() && FCommandLine::IsInitialized())
    {
        const TCHAR* CmdLine = FCommandLine::Get();
        if (FParse::Param(CmdLine, TEXT("fullcrashdumpalways")))
        {
            NCached::Session.CrashDumpMode = (int32)ECrashDumpMode::FullDumpAlways;
        }
        else if (FParse::Param(CmdLine, TEXT("fullcrashdump")))
        {
            NCached::Session.CrashDumpMode = (int32)ECrashDumpMode::FullDump;
        }
        else if (FParse::Param(CmdLine, TEXT("minicrashdump")))
        {
            NCached::Session.CrashDumpMode = (int32)ECrashDumpMode::Default;
        }
    }
    ...
}

これでテストビルド以外ではデフォルトでフルダンプが出ているので、バグ報告に対し「-fullcrashdump で再現してみて」というやりとりが減ることを期待する。

10
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
8