Windows こんなところにもクラッシュレポートがある

この投稿のターゲット

Windowsのトラブルシュートをする人。
Windowsのアプリのクラッシュやエラーの調査に興味をもつ人。

どんなことに役に立つのか

この投稿でクラッシュレポートから完全に原因を特定する事は出来ません。
しかし、ブルースクリーンのメモリダンプやイベントログだけで分からない原因となるプログラムなどを絞り込む事に寄与してくれるでしょう。

ここにありますクラッシュレポート

C:\ProgramData\Microsoft\Windows\WER\ReportArchive

上記のフォルダ内にアプリなどのクラッシュレポートが作成されます。

フォルダの中のクラッシュレポート例
ゲームやデバイス用アプリ、システムファイル

例えば、Kernel_1a~で始まるフォルダの中にあるクラッシュレポート、Report.werを見てみます。
これはBluescreenのレポートです。EventTypeにはBluescreenと書かれており、エラーコードやパラメーターがあります。エラーコード 1aは、バグ チェック 0x1A: MEMORY_MANAGEMENT です。
というようにデバッグツールを使わずともエラーコードの確認なども可能です。

アプリのクラッシュの場合は読み込みしているモジュールなどを確認する事で、クラッシュに関連するプログラムなども絞り込みが可能です。これらのクラッシュレポートで発生時間帯と概要をつかんでからイベントログで深堀してみるとエラー、警告以外にも情報レベルで関連するプログラムの実行など絞り込みができることもあるので面白いレポートだと思います。

補足

本題とはずれる雑学ですが、Report.werの中にある18桁の日時の形式はFILETIME形式です。
参考 Microsoft Learn FILETIME 構造体 (minwinbase.h)

Report.werファイルを格納しているフォルダは他の階層へコピーするとフォルダの日付がコピー時に更新されてしまいます。そうすると、いつ発生したクラッシュか分かりづらくなります。

私はとっさで分からなくなった時の為に次のようなBatへWerファイルをドロップして日時表示しています。

ドロップしたテキストファイル内にあるEventTime=を検索して、Powershellで日時で表示するものです。

@echo off
setlocal enabledelayedexpansion

rem ファイルがドラッグ&ドロップされているかチェック
if "%~1"=="" (
    echo ファイルがドラッグ&ドロップされていません。
    echo 使用方法: このBATファイルに.werファイルをドラッグ&ドロップしてください。
    pause
    exit /b 1
)

rem ドロップされたファイルのパスを取得
set "inputFile=%~1"

rem ファイルの存在確認
if not exist "%inputFile%" (
    echo ファイルが見つかりません: %inputFile%
    pause
    exit /b 1
)

echo 処理中のファイル: %inputFile%
echo.

rem PowerShellコマンドでEventTimeを抽出・変換
powershell -command "& { $content = Get-Content '%inputFile%' -Raw; if ($content -match 'EventTime=(\d{18})') { $eventTime = $matches[1]; Write-Host 'EventTime (生の値): ' $eventTime; try { $dateTime = [datetime]::FromFileTime([long]$eventTime); Write-Host '変換された日時: ' $dateTime.ToString('yyyy/MM/dd HH:mm:ss'); } catch { Write-Host 'エラー: 日時の変換に失敗しました。' $_.Exception.Message; } } else { Write-Host 'EventTimeが見つかりませんでした。'; Write-Host 'ファイル内容の一部:'; Get-Content '%inputFile%' | Select-Object -First 10 | ForEach-Object { Write-Host $_ }; } }"

echo.
echo 処理が完了しました。
pause

実行結果