BLOGブログ

2019.01.30UE4

[UE4] Fatal error! 時にブループリントのコールスタックをログ出力する

執筆バージョン: Unreal Engine 4.21

 

こんにちは!突然ですが、みなさんはこんなメッセージに出会ったことはありますか?

そう、UEで作っているゲームがクラッシュしたのです。
なんて簡潔なメッセージ。

…ヤバイ。早く解決したい。クラッシュはイヤだ!

解決するためには情報が欲しい!
情報は少しでも多い方がいい!
そう、C++のコールスタックだけじゃなくて、呼び出し元ブループリントのコールスタックもログ出力したいんだ!

というわけで、出力できるようにしましょう。
今回は、C++で追加した GameInstance に実装してみました。
やることは、「FCoreDelegates::OnHandleSystemError デリゲートに割り当てた関数内で、FFrame::GetScriptCallstack() の戻り値を UE_LOG() する」です。

MyGameInstance.h

MyGameInstance.cpp

テストのため、意図的にクラッシュを発生させるためのクラスも用意しましょう。
C++でアクタを作って、void Crash() 関数を追加するだけです。

MyActor.h

MyActor.cpp

テスト用に用意したレベルのレベルブループリントで、以下のようにブループリント関数を作って、BeginPlay から呼び出しましょう。

このゲームをパッケージして実行すると、3秒後に Fatal error! メッセージが表示されます。
メッセージを閉じてゲームを終了し、(パッケージフォルダ)/(ゲーム名)/Saved/Logs 以下を見ると、(ゲーム名).log というログファイルが出力されています。
ログファイルを開くと、以下のように、呼び出し元ブループリントのコールスタックが出力されていることが分かります。

C++で作られた機能を、ブループリントのいろいろな場所で呼び出している場合の不具合箇所特定には、特に有用です。
クラッシュ時のデバッグに、ぜひご活用ください。