Mex
Mex は、WinDbg の機能を拡張するツールで、Windows のクラッシュダンプ解析やデバッグを効率化できます。Mex は、デバッグ作業をより簡単にし、分析の精度と速度を向上させるための重要なツールになります。
Mex の導入方法は、こちらの投稿を確認してみてください。
よく使うコマンド(解析系)
カーネルモードのメモリダンプ解析でよく使用するコマンドです。そのまま使用するコマンドとオプションやアドレスを指定するコマンドがあります。オプションやアドレスを指定するコマンドは、使用例を記載しておきます。なお、アドレスは適当なので、実際に解析する際は、アドレスを変更してください。
1. !mex.dumpinfo
メモリダンプに関する詳細情報を表示します。どのようなメモリダンプなのか確認するのに役立ちます。
2. !mex.crash
クラッシュ解析のためにメモリダンプから特定のクラッシュに関する情報を表示するコマンドです。ブルースクリーンが発生した際に出力されたダンプファイルには、まずこれを実行します。
3. !mex.running
CPU で実行中のスレッドに関する情報を表示できます。
4. !mex.ready
実行準備が整っているスレッドのリストを取得するためのコマンドです。ready 状態のスレッドが多数ある場合には、CPU の処理が追いついていないか、なんらかの処理が CPU を占有し続けている可能性が考えられます。
5. !mex.tasklist
システム内のすべてのプロセスとその関連情報を一覧表示します。システム全体の状態把握に便利です。かなりオプションの種類があるので、!mex.tasklist -?
で状況に応じて使えそうなオプションを探してみてください。
6. !mex.p
プロセス情報を取得するコマンドで、プロセス ID やメモリ使用状況などを表示します。確認したいプロセスのアドレスを指定して実行します。
!mex.p ffffd45689abcd80
7. !mex.t
特定のスレッドに関する詳細情報を表示できます。確認したいスレッドのアドレスを指定して実行します。
!mex.t ffffd45689abcd80
8. !mex.listthreads
指定したプロセスが実行しているすべてのスレッドのリストを取得します。各スレッドの状態などを確認できます。確認したいプロセスのアドレスを指定して実行します。
!mex.listthreads ffffd45689abcd80
9. !mex.UniqueStacks
ユニークなスタックトレースをまとめて表示します。似たようなスレッドやスタックトレースをグループ化して、メモリダンプ解析の効率を上げるために使用されます。
#ユーザーモード、カーネルモードすべてのスタックが一致するスレッドをまとめて表示
!mex.UniqueStacks -a
#カーネルモードのみ一致するスレッドをまとめて表示
!mex.UniqueStacks -k
#CPU で実行されている一致するスレッドをまとめて表示
!mex.UniqueStacks -cpu
10. !mex.eresource
ERESOURCE(排他制御のためのオブジェクト)の状態を表示します。デッドロックや競合状態の解析に役立つ情報を表示できます。
11. !mex.WrLpcReply
LPC(ローカルプロシージャコール)の応答待ちになっているスレッドを表示するコマンドです。長時間 LPC 待ちしているスレッドがないか確認するときに使用します。
12. !mex.mreg
レジストリの情報を表示するコマンドで、レジストリの値を確認したいときに使用します。
13. !mex.mods
ロードされているモジュール(DLLや実行ファイル)に関する情報をリストします。どのモジュールがメモリにロードされているかを確認する際に使用されます。
14. !mex.tag
プールタグに関連する情報を取得するコマンドで、メモリプールの使用状況を特定する際に役立ちます。
!mex.tag -a ntfs
よく使うコマンド(ユーティリティ系)
ユーティリティ系のコマンドは解析系のコマンドを組み合わせて使用します。使用方法は、ほぼ Linux のコマンドと一緒です。
1. !mex.grep
出力内容をフィルタリングするために使用します。正規表現に基づいて、特定のパターンを含む行だけを表示させることができます。使い方は !mex.grep -?
で確認してみてください。
2. !mex.cut
出力の指定された範囲や部分を切り取るためのコマンドです。必要な部分だけを表示したい場合に使用します。使い方は !mex.cut -?
で確認してみてください。
3. !mex.ForEachLine
それぞれの行に対して、指定したコマンドを実行するためのループ処理機能を提供します。大量のデータセットを効率的に処理する際に役立ちます。使い方は !mex.ForEachLine -?
で確認してみてください。
活用法
ユーティリティ系のコマンドを使用することにより、解析を少し自動化できます。次の例では、ffffd45689abcd80
のアドレスをもつプロセスのすべてのスレッドの詳細情報を表示できます。
!mex.ForEachLine -x "!mex.t @#Line" !mex.grep ffff !mex.cut -f 3 !mex.listthreads ffffd45689abcd80
さいごに
Mex のコマンドは、紹介したもの以外にもたくさんあり、長いコマンドには、短縮形が用意されていたりします。すべて書くのは大変なので、!mex.help -all
を実行して、ヘルプからいろいろ確認してみてください。