ユーザーのマシンから有用な WPF .NET エラー情報を取得するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/2376028

質問

開発環境がインストールされていないマシンにインストールするとクラッシュする WPF アプリケーションがあります。これがカモなら閉じても構いませんが、私の検索機能では同等の質問が見つかりません。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();
    }

これで必要なものが手に入るといいのですが。助けてくれてありがとう!

役に立ちましたか?

解決

私が使用する手順はUnhandledException イベントを処理することですアプリケーションドメインインチ

あなたは多くのオプションを持っている、ことを行っているしたら。例外メッセージを含むダイアログボックスを示し、後の検査のためにそれを直列化、ファイルに例外をロギングます。

EDIT: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

他のヒント

スタック トレースを記録する未処理の例外イベント ハンドラーがあることに加えて、再現マシン上で生成されているクラッシュ ダンプを確認することも役立ちます。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 ファイルが含まれています。デバッガを接続してみましょう。

(アラステア・ピッツからの回答のように)例外ロギングがエラーの原因ににゼロで助けになります。

ラインP9にXamlParseの存在は、XAMLの説明から、コントロールまたはウィンドウを初期化する問題があるかもしれないことを示唆しています。そこアセンブリターゲットコンピュータ上で見つからなかったXAMLで参照することができる、またはXAML内の署名と一致しませんでした。

編集ます:

はXAMLの解析は、ウィンドウまたはコントロール

のコンストラクタで呼び出されるのInitializeComponent()で発生します

アリスターの答えに加えて、それは私が探していた手がかりを与えたの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();
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top