25

そのため、私はC#(および一般的には.NET / Visual Studio)で最初のステップを実行し、ポータブルライブラリとして単純なタイルパズルを作成し、さまざまなターゲットプラットフォーム用のUIを作成することから始めました。コンソールUIから始めて、WPFアプリケーションに移動しました。次に、「Windowsストア」を試してみましたが、ほとんどの場合、WPFコードをコピーして、名前空間とメソッドの署名を変更するだけで済みました。

しかし、動作が少し異なるものもあり、クラッシュしたことに関するあらゆる種類の情報を取得するために、1時間以上グーグルで検索しました。したがって、たとえば、従来のWPFアプリケーションで次のようなものを作成した場合:

Storyboard.SetTargetProperty(animation, 
     new PropertyPath("{Canvas.MispelledProperty}"));

例外が発生した正確な場所で.NET例外が発生します。Windowsストアアプリで同じ間違いをした場合、私が見ることができるのはこれだけです

#if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION
        UnhandledException += (sender, e) =>
        {
            if (global::System.Diagnostics.Debugger.IsAttached) global::System.Diagnostics.Debugger.Break();
        };
#endif

(編集:これはと呼ばれるファイルにありますApp.g.i.cs

そして、出力を注意深く見て、見つける必要があります

WinRT information: Cannot resolve TargetProperty (Canvas.MispelledProperty) on specified object.

場合によってはこれで十分かもしれませんが、それだけで十分だとは思えません。Storyboarが非常に簡単に整理される方法でニュアンスに関連する問題が発生しました(WPFの対応物のように起動されないアニメーションに直接添付された完了イベント)が、現在、このエラーについて完全に無知です:

A first chance exception of type 'System.ArgumentOutOfRangeException' occurred

乱暴にクリックするだけで、アプリ全体がクラッシュします。

今、私のアプリは本当に些細なもので、おそらく私が処理する方法PointerPressedPointerReleasedイベントと関係がありますが、最初からもっと良いものがないのは本当にイライラします。

したがって、実際の質問は次のようになると思います。実際にはこのようになっているのでしょうか、それともデバッガーを構成してより有用な情報を提供できるのでしょうか。そうでない場合:Windows Storeアプリを開発するときに、どのようなデバッグ手法/回避策を使用しますか?

アップデート:

最初は、これはWinRT関連の例外にのみ発生したと思いました。CLRの外部で発生し、適切にラップされていない場合ですが、未処理の例外はすべて App.g.i.cs、発生した場所ではなく、発生した場所に移動します。たとえば、メソッド内の範囲外のリストに意図的にアクセスして、例外が発生したときにVisual Studioがそこに移動するかどうかを確認しようとしましたが、代わりに再びに移動しましたApp.g.i.cs。ローカルではこれを取得Windows.UI.Xaml.UnhandledExceptionEventArgsし、メッセージ文字列にはスタックトレースのように見える情報が含まれていますが、行番号はありません。これが私の意図的なエラーの例です:

System.ArgumentOutOfRangeException
   at System.ThrowHelper.ThrowArgumentOutOfRangeException()
   at System.Collections.Generic.List`1.get_Item(Int32 index)
   at StorePuzzle.PuzzleRenderer.HandleTileReleased(Object sender, PointerRoutedEventArgs e)

App.g.i.cs私が欲しいのは、Visual Studioが、「Non Store Apps」のように私を連れて行くのではなく、例外が発生している場所に私をすぐに連れて行ってくれることです。さて、そのコンパイラプリプロセッサディレクティブは、私がそれをオフにすることができるように見えますが(#if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION)、それをグーグルで検索しても、そうする方法は示されていません。

4

4 に答える 4

4

ここで尋ねたスタック トレースとダンプの取得について、非常によく似た質問があります: C# で記述された WinRT アプリからクラッシュ ログとスタック トレースを取得するにはどうすればよいですか? .

Microsoft は、Android と比較して、WinRT アプリからクラッシュ情報を取得することを非常に困難にしています。Android とは異なり、単純なスタック トレースでアプリがクラッシュした理由を確認できる logcat のような組み込みのログはありません。Android はこれを開発者に提供し、コードを 1 行も書くように要求しません。

WinRT アプリの場合、この問題に対して独自のソリューションを展開する必要があるようです。例外をすべてログに記録したい場合は、さまざまな場所で例外が発生する可能性があります。また、すべてをログに記録しない場合、例外をログに記録する意味はありません。非常に手間がかかるようです。

この記事では、XAML 例外をキャッチしてログに記録できるようにする方法について説明します。

この記事では、非同期イベント コールバックのすべてのコードを try/catch でラップする必要がある理由について説明します。

このライブラリは、ロギングを行うのに適しているように見えますが、推奨される可能性のあるデータベースを必要とするより軽い選択がある場合、SQLite に依存しているため、少し重いように見えます。

アップデート:

Microsoft は、Windows 8.1 のいくつかの新しいログ機能を発表しました。ドキュメントは現在ここにあります。

http://msdn.microsoft.com/en-us/library/windows/apps/windows.foundation.diagnostics.loggingchannel

于 2013-04-26T20:34:04.427 に答える
1

ArgumentOutOfRangeException について: Visual Studio のデバッガーには、さまざまな種類の例外に対する特別なオプションがあります。例外の種類に対して "Thrown" をオンにしたことを確認する必要があります (ケースではすべての共通言語ランタイム例外を選択できます) http://msdn .microsoft.com/en-us/library/d14azbfh.aspx

WinRT について: WinRT の場合は、少し異なるケースだと思います。私は WinRT の専門家ではありませんが、Windows は実際には WPF とは異なる方法で XAML を操作しているように見えます。Windows はほとんど非同期で動作します (コントロールの生成、XAML の解析など)。これが、プロパティを設定しようとしている場所ではなく、未処理の例外として XAML から例外を取得する理由です。

于 2013-04-01T15:51:29.313 に答える
-1

VS2012 のローカル

Visual Studio 2012 の [ローカル] ペインを見ると、例外が呼び出されたときに $exception という値に気付くでしょう。ドリルダウンすると、問題に関するあらゆる種類の情報を見つけることができます。

于 2013-01-28T04:11:56.747 に答える