RAMMap

 

皆様、はじめまして!
WDK サポートチームのI沢(アイザワ)と申します。
今月からこのブログに参加させていただきますので、どうぞよろしくお願いいたします。

初投稿の内容としまして、「メモリに関する問題のデバッグ方法」をご紹介したいと思います。デバッグ方法と言いましても、たくさんの方法がございますので、今回はその一例として「RAMMap」というツールをご紹介いたします。他の方法につきましては、次回以降の機会に取り上げたいと思いますのでご期待ください!

ちなみに、今後取り上げたいツール候補は下記のような感じで考えております。 

・Kernel Memory Space Analyzer

   https://www.microsoft.com/en-us/download/details.aspx?id=15877

・Debug Diagnostic Tool

   https://www.microsoft.com/en-us/download/details.aspx?id=26798

・Desktop Heap Monitor

   https://www.microsoft.com/en-us/download/details.aspx?id=17782

 

■RAMMap とは?

RAMMap は Windows Sysinternals ツールの 1 つです。
現在、メモリがどのように割り当てられているのか、割り当てられたそれぞれの領域はどういう状況なのか…さらには特定の物理アドレスのメモリ使用状況まで表示してくれます。RAMMap の優れている点は、それらを非常に簡単に行えるというところです。基本的には実行ファイルをダブルクリックするだけで情報が表示されます。さらにメモリのスナップショットも保存可能で、コマンドラインからの実行も可能とその手軽さから初期解析にはうってつけのツールではないでしょうか。

■スナップショットの取得

1. まずはツールを取得しましょう!以下のサイトから RAMMap をダウンロードします。
RAMMap
    https://technet.microsoft.com/ja-jp/sysinternals/ff700229.aspx

2. 次にダウンロードした RAMMap.zip を解凍しましょう。解凍すると中に RAMMap.exe が格納されています。この exe ファイルをメモリ状態を取得したい Windows PC の適当な場所に格納します。ただし、動作環境として Windows Vista、Windows Server 2008 以降のバージョンであることが必要ですので、その点のみご注意ください。

3. RAMMap.exe をダブルクリックします

4. 管理者権限が必要であるため、権限が不足している場合は、昇格ダイアログが表示されます

5. 管理者権限となるよう昇格ダイアログを操作します (ユーザ名とパスワードの入力や昇格の[はい]・[いいえ]の選択など)

6. 上手く実行できると次のようなウィンドウが表示されます。いろいろ表示されておりますが、一旦無視して、メニューの [File] ->
[Save...] を選択してファイル名を入力し [保存] を選択すると、スナップショットの取得完了です。

image

■スナップショット取得環境を整える

さてスナップショットが取得できたので、中身を見ていきたいところなのですが、その前に 1 つ RAMMap の重要な機能をご紹介します。メモリに関するテストを複数回行う場合に、毎回同じようなメモリ環境を作りたいと思っていてもなかなか難しいのではないかと思います。そこで RAMMap には、特定の領域を空 (Empty) にする機能がついています。空にすることで、メモリをきれいな状態に戻すことができるので、スナップショットを取る前に実行すると、スナップショット同士の比較が行いやすくなります。メニューから [Empty] を選択し、そこから空にしたい領域を選択することで、お手軽に実行可能です。

例えば、 [Empty Stanby List] を選択すると… 

image

Stanby 領域が空にされたことがわかりますね!空にされた領域は、未使用領域として扱われ必要に応じて再度割り当てなおされます。 

image

 

■スナップショットの解析

さぁいよいよスナップショットの解析に移りましょう!と言っても、ただいつも通りの結果を眺めていても面白くありませんので、今回はテスト用の実行ファイルをこっそり走らせております。上手くそこまでたどり着くことができるでしょうか…!

さて、まずは [Use Counts] タブを見ていきましょう。これはメモリの割り当て状況をグラフィカルに表示してくれます。例えば、以下の画像は私の PC の普段の割り当て状況を取得したものです。ここはまぁこんなものかなと眺めておきましょう。

image

そろそろ仕込んだテスト用の実行ファイルが効いてきた頃でしょうか。PC  の調子がおかしいなと思いこんでスナップショットを採取してみると… 

image

なんと Page Table に割り当てられている領域が 1 割近く増加しているではありませんか!Process Private 領域の Total と Active も増えていることから、なんらかのプロセスの影響かな…?と推測できます。さで、プロセスが怪しいと踏んだところで、[Processes] タブに移りましょう。 

image

[Processes] タブでは、各プロセスのメモリ使用状態が表示されます。上の画像では表示を Page Table サイズ順に並べ替えているのですが、名前からも一目で 「MemEater」 というプロセスが怪しいことがわかります。あとは実際に、このプロセスがどのような処理をしているのかを調べていけばよさそうですね!出来レース感はありますが、見事にテスト用の実行ファイルにたどり着くことができました!

ちなみに 「MemEater」 の中身は HeapAlloc 関数を while 文で呼び続けて、意味もなくメモリを割り当て続けるというものとなっております。ですので、メモリが割り当てられるたびに Page Table にデータが追加されるため、解析したような症状になっているというわけです。HeapAlloc 関数につきましては、以下の URL に詳細が記載されておりますので、こちらをご参照ください。

HeapAlloc
https://msdn.microsoft.com/ja-jp/library/cc430107.aspx 

上記以外にも様々な情報が取得できますが、そのいずれもタブをクリックするだけで簡単に表示可能です。その簡単さが RAMMap の一番のオススメポイントだと思っておりますので、皆様も是非お気軽にご使用ください!

以上で紹介を終わりたいと思いますが、少しでもみなさまのご参考になれば幸いです。ではまた、メモリに関するデバッグ方法でお会いしましょう!