Process Monitor
皆さん、こんにちは。A寿です。
突然ですが、皆さんは、ワニを食べたことがありますか?・・・このお話にご興味のある方は本文の最後の【閑話】までどうぞ。
さて、今回は、Windows Sysinternals ツールの 1 つ、Process Monitor を紹介します。Process Monitor は、プロセスが行った処理 (ファイル システム、レジストリ、プロセスおよびスレッドの活動) をリアルタイムで表示するツールです。このツールは、ドライバーやアプリケーション開発時だけでなく、運用時でも、ファイルやレジストリの操作や、DLLのロード等、様々なシステム上のトラブルシューティングで利用されています。
私たちも、このツールのログの採取方法や調査方法をお客様にご案内することがありますので、その一例の手順をご紹介しようと思います。
■ログの採取
(1) 以下のサイトから Process Monitor をダウンロードします。
Process Monitor
https://technet.microsoft.com/ja-jp/sysinternals/bb896645.aspx
(2) ダウンロードした ProcessMonitor.zip を問題が発生している環境の任意のフォルダーに置き、unzipします。
今回は、例として、C:\temp フォルダに置き、解凍し、ProcessMonitor フォルダができたとします。
ProcessMonitor フォルダの中に、以下の通り、Procmon.exe があることが確認できます。
C:\temp\ProcessMonitor>dir ドライブ C のボリューム ラベルは OSDisk です ボリューム シリアル番号は 2460-8F6F です
C:\temp\ProcessMonitor のディレクトリ
2013/09/20 16:19 <DIR> . 2013/09/20 16:19 <DIR> .. 2013/09/20 16:19 7,005 Eula.txt 2013/09/20 16:19 63,582 procmon.chm 2013/09/20 16:19 2,489,024 Procmon.exe 3 個のファイル 2,559,611 バイト 2 個のディレクトリ 396,749,033,472 バイトの空き領域 |
(3) Procmon.exe を実行します。
(4) 管理者権限が必要であるため、権限が不足している場合は、昇格ダイアログが表示されます。
(5) 管理者権限となるよう昇格ダイアログを操作します。(ユーザ名とパスワードの入力や昇格の[はい]・[いいえ]の選択など)
(6) Process Monitor の起動後、自動的にファイルシステム、レジストリ、プロセスおよびスレッドの活動の記録を開始し始めます。(起動オプションに /NoConnect を指定すると自動ログ機能は動作しません。)
例えば、下記の画面の下側の Showing ... of ... events という部分の数字が増えていきます。
(7) 虫眼鏡のアイコン ([Capture] ボタン) をクリックし、記録を停止します。
下記の画面の上部の赤い四角で囲った部分が [Capture] ボタンです。
これは、まだ現象を再現させる前の段階のため、現時点では、活動を記録する必要がないためです。
(8) 記録を停止すると、虫眼鏡のアイコン ([Capture] ボタン) に×がつきます。
(9) メニューの [Edit] - [Clear Display] をクリックし、記録されたログを削除します。
下記の画面の左下に No events (capture disabled) と表示されています。
(10) 再現手順の準備をします。(まだ、再現手順は実施しないでください。)
例えば、今回は、c:\temp\a.tmp というファイルがあるとして、コマンドプロンプト上で c:\temp\ フォルダ内で、del a.tmp を実行し、
a.tmp ファイルを削除する時の OS の動作を確認することにします。
そのため、ここでは、コマンドプロンプトを起動し、temp フォルダに移動し、del a.tmp までを入力し、Enter を実行する前で止めておきます。
C:\temp>del a.tmp |
(11) 虫眼鏡のアイコン ([Capture] ボタン) をクリックし、記録を開始します。
Process Monitor 上の表示は、(6) の図のようになり、ログが増えていきます。
(12) 再現手順を実施します。
大量のデータがログされるため、極力 迅速に操作ください。
今回は、コマンドプロンプト上で表示されている del a.tmp に対して、Enter を入力します。
(13) 虫眼鏡のアイコン ([Capture] ボタン) をクリックし、記録を停止します。
Process Monitor 上の表示は、(8) の図のようになり、ログが増えるのが止まります。
(14) [File] - [Save...] をクリックします。
下記のウィンドウが表示されます。
(15) [All events] と [Native Process Monitor Format] をクリックします。
(16) 任意のファイル名を入力し、PML ファイルを保存します。
ここでは、(15) の図の通り、c:\temp\ProcessMonitor\Logfile.PML に保存したとします。
(17) この PML ファイルをシンボルファイルのアクセスができるデバッグが可能な環境にコピーします。
■ログの調査
(1) デバッグが可能な環境でProcmon.exe を実行します。
(2) [File] - [Open...] をクリックし、PML ファイルを選択し、開きます。
(3) ログの内容を確認します。
(4) ログが多くある場合にフィルターリングします。
今回は、コマンドプロンプトを使っていること前提としているため、cmd.exe でフィルターしてみます。
4-1) [Filter] - [Filter...] をクリックすると、以下の画面が表示されます。
4-2) 画面上部のドロップダウンリストの左から、[Process Name]、[is]、[cmd.exe]を選択し、[Add]を押すと以下の図のようになります。
4-3) OK を押すと、以下のように、再現手順時の cmd.exe のみの動作を確認できます。
以下の図の通り、cmd.exe で del a.tmp を実行しただけなのに、多数のファイル操作が行われていることがわかります。
4-4) 他にも、以下のようなフィルターが行えます。
左の[Path]、真ん中の[contains]はドロップダウンリストで選び、右のボックスでは[a.tmp]と記入して[Add], [OK] すると、
今回の操作対象である、a.tmp に関する処理のみに絞り込めます。
例えば、上記の図の赤い四角で囲った部分に CreateFile の Operation 時の Options に Delete On Close がある通り、
ファイル削除が 必ずしも、SetInformationFile (IRP_MJ_SET_INFORMATION) にて FileDispositionInformation を指定する場合だけではなく、
CreateFile() にて FILE_FLAG_DELETE_ON_CLOSE flag を指定する場合もあるということがわかります。
このように、お客様から伺った状況や、正常系と異常系の比較、エラーしているエントリ等、
フィルターする条件をいろいろ変えて状況を見ていくこともよくあります。
上記がご参考になれば幸いです。
ではまた。
――――――――――――――――
【閑話】突然ですが、皆さんは、ワニを食べたことがありますか?
私は南半球の某国で食べたことがあります。友人たちと一緒に店に入り、カンガルーだけでなく、ワニも食べられるということにすごく驚き、物は試しということで、食べてみました。鳥のササミに似た感じの味がして、おいしくいただきました。ワニを食べている間、友人の一人が、なぜか店員の女性から、ワニの人形で腹をつつかれ、むちゃくちゃ驚いていたのが面白かったです。普通、レストランで食事をしていて、店員にいたずらされることはないですから。ワニを食べた話を、最近、中国語の先生たちにしたところ、一様に「怖くなかった?」と聞かれましたが、全然怖くありませんでした。なぜなら、生きたままのワニを食べようとするのではなく、ワニは、調理されて、お皿に載っていましたから。いったい何を想像されたのか、そっちの方が怖くて聞けませんでした。皆様も、あまり過激な想像をしないよう、ご注意ください。