Windowsは、コンピュータが予期せぬ停止をした場合に、ダンプファイルと呼ばれるファイルにデバッグ情報を書き出すことができる。
ダンプファイルの形式は複数存在するが、以前、完全メモリダンプと呼ばれる種類のダンプがファイル(既定ではMEMORY.DMPというファイル名になる)に出力されないことがあったため、解決までの流れをまとめた。
検証環境は以下の通り。Azure VM上での検証を実施した。
- OSエディション:Windows Server 2022
- バージョン:Datacenter
- SKU:Standard B2s (2vcpu、4 GiBメモリ)
- ディスク: OSディスク(128GB Standard SSD) / 一時ディスク(8GB)
メモリダンプの種類とダンプファイルについて
ダンプファイルの種類について。
名称 | 概要 |
最小メモリダンプ | 最小セットの記録。256KBで出力。 |
カーネルメモリダンプ | カーネルメモリのみが記録される。 |
アクティブメモリダンプ | 使用中のメモリ領域のみが記録される。 |
完全メモリダンプ | システムメモリのすべての内容が記録される。 |
自動メモリダンプ | カーネルメモリダンプと同じ内容だが、 メモリダンプ生成の際に利用する ページングファイルのサイズが自動で調整される。 |
ダンプファイルの名称は既定でMEMORY.DMP、配置はC:\Windows\となっている。いずれも[システムの詳細設定] > [起動と回復] の以下の項目で設定変更できる。
ダンプファイル(MEMORY.DMP)が生成・出力されない際の解決ヒント
状況と流れ
状況としては、Sysinternals Suiteのツールnotmyfalutでコンピュータを停止させてダンプファイル出力を実施、コンピュータ再起動された。その後、設定されたダンプファイル出力先を確認したが、所定のフォルダにMEMORY.DMPファイルが作成されていなかった、という状態であった。
先にオチを書いてしまうと、自分の環境の場合、ページングファイル(pagefile.sys)のサイズに問題があった。
メモリダンプファイルが作成される際に、全てのメモリダンプ情報は一時的にページングファイルに格納される。つまり、ページングファイルは全メモリダンプ情報を一時的に収められるだけのサイズが求められる、ということになる。
メモリダンプの種類によって必要になるサイズは異なるが、完全メモリダンプの場合は、物理メモリのサイズ+300MB程度のサイズが必要となる。
公式には、物理メモリのサイズ+1MBと記載されているが、全メモリサイズ4045MBに対して最大サイズ4096MBのページングファイル設定でも当該事象は発生したため、おそらく誤記か何かだろうと思われる。
以下に、メモリダンプを出力した上で、当該事象を確認した際の流れをまとめる。
仮想メモリとページングファイルの設定は以下の通り。
ダンプファイル出力の設定は以下の通り。
PowerShellもしくはコマンドプロンプトで、Sysinternalsのフォルダに移動しnotmyfaultを実行する。
notmyfault /crash
しばらくするとコンピュータがフリーズし、強制的に再起動が行われる。
再起動後、RDPでコンピュータに接続、ダンプファイル(既定ではC:\Windows\MEMORY.DMP)を確認したが、作成されていないことがわかる。
併せてC:\Windows\Minidumpフォルダを確認したが、設定に反して最小メモリダンプが作成されていることが確認できた。
イベントビューアーにて、ダンプファイルが生成されるタイミングのシステムログを確認した。
クラッシュダンプのページングファイルの作成に失敗、ページングファイルのサイズが足りていないことを示すエラーが出力されている。
ダンプファイル自体は生成されているが…
作成されたのは完全メモリダンプ(MEMORY.DMP)ではなく最小メモリダンプであることがわかる。
解決方法
ページファイル(pagefile.sys)のサイズを適切な大きさにすることで本事象は解決した。実施した流れと結果を記載しておく。
以下のPowerShellスクリプトで物理メモリ+300MBのサイズを計算。自分の環境では4345MBとなった。
$MemInfo=Get-WmiObject Win32_OperatingSystem
$TotalPhysicalMem=[Math]::Round($($MemInfo.TotalVisibleMemorySize / 1024))
$PagingfileSize = $TotalPhysicalMem + 300
Write-Host $PagingfileSize
コマンドプロンプト or PowerShellを開いて、以下のコマンドでページングファイルのサイズを変更する。ページングファイルの配置場所は環境によってことなるので各位確認してほしい。ページングファイルの配置場所についてはこちらの過去エントリも参考になる。(本来であれば4345(MB)で行けそうだがもう少し余裕を見て4500(MB)で設定してみた。)
reg add "HKLM\System\CurrentControlSet\Control\Session Manager\Memory Management" /v PagingFiles /t REG_MULTI_SZ /d "D:\pagefile.sys 4500 4500" /f
これで完全メモリダンプ情報を保持できるだけのサイズが確保されたはずだ。
次にコマンドプロンプト or PowerShellでnotmyfaultを実行し、コンピュータをクラッシュさせる。
notmyfault /crash
再起動後、RDPでコンピュータに接続、完全ダンプファイルがC:\Windows\MEMORY.DMPとして作成されていることが確認できた。
またイベントビューアーで確認できた、ページングファイルのサイズ不足を表すエラー情報は出力されておらず、下記の通り、MEMORY.DMPファイルが生成されたエラーログ(うまくいったのにエラーログなのか…)が作成されたことを示すログが確認できた。
コメント