Windowsでプログラムが開いているリソース(ファイルやレジストリなど)を調べる

今日質問をもらって思い出したことがあるのですが、以外に知られていなくて場合によっては非常に役に立つことがあるのでご紹介します。


あるアプリでファイルをオープンしようとするとそのファイルは既にオープンされているのでオープンできないとか書き込みや削除できないとか言われたりすることがあります。
そんなときに該当のファイルを使用しているプロセスがどれか調べたいときがあったりします。
あるいはあるアプリケーションの挙動としてどんなファイルをオープンしているか、レジストリのどのキーにアクセスしているか、同じファイル名のDLLが存在していてあるプロセスが現在ロードしているDLLはどのDLLファイルかなどを調べたいときがあったりします。
そんなときにはSysinternalsProcess Explorerを使用して調べることができます。
リソース(ファイルやレジストリなど)を使用しているプログラムを調べる場合には以下の手順で行います。

  1. Process Explorerを起動する
  2. FindメニューのFind Handle or DLLを選択するか、双眼鏡アイコンをクリックしてProcess Explorer Searchダイアログを表示する
  3. Handle or DLL substringのテキストボックスに調べたいリソース名に含まれる文字列を入力してSearchボタンを押す
  4. 該当する文字列を含むリソース(正確にはハンドル)を使用しているプロセスの一覧が表示される
  5. 特定のプロセスの詳細を見るためには該当するプロセスの行をダブルクリックする

あるプロセスが使用しているリソースを調べる場合には、Process Explorerのプロセス一覧が表示されているウィンドウで該当のプロセスを選択すると下部のウィンドウに該当のプロセスが使用しているハンドルの一覧が表示されます。
このハンドルのTypeがFileのものが該当のプロセスが使用しているDLLおよびファイルです。
TypeがKeyのものが該当のプロセスがアクセスしているレジストリキーです。
他にもWindowsでハンドルとして扱われるリソースの使用状況が見れます。
場合によっては、例えばハングしてファイルなどのリソースをつかみっぱなしになった状態を解消するために、特定のリソースの行を選択して右ボタンクリックで強制的に該当のリソースをクローズしてしまうこともできます。(その後の状況は保障できませんのでご注意ください)


また、特定のプロセスについては該当のプロセスの行をダブルクリックしてプロセスのプロパティのダイアログを表示することで該当のプロセスの状態の詳細な情報を見ることができます。
情報の内容はダイアログの各タブをクリックして表示してみればだいたいわかると思いますが、私個人的に特徴的な使い方としてはデッドロックやループによると思われるCPUをほぼ100%占有するプログラムの状態を調査するためにThreadsタブを開いて、そこで表示されるスレッドの行をダブルクリックするか、行を選択した状態でstackボタンをおして、該当のスレッドのコールスタックを調べます。
特にCPU100%の現象の場合には特に負荷が高いスレッドを選んでコールスタックを調べればどのあたりでループしているのかがわかります。
場合によってはCPU100%の状態を解消するために該当のスレッドを選択して右ボタンクリックで強制的にスレッドを破棄してしまうこともできます。(その後の状況は保障できませんのでご注意ください)


とにかくProcess Explorerは非常に強力で様々な使い道があります是非とも活用してみてください。
ただ、システム的にかなり強引なことができますのでその操作によるその後の動作や障害は保障できません。
くれぐれもご自身の責任でご利用ください。