4.27にてWidgetAnimationのイベントトラックを使用している場合時々クラッシュする

ご指摘ありがとうございます。

再度確認したところ、ブレイクを貼った状態ではアサートに「fatal error!」のみが出ており、コールスタックも別物であることを確認いたしました。ブレイクを貼らない状態では「Cast of nullptr to UserWidget failed」が出ておりましたので、同様と判断してしまっておりました。「Cast of nullptr to UserWidget failed」でのブレイク確認ができないか検証してまいります。

現在「DebugGame Editor」でのビルドをおこなっておりますが、こちらがデバッグビルドで合っているでしょうか?また、この環境でのコールスタックを再度添付する認識で合っていますか?(ブレイクを貼らない「Cast of nullptr to UserWidget failed」でのコールスタックを添付する予定です)

[Attachment Removed]

DebugGameEditorはプロジェクト側のコードをDebugビルドで、エンジン側を​Developmentビルドでエディタをビルドする設定です。

このクラッシュはエンジン内のコードで発生しているのでDebugEditorで再現できたほうがより多くの情報を取り出せます。

クラッシュはパッケージビルドの実行時に発生していると思っていたのですが、エディタ内のPIEの実行時に発生していますか?

もしエディタではなくパッケージビルドでクラッシュしているのであれば Debugコンフィギュレーションでパッケージを生成していただく必要がございます。​

[Attachment Removed]

>クラッシュはパッケージビルドの実行時に発生していると思っていたのですが、エディタ内のPIEの実行時に発生していますか?

最初に添付したコールスタックはパッケージでの発生ですが、その後はエディタPIEの「スタンドアローンゲーム」起動にて発生を確認しております。

DebugEditorとのこと承知いたしました、解説もありがとうございます。DebugEditorにて試してきます。

[Attachment Removed]

スタンドアローンゲームで発生する件承知しました。それであればDebugEditorで再現いただけると確実なコールスタックとnullptrになっている変数を完全に特定できると思います。

それでも特定に至らない場合はクラッシュした状態でフルダンプを取っていただき、デバッグシンボルなどの必要なファイルを含めてアップロードいただいて調査することも可能ですのでご検討ください。

[Attachment Removed]

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

DebugEditorではクラッシュが発生せずdmpが生成されませんので、一旦ブレイクでの調査結果をお伝えいたします。

▽nullptrの原因と思われる箇所

・GUObjectArray.IsValid(ObjectItem, bEvenIfPendingKill))がfalseで返っているためと思われる

・ObjectItem及びObjectItem->ObjectにはUUserWidget継承したウィジェットが入っておりbEvenIfPendingKillはfalseのため、上記以外でのnullptr返却の可能性が見当たりませんでした。

・GUObjectArray.IsValid(ObjectItem, bEvenIfPendingKill))内部にはブレイクを貼っても入ることができず、特定できておりません。

WeakObjectPtr.cpp:235
 
/** Private (inlined) version for internal use only. */
 
FORCEINLINE_DEBUGGABLE UObject* Internal_Get(bool bEvenIfPendingKill) const
 
{
 
	FUObjectItem* const ObjectItem = Internal_GetObjectItem();
 
	return ((ObjectItem != nullptr) && GUObjectArray.IsValid(ObjectItem, bEvenIfPendingKill)) ? (UObject*)ObjectItem->Object : nullptr;
 
}

▽クラッシュまでの流れ

CastLogError(const wchar_t *,const wchar_t *) Casts.cpp:11

CastChecked<UUserWidget,UObject>(UObject *) Casts.h:256

Internal_Get(bool bEvenIfPendingKill) const WeakObjectPtr.cpp:235

FWeakObjectPtr::Get(/*bool bEvenIfPendingKill = false*/) const WeakObjectPtr.cpp:81

UUMGSequencePlayer::GetPlaybackContext() const UMGSequencePlayer.cpp:372

UWidgetAnimation::CreateDirectorInstance(IMovieScenePlayer &,FMovieSceneSequenceID) WidgetAnimation.cpp:258

▽補足

・タイミングとしてはレベル遷移時ですが、他のフォーカスウィジェット等ではUUMGSequencePlayer::GetPlaybackContext(UserWidget.Get();)でのnullptr返却はありませんでした。

dmpについて確認を行っておりますので、少々お待ち下さい。

