web-dev-qa-db-ja.com

「アプリ名[procId]で未処理のwin32例外が発生しました」をキャッチする方法。

c#、Visual Studio 2013、Windowsストアアプリを使用

少し長い説明

JSONで保存されたデータを処理する簡単なWindowsストアアプリを作成します。データ量を増やした後、メッセージUnhandled win32 exception occured in AppName [procId].が表示され始めます-下の写真を参照してください:

enter image description here

JSONファイルに保存されるデータの量を減らしようとしましたが、デバッグ中に作業をしばらく休んだ後、このメッセージが再び表示されました。したがって、状況-データが多い場合-アプリで実行できる操作はほとんどなく(5を意味することはほとんどありません)、この例外が発生します。データの最小量がある場合は、アプリでもう少し作業できます(平均12〜17操作)。操作手段-ファイルからの読み取り、保存、ページのロードなど。

私はグーグルを少しして、考えられる原因をいくつか見つけました:

  • 次の手順に従って、PCでDEPをセットアップする必要があります:

    1. 「マイコンピュータ」を右クリックします。次に、「プロパティ」を選択します。
    2. 「詳細」タブを選択します。
    3. 「パフォーマンス」で「設定」を選択します。
    4. 「データ実行防止」タブを選択します。
    5. [重要なWindowsプログラムおよびサービスに対してのみDEPをオンにする]オプションを選択します。このオプションがすでに選択されている場合は、「OK」をクリックしてから、もう一度「OK」をクリックします。
    6. コンピュータを再起動してください。

試してみてください-役に立たない

  • VISUAL STUDIOでジャストインタイムデバッグを確認して有効にします

enter image description here

試してみてください-役に立たない

  • VSがキャッチできる例外のタイプを確認してください-すべて選択してください:

enter image description here

試してみてください-役に立たない

次に見つかりました:

で未処理のwin32例外が発生しました。この例外のジャストインタイムデバッグは、次のエラーで失敗しました。ログインしたユーザーには、クラッシュしたアプリケーションをデバッグするためのアクセス権がありませんでした。このメッセージは、適切なアクセス許可がないため、ジャストインタイムデバッグが失敗したことを示しています。

つまり、適切なアクセス許可がないということです。

管理者権限でアプリを起動してみてください:

enter image description here

試してみてください-役に立たない

  • ここからの投稿もたくさん読んでください

見つかった this など this MSDN 投稿は役に立ちました。アプリにコードを追加してみてください。

    public MainPage()
    {
        this.InitializeComponent();
        this.navigationHelper = new NavigationHelper(this);
        this.navigationHelper.LoadState += navigationHelper_LoadState;
        this.navigationHelper.SaveState += navigationHelper_SaveState;
        TimeBinding();
        Application.Current.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);
    }

    static void MyHandler(object sender, UnhandledExceptionEventArgs args)
    {
        string e = args.Message.ToString();
    }

しかし、何もキャッチされませんでした...

だから、試してみてください-助けにはなりません

質問:

  1. このメッセージが表示された理由と、説明していない理由が"Unhandled win32 exception occured in AppName [procId]."のような例外の根本原因である可能性がありますか?
  2. UnhandledExceptionの使い方を正しく理解していますか?たぶん私はそれが間違っているので、必要な例外をキャッチできません(私は.NETのために勉強しているだけです)?
18
gbk

数ヶ月前、私は実際にこの仕事のために エラー制御システム を設計しました。このプロジェクトでは、このメインコードを使用して、win32アプリケーションの例外をキャッチしました。

System.Windows.Forms.Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

// Catch all handled exceptions in managed code, before the runtime searches the Call Stack 
AppDomain.CurrentDomain.FirstChanceException += FirstChanceException;

// Catch all unhandled exceptions in all threads.
AppDomain.CurrentDomain.UnhandledException += UnhandledException;

// Catch all unobserved task exceptions.
TaskScheduler.UnobservedTaskException += UnobservedTaskException;

// Catch all unhandled exceptions.
System.Windows.Forms.Application.ThreadException += ThreadException;

// Catch all WPF unhandled exceptions.
Dispatcher.CurrentDispatcher.UnhandledException += DispatcherUnhandledException;

そしてリスナーメソッド:

/// <summary>
/// Used for handling WPF exceptions bound to the UI thread.
/// Handles the <see cref="System.Windows.Threading.DispatcherUnhandledExceptionEventHandler"/> events.
/// </summary>
[HandleProcessCorruptedStateExceptions]
private static DispatcherUnhandledExceptionEventHandler DispatcherUnhandledException
{
    // catch error ...            
}

/// <summary>
/// Used for handling WinForms exceptions bound to the UI thread.
/// Handles the <see cref="System.Threading.ThreadExceptionEventHandler"/> events in <see cref="System.Windows.Forms.Application"/> namespace.
/// </summary>
[HandleProcessCorruptedStateExceptions]
private static ThreadExceptionEventHandler ThreadException
{
    // catch error ...        
}

/// <summary>
/// Used for handling general exceptions bound to the main thread.
/// Handles the <see cref="AppDomain.UnhandledException"/> events in <see cref="System"/> namespace.
/// </summary>
[HandleProcessCorruptedStateExceptions]
private static UnhandledExceptionEventHandler UnhandledException
{
    // catch error ...        
}

/// <summary>
/// Used for handling System.Threading.Tasks bound to a background worker thread.
/// Handles the <see cref="UnobservedTaskException"/> event in <see cref="System.Threading.Tasks"/> namespace.
/// </summary>
[HandleProcessCorruptedStateExceptions]
private static EventHandler<UnobservedTaskExceptionEventArgs> UnobservedTaskException
{
    // catch error ...        
}

/// <summary>
/// This is new to .Net 4 and is extremely useful for ensuring that you ALWAYS log SOMETHING.
/// Whenever any kind of exception is fired in your application, a FirstChangeExcetpion is raised,
/// even if the exception was within a Try/Catch block and safely handled.
/// This is GREAT for logging every wart and boil, but can often result in too much spam, 
/// if your application has a lot of expected/handled exceptions.
/// </summary>
[HandleProcessCorruptedStateExceptions]
private static EventHandler<FirstChanceExceptionEventArgs> FirstChanceException
{
   // catch error ...        
}

コード内で例外をスローする場合は、このイベントで必ずキャッチする必要がありますが、アプリケーションを実行する前に例外が発生した場合、このイベントは表示または実行するために発生しません。
たとえば、すべての参照アセンブリがプロジェクトに正確に追加されていない場合、アプリケーションの起動時に例外がスローされます。

また、threadまたはtasksから発生したため、別の例外にはinnerExceptionが含まれる場合があります。したがって、すべてをチェックする必要がありますexception.innerException

私はあなたの問題の解決策を提示したいと思っています。

1
Behzad