ダンプ関連記事
やりたいこと
何かの原因でアプリがおちてしまう、クラッシュしてしまうという現象が起きた時に、その原因を調べたい。
特に、自分のPCでVisualStudioでデバッグ実行して、落ちた部分でbreakさせて調査をしたいが、自分のPCでは起きてくれず、リモートデバッグも出来ない状況というときに、なんとかして手がかりを得たい。
別解
以前、下記の記事でProcDumpというツールを使ってダンプファイルを作るということをした。
ProcDumpを使ったダンプファイルの作成と解析
https://qiita.com/tera1707/items/26b7d19e7ae1b4978f9f
ProcDumpでもダンプ採取はできるが、そちらとの違いは、下記かなと思う。
- ProcDumpの方が、アプリがクラッシュしていなくても、アプリ内部で指定の例外が起きているだけでもダンプを取れる(WER(今回のやり方)だと、クラッシュしないとダンプ取れない)
- WERの方が、専用のexe等を持ってこなくてもよいので、簡単に準備、ダンプ採取できる。(ProcDumpはツールをダウンロードして対象のPCにもっていかないといけない)
USBメモリ等を使ってexeファイルを入れることができないような環境でテストや評価をしているときで、アプリがクラッシュしてしまう場合は、レジストリの設定を行うだけでダンプ採取できるWERの方がやりやすいかもしれない。
やり方
下記のレジストリの設定を行う。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps
キー名 | 概要 |
---|---|
DumpFolder | ダンプファイルの出力先フォルダを指定する。 |
DumpCount | 出力先フォルダに残すダンプファイルの数を指定する。 例えば2にすれば、3つ目のダンプが出来た時には最初の1つ目を自動で消して、残るファイルを2つにしてくれる |
DumpType | 0:カスタムダンプ 1:ミニダンプ 2:フルダンプ |
CustomDumpFlags | DumpTypeに0(カスタムダンプ)を指定したときに、どういうダンプにするか指定できる。 ※個人的には大きなダンプファイルが保存できないなどの制約がなければ、DumpTypeは2(FullDump)にしてデバッグしやすいようにすべきではと思う(のでこの値は設定しない) |
例)C:\dumps
にダンプを最大2つまでのフルダンプのファイルを保存しようとした場合
上記レジストリの設定をした状態で対象のアプリがクラッシュすると、DumpFolder
で指定したフォルダにダンプファイルが出来上がる。そのダンプファイルをVisualStudioで開くなどして、クラッシュ時の解析を行う。
regファイルで簡単レジストリ登録
下記の内容で、regファイルを作成すれば、簡単にWERの設定ができる。(win11で確認)
ダンプ5ファイル、フルダンプを採取の場合は下記。
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps]
"DumpCount"=dword:00000005
"DumpFolder"="C:\\dumps"
"DumpType"=dword:00000002
このテキストを「WER.reg」などの名前で保存して、対象のPC上で管理者で実行すれば、WERの設定をポンと行うことができる。
実験
ダンプファイルの採取実験
以前作った、クラッシュするプログラムを使って実験する。
https://qiita.com/tera1707/items/26b7d19e7ae1b4978f9f#%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0
上記コードでクラッシュさせると、dmpファイルが指定のフォルダに出来上がる。
解析
上で出来たダンプファイルを、VisualStudio2019で開く。
以降の操作は、以前の記事のやり方(ProcDumpで採取したダンプの解析)と同じでOK。
https://qiita.com/tera1707/items/26b7d19e7ae1b4978f9f#visualstudio2019%E3%81%A7%E3%83%80%E3%83%B3%E3%83%97%E3%81%AE%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%82%92%E8%A1%8C%E3%81%86
ミニダンプとフルダンプの違い
こちらにメモした。
https://qiita.com/tera1707/items/e64fad902e51122852e9
参考
MS公式 WERを使ったダンプの採取方法
https://docs.microsoft.com/en-us/windows/win32/wer/collecting-user-mode-dumps