dmpが生成されない原因としては、CastLogErrorにてUE_LOG(LogCasts, Fatal, TEXT(“Cast of %s to %s failed”), FromType, ToType);がありますがDebugEditorではクラッシュせず、

void FWindowsErrorOutputDevice::Serialize( const TCHAR* Msg, ELogVerbosity::Type Verbosity, const class FName& Category )でのFPlatformMisc::RequestExit( true );にて終了しているためのようでした。

[Attachment Removed]

dmpの提出ですが、上長に確認したところ非公開質問にてdmp提出をするようにとの指示がございました。

そのため上記では情報が足りない場合は、本質問を非公開に変更するか、新たに非公開質問を作成予定です。

よろしくお願いいたします。

[Attachment Removed]

GUObjectArray.IsValidでnullを返している場合ログに警告が出ている可能性がありそうです。なにか出力されていたらご共有ください。

ポインタがあるのにIsValidがnullを返すのであれば GCされている (IsUnreachable) か PendingKill フラグが立っているかになると思います。

対象のUMGは正しく参照がつながっていますか?

dmpはデバッグ中であればVSのデバッグメニューからダンプを出力できると思います。

ダンプの受け渡しについてはファイルサイズが大きくなることからクラウドストレージをご案内させて頂いておりますのでメールアドレス宛てに招待を送らせていただきました。ご確認ください。

必要あらばこのトピックをクローズに変更することも可能ですので、その方が好ましいようであればお申し付けください。

[Attachment Removed]

>必要あらばこのトピックをクローズに変更することも可能ですので、その方が好ましいようであればお申し付けください。

dmp内容のやり取りを行いたいため、このトピックはクローズをお願いいたします。何度も日にちが空き申し訳ございませんでした。日を空けて、別途非公開質問を行う予定です。

新規で質問を行う際にも、頂いたクラウドストレージを使用予定ですので、こちら認識が違いましたらご指摘お願いいたします。

ログ等もそちらで確認予定となりますので、お手数おかけしますがよろしくお願いいたします。

[Attachment Removed]

改めてプライベートトピックを立て直す件承知しました。

確認なのですが現在は

>2件目が原因Widget及びアニメーションを特定済みの毎回発生するものとなります。(アニメーションのイベントトラック削除にて回避済み)

このクラッシュについて原因を調べているという状況だと認識しておりますが、

イベントトラック削除で回避することは適切な代替手法により表現上問題無い状態になっているという認識でよろしいでしょうか?

これにもし間違いなければ、将来的に同じ構造のイベントが作成されてクラッシュが再発してしまいかねない事を注意して、タイトルを運用されるこということも選択肢に入ると思います。

[Attachment Removed]

>このクラッシュについて原因を調べているという状況だと認識しておりますが、

イベントトラック削除で回避することは適切な代替手法により表現上問題無い状態になっているという認識でよろしいでしょうか?

エディタで確定発生しているクラッシュについては認識に相違ございません。

原因Widget及びアニメーションを特定できていない、1度だけ発生したクラッシュについては再現しないため様子見となっております。

>将来的に同じ構造のイベントが作成されてクラッシュが再発してしまいかねない事を注意して、タイトルを運用されるこということも選択肢に入ると思います。

こちらクラッシュの懸念事項として、少なくとも0フレームと最終フレームにイベントトラックを設置しないように呼びかけております。途中フレームに入れることは現状制限しておりませんので、クラッシュ発生次第確認といった運用となっております。

[Attachment Removed]

状況について承知しました。回避策が通用しないクラッシュのダンプが取れたらご共有ください。

[Attachment Removed]

[mention removed]

ありがとうございます!修正CLの方、確認させていただきます。

>いわゆるLoadMapやSeamlessTravel中とかといった状態でなく、レベル遷移の「後」にウィジットアニメーションが動作してクラッシュが発生するというようなニュアンスでよろしいでしょうか。

おそらくはそのニュアンスで合っております。

対象ウィジェットがボタン汎用フォーカスアニメーションであることから、いろんな場面で使用されております。レベル遷移前、後でそれぞれ別のウィジェットとして作成され、フォーカス移動があるたびにアニメーション再生を行っている認識です。

こちら、原因の予測の1つとして、「GetWorld()がない状態でアニメーション再生をしているのでは」といったものがあったことと、タイミング的にもレベルを遷移するタイミングであったことから「レベル遷移時に該当アニメーション再生を行うと」といった文言を使用いたしました。

[Attachment Removed]