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 追記)ただしアプリは信頼されている必要がある