Windows Error Reporting Part.1

ちょっと深いデバッグネタを紹介していきたいと思います。
Vista 以降、OS がアプリケーションに対して提供するデバッグアーキテクチャは大きく変更されました。

XP/2003 までは、ワトソン博士というのがあったのですが、Vista 以降は、大体、こんな仕組みで動いています。
カーネルが介入することによって、エラーロジック(ワトソン博士)そのもののエラーがなくなったので、
ほぼ間違いなく、エラー処理が実行されるというわけです。

デバッグアーキテクチャ

  1. WER サービス(WerSvc)は、OS ブート時にカーネルに対して、ポートを登録する。
  2. アプリケーションエラーは、一番最初に、カーネルが検知する。そして、カーネルがアプリケーションに
    対して、エラーが発生したことを通知するわけです。(これが、First Chance)
  3. アプリケーションの例外ハンドラーや、未処理の例外はカーネルに対して EXCEPTION_CONTINUE_SEARCH を
    返す。
  4. カーネルは、ポートを通して、WerSvc を呼び出す。
  5. WerSvc は、Windows Problem Reporting(Windows 問題レポート: werfault.exe)を呼び出し、画面表示する。
  6. もし、JIT デバッガが有効になっていたら、エラーを起こしたアプリケーションにデバッガをアタッチさせる。
  7. Windows Problem Reporting は、JIT デバッガを起動したことをカーネルに返し、カーネルはデバッガに例外を
    ディスパッチする。

WER_サービス

アプリケーションがエラーになった際に表示される以下の画面ですが、これが werfault.exe です。

WER_表示

「オンラインで解決策を確認してプログラムを終了します」をクリックすると、

    WER_送信中

で、この間、バックグラウンドで WerSvc が取得したダンプファイルを Microsoft WER サイトに送信しています。
その後、次の画面に遷移します。

WER_終了

WER では、レジストリを変更することで設定を変更することができます。

例えば、WER でダンプを Microsoft に送信せず、ローカルに保存したい場合。
企業内ではふつーにあるシナリオです。管理者権限で動くプロセスに対する設定は

HKLM\Software\Microsoft\Windows\Windows Error Reporting@ForceQueue = 1

ユーザー権限で動くプロセスに対する設定は

HKCU\Software\Microsoft\Windows\Windows Error Reporting@ForceQueue = 1

ForceQueue の値は、デフォルトで 0 です。0 は、Microsoft WER サイトにダンプを送信します。
1 にすると、送信せずに、ローカル PC 内に保存します。保存場所は

  • 通常のプロセス(ユーザー権限で動く)
    %LOCALAPPDATA%\Microsoft\Windows\WER\ReportArchive
    %LOCALAPPDATA%\Microsoft\Windows\WER\ReportQueue
  • 管理者権限で実行されているプロセス
    %ALLUSERSPROFILE%\Microsoft\Windows\WER\ReportArchive
    %ALLUSERSPROFILE%\Microsoft\Windows\WER\ReportQueue

になり、こんな感じです。

WER_ReportQueue

あまり、評判のよくなかった Windows Vista ですが、実は、多くの新テクノロジーが Vista から実装されています。
そう考えると、Vista は実は ”いいやつ” なんです。

参考文献

なお、Windows 7 では、WER は Fault Tolerant Heap との連携もあります。
(FTH は以前紹介しました)

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。