公開している UWP アプリケーションのクラッシュ解析の為に HockeyApp を導入してますが、その HockeyApp で確認できるスタックトレースが全く役になっていなかったので、調べて改善してみました。
実際に HockeyApp で確認できるスタックトレースは以下のような感じです。
PDB をアップロードしておけばポインタ表示になっている部分はメソッド名になってくれますが、それでも結局どこで発生した例外なのかが全然わからないです。
唯一分かるのは OnNavigationFailed がルートになっているので、Frame.Navigate を呼び出した後に何処かで例外が投げられたということぐらいです。なので、HockeyClient の初期化時に DescriptionLoader を追加することにしました。
public sealed partial class App { public App() { HockeyClient.Current.Configure("APP_ID") .SetExceptionDescriptionLoader(ex => ex.ToString()); InitializeComponent(); Suspending += OnSuspending; } }
SetExceptionDescriptionLoader の呼び出しを追加しただけです。引数として投げられた例外が渡されてくるので、単純に ToString して返すだけのコードです。
この状態で同じように例外が投げられた時には、HockeyApp の Description にまともなスタックトレースが記録されるようになりました。
スタックトレースからは OnNavigatedFrom で例外が投げられたことだと分かります。
しかし OnNavigatedFrom ではイベントからデリゲートを削除しているだけなので、正直こんなところで落ちられると困る感じです。
protected override void OnNavigatedFrom(NavigationEventArgs e) { _dataTransferManager.DataRequested -= DataTransferManager_DataRequested; }
どうしようもないので、try ~ catch で囲んでお茶を濁すことにしました。発生頻度はそんなに高くないみたいでしたが、特定の端末では頻繁に発生していたので妥協しました。