メモリダンプに !analyze -v するまで・前編 ~ ダンプの取り方~
WDKなみなさま、お久しぶりです。さなえすです。
Windows のデバイスドライバーを書いたことがある方であれば、開発中にブルースクリーン(BugCheck、BSOD など呼び方は様々ですが)に遭遇することは避けて通れないことはご存知かと思います。実際、私たち WDK サポートチームでも、「ブルースクリーンが発生するんですけど」という問い合わせをいただくことは少なくありません。もちろん私たちも現象発生の経緯についてヒアリングを行い問題の把握に努めていますが、実際のところ、現象発生時のダンプファイルやお客様のドライバのシンボルファイルなどを頂いていない状況で、ブルースクリーンの発生原因を的確にお答えするのはなかなか難しいものです。。
そんなとき! せめて問題が起きるタイミングでのコールスタックの情報などがあれば、私たちサポートエンジニアとしても、スムーズに状況把握ができ、早い時点で調査の方向や具体的な調査内容をご提案できるんじゃないかと思います。それなので、自力でダンプ解析する際だけでなく、サポートにお問い合わせいただく際にも、今日のトピックを活用していただけると嬉しいです♪
まあ、前置きはこれくらいにしましょう。というわけで、題して『メモリダンプに !analyze -v するまで』を説明したいと思います。
とはいえ、ここのところ、内容の濃い話題が続きましたので、前編と後編に分けてゆっくりいきたいと思いますので、どうぞお付き合いください。
「メモリダンプに !analyze -v するまで・前編 ~ ダンプの取り方 ~ 」
メモリ ダンプの作成は Windows オペレーティングシステムの機能のひとつです。メモリ ダンプ ファイルとは、メモリ上のデータをファイルとしてディスクに書き出して保存されたファイルのことですが、よく「メモリのスナップショットです」という写真に例えた表現をします。かなり言い得た表現ですね。現場の状況を撮影した静止画だと思ってください。ですから、ダンプ ファイルの解析をする時は、写真の中に状況証拠が揃っていれば、犯人を特定することもできるということです。ですが、あくまでも静止画であって動画ではないので、時系列に起こった出来事については、現場の状況から推理しなくてはいけません。(ちなみにですが、サポート案件として、時系列に起こった出来事を調査する際は、お客様にトレース ログを取っていただいたり、ライブデバッグ用の再現環境をお借りして調査を進めております。)
Windows Vista、Windows Server 2008、Windows Server 2003、Windows XP、および Windows 2000 のメモリ ダンプ ファイル オプションの概要
https://support.microsoft.com/kb/254649/ja
1. カーネルデバッグと完全メモリダンプファイル
再現性が低い現象を一生懸命調査する中、せっかくメモリ ダンプ ファイルが取れたのに、その他のコンテキストの情報が全然含まれていなくて全然解析が進まなかった…。これは悲しいですね。まずは、現象が発生する前に、ターゲットPCのメモリの内容が全てダンプ ファイルに書き込まれるように、ダンプ ファイルの設定を [完全メモリ ダンプ] に設定しておきましょう。カーネル デバッグを前提としている場合、このダンプ ファイルの設定は [完全メモリ ダンプ] にしておいた方が良いと思います。カーネル メモリ ダンプも、その他のスレッド情報は入ってませんので、残念ながら “解析” にはこと足りません。設定方法は簡単です。
[スタート]
>[コンピュータ] を右クリックで [プロパティ]
>[システムの詳細設定] タスクで [システムのプロパティ] を開く
>[詳細設定] タブを選択し [起動と回復] の [設定] ボタン
>[デバッグ情報の書き込み]のプルダウンより[完全メモリダンプ]を選択
ちなみに、私は、テスト マシンでは [自動的に再起動する] のチェックもはずしています。ブルースクリーンが発生しているのに気がつかないことがあるかもしれないからです。
なお、最近の PC はメモリー積載量が多くなってきています。PC のメモリーが 2GB 以上の場合、ここで[完全メモリダンプ]が選択できない可能性があります。その場合は システム構成ユーティリティを使用して最大メモリーの量を調整してください。
[スタート] より msconfig を起動します
>[ブート]タブを選択
>[詳細オプション] で [最大メモリ] の値を変更できます
How to generate a kernel or a complete memory dump file in Windows Server 2008
https://support.microsoft.com/kb/969028/en-us
2. 現象(ブルースクリーン)発生!
調査している問題の状況に応じて、メモリ ダンプ ファイルの採取方法を選びましょう。メモリ ダンプ ファイルが作成されるシナリオは様々です。
2 . - 1 .現象発生時に作成されるメモリダンプファイル
さて、現象が発生し、問題のブルースクリーンに遭遇したとします。この時、画面が青くなったのに驚いて、メモリ ダンプ ファイルの作成準備中に無理に電源を切ったりしないでくださいね。このときシステムは、ダンプファイルを作成する準備をしています。カウンターが動いている間は静かに待って、テスト マシンを再起動しましょう。
2 . - 2 . Driver Verifier などツールを使用して作成されるメモリダンプファイル
他にも メモリ ダンプ ファイルの採取が目的な場合、ただ現象が起こるのを待つだけでなく、前回「ドライバー検証ツール」の回でご紹介した Driver Verifier + Gflagsを使用するなどしてメモリ ダンプ ファイルを採取してもよいと思います。(ユーザーモードでは Application Verifier もありましたね。) Deadlock の検出など、様々な調査のシナリオに使えます。
2 . - 3 .キーボード操作で作成できるメモリダンプファイル
その他、任意のタイミングでメモリ ダンプ ファイルを作成したければ以下の技術情報に紹介している方法もあります。以前は、PS/2キーボードでしか使えない技だったのですが、USB キーボードでもできるようになりました。設定をしておけば、キーをポンポンと叩くだけで、システムをクラッシュさせ、メモリ ダンプ ファイルを作成することができちゃいます。この場合、ダンプファイルの STOP コードなどから問題のアタリをつけていくことはできないですが、PC がハングしている(ように見える)際に、何のプロセスが問題になっているのか特定することができるかもしれません。
キーボード操作でメモリ ダンプ ファイルを作成できる Windows の機能
https://support.microsoft.com/default.aspx/kb/244139/ja
2 . -4.カーネルデバッガからコマンド操作で作成できるメモリダンプファイル
キーボード操作によるダンプファイル作成ができない場合でも、カーネル デバッガの WinDBG がつながっていれば、ホスト PC から ”.crash”というコマンドを送って意図的にターゲット PC をクラッシュさせ、ダンプファイルを作成することができます。また、”.dump” というコマンドを送って、ターゲット PC をクラッシュさせずに、ホスト PC 側にて、ターゲット PC の情報を収集し、ダンプファイルを作成することもできます。ただし COM ポート接続の場合、.dumpによるフルダンプの採取は非常に時間がかかりますのでご注意を!( 何日間もかかってしまう場合がありますので、あまりお勧めしません。)COM ポート接続に比べ 1394 接続の場合は、わりと早く採取できるみたいですね。
Forcing a System Crash from the Debugger
https://msdn.microsoft.com/en-us/library/cc266503.aspx
.dump (Create Dump File)
https://msdn.microsoft.com/en-us/library/cc266761.aspx
.crash (Force System Crash)
https://msdn.microsoft.com/en-us/library/cc266778.aspx
2 . -5. KeBugCheck 関数を使用
その他にも、テストやデバッグ目的であれば、自分の カーネル ドライバから、直接 KeBugCheck 関数を呼び出してもいいかもしれません。
このように、メモリ ダンプ ファイルを採取すると言ってもいろいろあります。とにかく、何らかの形でブルースクリーンが発生し、メモリ ダンプ ファイルの作成準備ができたので、再起動したことにします。(もし、Windows がどのようにダンプ ファイルを作成しているのか知りたい!という方は “ 『インサイド Microsoft Windows 第 4 版 ( 下 ) 』の P437 14.3.1 クラッシュダンプの作成 “ を参照してみてください。)
システムが起動したら、“C:\Windows” の下を見てみてください。そこに「MEMORY.DMP」というファイルが作成されているはずです。これが、メモリ ダンプ ファイルです。(既定では、このシステム ルートにメモリ ダンプ ファイルが作成されます。もし、メモリ ダンプ ファイルの生成場所を変更したかったら、上記の [起動と回復] の設定で変更ができますよ。)
さて、メモリ ダンプ ファイルは作成されていましたでしょうか?
次回の 「メモリダンプに !analyze -v するまで・後編 」では、メモリ ダンプ ファイルを実際に開いて、コールスタックを確認してみましょう♪
それでは、また!
♪♪♪ お知らせ ♪♪♪
先日、MSDN にて Windows デバイスドライバー開発のコミュニティが立ち上がりました。
皆さまの間での情報交換の場として、是非ご活用ください!!
Windows デバイスドライバー開発フォーラム開設
https://social.msdn.microsoft.com/Forums/ja-JP/windowsdevicedriverja/