動かしていた.exeが突然死したよ、なんで?
そんな時にログとかダンプファイルとか欲しくなるよね?え?ならない?
今回はそんな状況別に応じて少し知見を書き溜める。
■そもそもダンプってなに
Windowsには、プロセスのクラッシュ発生時のメモリの状態をダンプファイル (.dmp)として自動保存できる機能がある。
ダンプを取得・解析することでプロセスが実行していた処理などの詳細を確認でき、
クラッシュの原因調査を行うことができる。
デフォルトでは無効になっている機能のため、レジストリを変更し、有効化する必要がある。
■「アプリケーションは応答していません」ポップアップが出たまま画面が固まっている時
ラッキーだ。プロセスを終了する前に、
タスクマネージャのプロセス一覧から選択して右クリックすれば「ダンプファイルを作成」ができる。
出力先を指定して(.dmp)を取得する。
■突然死してタスクマネージャにプロセスがいない
ログとダンプファイルを採取しよう。
① EventLog(.evtx) と Windows Error Reporting(.wer)の採取
プロセスクラッシュ発生時には、アプリケーションのイベントログに、
レベル:エラー、ソース:Application Error、イベントID:1000 でイベントが記録される。
1.Windowsキー + Rキー から eventvwr でレジストリエディタ起動する。
2.画面左メニューの[Windowsログ] - [Application] からエラーを探す。
3.エラーを右クリックして .evtx ファイルとして保存する。
4.ダンプファイル出力が設定されていれば、
エラーの次のイベントに、Windows Error Reporting(.wer)の出力先パスが一緒に出ている。パスを参照して取得する。
② ダンプファイル(.dmp)の採取 - ダンプが出ている時
%LOCALAPPDATA%\CrashDumps にある。
※C:\Users\{ユーザ名}\AppData\Local\CrashDumps
環境によってパスが異なる。後述④のレジストリパスを確認しよう。
③ ダンプファイル(.dmp)の採取 - ダンプが出ていなくて手元で再現できる時
管理者でコマンドプロンプト実行。
gflags でページヒープを有効にして、アプリケーションを動作させてクラッシュさせるとDumpがでる。(例:Application.exe)
C:\Program Files (x86)\Windows Kits\10\Debuggers\x64
gflags.exe /p /enable Application.exe /full
※問題が解決したら以下のコマンドで無効化するのを忘れないようにしよう
gflags.exe /p /disable Application.exe
④ ダンプファイル(.dmp)の採取 - ダンプが出ていなくて手元で再現できない時
ぶっちゃけどうしようもない。
ダンプファイルを出力するように設定して再現報告を待とう。
これはレジストリで機能を有効化する。
1.Windowsキー + Rキー から regedit でレジストリエディタ起動する。
2.「 コンピューター\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting 」
を右クリックして [新規] - [キー] から LocalDumps を作成する。
3.LocalDumps を右クリック - [新規] - [展開可能な文字列値] を選択し、[DumpFolder] の値を作成する。
値のデータをダンプファイル保存先のパスに設定する。
※アプリケーションによってはDumpFolderが登録されているものもある
4.LocalDumps を右クリックして [新規] - [DWORD] を選択、[DumpType] を作成し、値を [2] に修正する。
※2 はフルダンプを意味する。
5. LocalDumps を右クリックして [新規] - [DWORD] を選択、[DumpCount] を作成し、値を [10] に修正する。
※保存するダンプファイルの最大数。
上記の設定により、クラッシュが発生した場合、指定したパスにダンプファイルが生成されるようになる。
なお、本設定後の再起動は不要である。なお、作成したレジストリを削除することで、出力設定も解除できる。