Sysinternals Process Explorer

無題


Process Explorerは、以前からできる子だと思っていたが、想像以上に万能ツールだということが使うたびに見えてくる。機能をすべて書き出してみたら、すごいことになりそうだ。ヘルプにも全部の機能が網羅されているわけではないし。暇な時にまとめてみたいものだ。


今日ふと見つけた機能は、起動中のプロセスに対してスレッドを一覧を表示する機能。これはプロセスビューから、右クリックでプロパティを開き、「Threads」タブクリックで表示できる。ここでは次のような機能がある。

  • スレッドIDの表示
  • スレッド開始時刻の表示
  • スレッドの実行状態(Wait,Ready,Running等)の表示
  • スレッドのカーネルタイム(カーネルモードでの実行時間)の表示
  • スレッドのユーザータイム(ユーザーモードでの実行時間)の表示
  • スレッドのコンテキストスイッチ回数の表示
  • スレッドの直近のコンテキストスイッチ回数(Delta)の表示*
  • スレッドのベースプライオリティの表示
  • スレッドの実行時プライオリティの表示
  • スレッドCPU負荷のリアルタイム表示*
  • スレッドの開始アドレス(CreateThreadの第3引数)の表示*
  • スレッドの停止(Suspend)/再開(Resume)/強制終了(Kill)
  • 現在のスタックトレース表示


*はりストビューで一覧表示されているもの。


スタックトレース表示までできるとは思わなかった。これにはびっくり。
ただし、Windows CEと違って当然OSファイルにはmapファイルが存在しないため、アドレス表示は mshtml.dll+0xe71a2 といった具合になる。ただし、一部のアドレスは関数名が表示される場合もある。これはDLLのExport Tableから関数名と、先頭アドレスが引ける場合に限られる。(たとえば mshtml.dll!ShowHTMLDialogEx+0x2588)


ちなみに参考までに、Windows CEにはGetThreadCallStack()というAPIが用意されているので、ユーザーアプリからでも任意のスレッドのコールスタックを取得できる。
(23:38 追記)ただしアプリは信頼されている必要がある