WHEA イベント

状況

手元に不安定なWindows 10 PCがある。週に何度かブルースクリーンを吐く。
で、イベントビューアでCPUにかかわるエラーWHEA-Loggerが多発してることがわかったので、BIOS設定からCPU Load-Line Calibrationを調整したらブルースクリーン出なくなったっぽい。
で、イベントビューアのWHEAってなんじゃそりゃと気になったので調べた。

WHEA is 何

Windows Hardware Error Architecture

EFIファームウェアは、ハードウェアで検出したエラーをOSにCPER(Common Platform Error Record)というしくみで報告する。 メモリのECCエラーとか、PCI-Expressのエラーとか、CPUのキャッシュの不具合とか、そういうのが対象っぽいです。

Windowsが受け取ったCEPRは、イベントビューアに"WHEA-Logger"または"Kernel-WHEA"として記録される。発生状況によって両方に記録されたり片方にしか記録されなかったりする。違いが謎。
(Windowsで理解できる形式のCEPRはWHEA-Logger、理解できない(未知の)CEPRはKernel-WHEAで記録している?)

で、イベントビューアにはCPERの生データのバイナリが記録されている。コイツを解析すれば、ハードウェア不具合のより詳しい状況がわかるはずである。

イベントログIDの例

  • WHEA-Logger, EventID:19 … CPU内部のエラーっぽい
    • Cache Hierarchy Error
    • Internal parity error

CPERを読みたい

CPER(Common Platform Error Record)の形式はEFIの規格で制定されている。たぶん仕様書も公開されてる。なので読もうと思えば読める。

これはイベントビューアから持ってきたWHEAの生データ。 435045521002FFFFFFFF03000200000002000000680300000B060A00070115140000000000000000000000000000000000000000000000000000000000000000BDC407CF89B7184EB3C41F732CB57131B248949139377F4BA8F1E0062805C2A377C6CF4D86E2D60100000000000000000000000000000000000000000000000058010000C00000000003000001000000ADCC7698B447DB4BB65E16F193C4F3DB0000000000000000000000000000000002000000000000000000000000000000000000000000000018020000400000000003000000000000B0A03EDC44A19747B95B53FA242B6E1D0000000000000000000000000000000002000000000000000000000000000000000000000000000058020000100100000003000000000000011D1E8AF94257459C33565E5CC3F7E8000000000000000000000000000000000200000000000000000000000000000000000000000000005701000000000000000208000000000055060A000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B00000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000B0000000000000055060A000008200BFFFBFA7FFFFBEBBF000000000000000000000000000000000000000000000000000000000000000002000000010000009853A8B9DCE4D6010B0000000000000000000000000000000000000000000000050001004000009000000000000000000000000000000000000000000B0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

最初の4バイト43504552はCPERシグネチャであり、ASCIIコードでCPERと書かれとる。(PNGファイルは必ず 89 50 4E 47 臼NG から始まる、みたいなやつですね)

ところで、CPUで起きたエラーは9876ccad-47b4-4bdb-b65e-16f193c4f3dbというGUIDと定義されている。
というわけで、このGUIDの頭4byteの並び順を変えてad cc 76 98で目grepすると、ADCC7698B447DB4BB65E16F193C4F3DBという、なんか似たようなバイト列が見つかり、CPUのエラーが発生したんだなあ、ということがわかる。

CPERを扱うプログラムはLinuxカーネルにも入ってるので、ソースコードを読めばいろいろわかる。

で、このCPERをパース(解読)できれば、WHEAイベントから詳しい情報を得られて故障部位の特定に役立つはずである。
なのでCPERを解読するプログラムがあるといいなあと思ったが、残念ながら見つからなかった。
故障診断に役立つはずなので、誰か作ってほしい。
UEFIの仕様書を読んだり、Linuxカーネルのソースコードを参考にすれば作れそうだが、私は面倒なのでやらない。

コメントを残す

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

WordPress.com ロゴ

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

Facebook の写真

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

%s と連携中