16

開発環境がインストールされていないマシンにWPFアプリケーションをインストールすると、クラッシュするWPFアプリケーションがあります。これが重複している場合は、閉じることを歓迎しますが、search-fuは同等の質問を見つけることができません。XamlParseExceptionが発生しているようですが、それ以上に便利なものはありません。役立つ情報を入手する必要があります。

Windows 7のイベントログを確認すると、次のエラーログが表示されます。

Fault bucket , type 0
Event Name: CLR20r3
Response: Not available
Cab Id: 0

Problem signature:
P1: MyApp.exe
P2: 1.0.0.0
P3: 4b88323d
P4: PresentationFramework
P5: 3.0.0.0
P6: 4a174fbc
P7: 624f
P8: e1
P9: System.Windows.Markup.XamlParse
P10: 

Attached files:
C:\Users\Mark\AppData\Local\Temp\WER7DC.tmp.WERInternalMetadata.xml

These files may be available here:
C:\Users\Mark\AppData\Local\Microsoft\Windows\WER\ReportArchive
 \AppCrash_generatortestbed_4fa7dff09a9e893eb675f488392571ced4ac8_04ef1100

Analysis symbol: 
Rechecking for solution: 0
Report Id: cd55060c-271f-11df-b6ff-001e52eefb8e
Report Status: 1

これらのディレクトリを確認しましたが、最初のディレクトリは存在しませんが、2番目のディレクトリにはロードされたdllを一覧表示するwerファイルが含まれています。

テストマシンに開発環境をインストールすることはできましたが、テストマシンに失敗し、元の状態に戻りました。開発環境がインストールされていてもこのエラーは発生しないため、詳細で有用なエラーメッセージを取得する方法がわかりません。

編集:以下の@Alastair Pittsのコメントに基づいて、例外処理に入力した方法は次のとおりです。

    private void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) {
        Exception theException = e.Exception;
        string theErrorPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + "\\GeneratorTestbedError.txt";
        using (System.IO.TextWriter theTextWriter = new System.IO.StreamWriter(theErrorPath, true)){
            DateTime theNow = DateTime.Now;
            theTextWriter.WriteLine("The error time: " + theNow.ToShortDateString() + " " + theNow.ToShortTimeString());
            while (theException != null) {
                theTextWriter.WriteLine("Exception: " + theException.ToString());
                theException = theException.InnerException;
            }
        }
        MessageBox.Show("The program crashed.  A stack trace can be found at:\n" + theErrorPath);
        e.Handled = true;
        Application.Current.Shutdown();
    }

うまくいけば、私はこの方法で必要なものを手に入れるでしょう。助けてくれてありがとう!

4

4 に答える 4

15

私が使用する手順は、アプリドメインでUnhandledException イベントを処理することです。

それが済んだら、いくつかのオプションがあります。例外をファイルに記録し、後で検査するためにシリアル化し、例外メッセージを含むダイアログボックスを表示します。

編集:XamlParseException'は、メインウィンドウが作成されているときに発生します。これは、そのウィンドウのコンストラクターが呼び出されていることを意味します。そのコンストラクターでロジックを実行すると、結果として生じる例外はすべてをスローしXamlParseExceptionます。UnhandledExceptionハンドラーは引き続きこの例外をキャッチすることを理解しています。

WPFでイベントをフックUnhandledExceptionアップするには、app.xamlにイベントフックアップを追加します

<Application 
   x:Class="DispatcherUnhandledExceptionSample.App"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   StartupUri="MainWindow.xaml"     
   DispatcherUnhandledException="App_DispatcherUnhandledException" />

次に、app.csにメソッドを追加します

public partial class App : Application
{
    void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
    {
        // Process unhandled exception do stuff below

        // Prevent default unhandled exception processing
        e.Handled = true;
    }
}

MSDN

于 2010-03-04T00:16:44.953 に答える
2

スタックトレースをログに記録する未処理の例外イベントハンドラーがあることに加えて、再現マシンで生成されているクラッシュダンプを確認することも役立ちます。Windows 7だとおっしゃっていたので、次の方法で対応するクラッシュダンプを探すことができます。

  1. [コントロールパネル]->[すべてのコントロールパネル項目]->[アクションセンター]->[メンテナンス]/[報告されていない問題の解決策を確認する]領域の下にある[報告する問題の表示]リンク。これにより、クラッシュしたアプリケーションのリストが表示され、それらにドリルダウンしてダンプファイルと情報を見つけることができます。問題の技術的な詳細の左下にある[これらのファイルの一時的なコピーを表示する]リンクを探します。これにより、ダンプファイルが抽出され、エクスプローラウィンドウに表示されます。

  2. cd / d%ProgramData%\ Microsoft \ Windows\WER。

WERは、そのディレクトリの下にクラッシュダンプを保持しているようです。そのため、私が行うのは、そこにあることがわかっているアプリ名の一部のdir / s/bです。たとえば、crashyapp.exeという名前の意図的にクラッシュするアプリを作成しました。

C:\ ProgramData \ Microsoft \ Windows \ WER> dir / s / b * crashy *
C:\ ProgramData \ Microsoft \ Windows \ WER \ ReportQueue \ AppCrash_crashyapp.exe_56f8d710d72e31d822d6b895c5c43a18d34acfa1_cab_2823e614
    
そのディレクトリには、クラッシュのhdmpファイルとmdmpファイルが含まれています。デバッガーを接続する時が来ました!

于 2010-11-03T01:03:18.400 に答える
1

例外ロギング(Alastair Pittsからの回答のように)は、エラーの原因を特定するのに役立ちます。

行P9にXamlParseが存在することは、XAML記述からのコントロールまたはウィンドウの初期化に問題がある可能性があることを示しています。XAMLによって参照されているアセンブリが、ターゲットコンピューターで見つからなかったか、XAMLの署名と一致しなかった可能性があります。

編集:

XAML解析は、ウィンドウまたはコントロールのコンストラクターで呼び出されるInitializeComponent()で行われます。

于 2010-03-04T00:29:44.583 に答える
0

Alistairの答えに加えて、私が探していた手がかりを与えてくれたのはInnerExceptionです。

public partial class App : Application {
    void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) {
        Exception ex = e.Exception;
        Exception ex_inner = ex.InnerException;
        string msg = ex.Message + "\n\n" + ex.StackTrace + "\n\n" +
            "Inner Exception:\n" + ex_inner.Message + "\n\n" + ex_inner.StackTrace + "\n\n" + 
            Utils.RegistryVersion();
        MessageBox.Show(msg, "Drop Print Batch Application Halted!", MessageBoxButton.OK);
        Utils.MailReport(msg);
        e.Handled = true;
        Application.Current.Shutdown();
    }
}
于 2016-01-14T01:40:06.407 に答える