VMMap

皆様、お元気でしたでしょうか!WDK サポートチームのI沢(アイザワ)でございます。

なんと前回に続いて連投させていただきます!このままこのブログを乗っ取るぐらいの勢いで行きたいと思いますので、どうぞよろしくお願いいたします。

 

2 回目の投稿内容としましては、前回の記事でご紹介した「RAMMap」と同様に「メモリに関する問題のデバッグ方法」の 1つとして「VMMap」というツールをご紹介したいと思います。 「RAMMap」と「VMMap」で名前が似ておりますが、機能も近いところがありまして、2 つのツールを合わせてご使用いただくことで、お手軽にデバッグの幅を広げられるのでお勧めです!

 

ちなみに、前回記事「RAMMap」につきましてはこちらをご参照ください。

https://blogs.msdn.com/b/jpwdkblog/archive/2014/04/22/rammap.aspx

 

■VMMap とは?

VMMap は Windows Sysinternals ツールの 1 つで、"プロセス" の仮想メモリと物理メモリの割り当て状況を分析し、グラフィカルに表示してくれるツールです。 RAMMap は、メモリ全体の割り当て状況を表示してくれたのに対して、こちらは "プロセス" にフォーカスを合わせたツールとなっております。 つまり、この 2 つのツールを組み合わせて使用することで、まずはメモリ全体の使用状況を RAMMap で把握して、怪しいと思うプロセスを特定したら VMMap で詳細を見ていくというデバッグが可能となります! また、複数形式でのデータのエクスポート機能が備わっていたり、コマンドラインから実行可能であったりと、その手軽さとは裏腹に非常に機能が充実しておりますので、これを機に活用していただけると幸いです!

 

■なにはともあれ実行してみよう!

1. まずはいつも通りツールを取得しましょう!以下のサイトから VMMap をダウンロードします。

    VMMap

    https://technet.microsoft.com/ja-jp/sysinternals/dd535533.aspx

2. 次にダウンロードした VMMap.zip を解凍しましょう。解凍すると vmmap.exe が格納されておりますので、この exe ファイルをメモリ状態を取得したいプロセスが動作している Windows PC に保存しましょう。

3. VMMap.exe を勢いよくダブルクリックします。

4. すると以下の図のような「Select or Launch Process」ウィンドウが表示されます。「View a running process」タブにずらーっとプロセスが並んでるのが確認できるかと思いますが、この中からメモリ割り当て状況を確認したいプロセスを一つ選んで、[OK] を選択することで解析対象プロセスが決定されます。今回は適当に explorer.exe を選んでみました。すでにお気づきの方もいらっしゃるかと思いますが、「Launch and trace a new process」というタブも確認できますね。なんとこちらの機能を使うことで新規プロセスを立ち上げてメモリ状況をトレースできるんですね!状況に合わせて使い分けましょう。

clip_image002

5. さぁプロセスのメモリ状況が表示されましたでしょうか!以下のようなウィンドウが表示されれば実行成功です!explorer.exe がどのぐらいメモリを使用していて、どういった用途でしようしているのかが一目で確認できるかと思います。

clip_image004

 

■解析もしてみよう!

さて、前回記事「RAMMap」で活躍した “MemEater.exe” に今回も活躍していただきたいと思いますが、ここではとりあえず挙動の怪しいプロセスだと思っていただければ問題ありません。 さぁ!今、あなたは RAMMap を使用して、怪しいプロセス “MemEater.exe” の存在を突き止めることができました。特定のプロセスに対象を絞ることができたので、こういうときこそ VMMap の出番です。早速、VMMap を起動して最初の画面で “MemEater.exe” を選択します。

ちなみに “MemEater.exe” の活躍が載っている前回記事「RAMMap」こちらです。(本記事 2 度目のご案内)

https://blogs.msdn.com/b/jpwdkblog/archive/2014/04/22/rammap.aspx

 

clip_image006

 

すると、以下のような情報が取得できました!

 

clip_image008

 

これだけではなんとも言えない状況ですので、このプロセスのメモリがどれぐらいフラグメンテーションを起こしているか見てみましょう。 メニューの [View] -> [Fragmentation View] を選択すると…

 

clip_image010

 

なんとフラグメンテーション度合いをグラフィカルに表示してくれるんですね!すばらしい! ただこの時点では綺麗にメモリ確保されてるなーというところしか読み取れないのでさくさく次に進みましょう。

 

clip_image012

 

それでは、メニューの [View] -> [Refresh] を選択して表示されている情報の更新を行ってみましょう。

 

clip_image014

 

以下のような結果が得られました! Heap が 3 倍近く増えていることがわかりますね!ということはこのプロセスにはかなり激しいメモリリークが疑われます。

 

clip_image016

 

さらにフラグメンテーション状態を確認してみると…

 

clip_image018

非常に綺麗にメモリを消費していってることがわかりますね!ですので、これはただ単にこのプロセスはメモリ���解放を全くしていないだけなんだろうなと推測がつくわけです。実際、MemEater.exe はひたすら HeapAlloc 関数を呼び続けるだけのプロセスなのでこのような解析結果となっております。というわけで、今回もまた見事にテスト用実行ファイルの内部処理までたどり着くことができました! 

以上、かなり大まかに VMMap の機能を説明させていただきましたが、”プロセス” のメモリ使用状況を把握したい場合は VMMapを、”Windows システム” のメモリ使用状況を把握したい場合は RAMMap を使用していただければと思います。どちらのツールも実行ファイルをダブルクリックするだけで、非常にお手軽に使用可能ですので、是非不具合の初期調査等で有効活用していただければ幸いです。 

今回の記事は以上となりますが、次回も「メモリに関する問題のデバッグ方法」をご紹介できればと思います。 ではまた、お会いいたしましょう!