WinDbg コマンド

随時更新予定です。

疑似レジスタ

  • $ip
    命令ポインタレジスタx86: eip x64: rip. も現在の命令ポインタの値に評価される
  • $ra
    現在の関数からのリターンアドレス
  • $retreg
    関数戻り値。x86: eax x64: rax
  • $csp
    現在のスタックポインタ。x86: esp x64: rsp
  • $proc
    カレントプロセス。ユーザーモードデバッガでは PEB のアドレス。カーネルモードデバッガではカレントプロセスの EPROCESS 構造体のアドレス
  • $thread
    カレントスレッド。ユーザーモードデバッガでは TEB のアドレス。カーネルモードデバッガではカレントスレッドの ETHREAD 構造体のアドレス
  • $tpid
    カレントプロセスの PID
  • $tid
    カレントスレッドの TID
  • t0 - t19
    20個の汎用疑似レジスタ

標準コマンド

スレッド

  • ~~[TID]s
    スレッド ID が TID であるスレッドにコンテキストを切り替える

ブレークポイント

  • [~Thread] bp Address ["CommandString"]
    Address にブレークポイントを設定する。スレッドを指定した場合、そのスレッドの時にのみ停止する。ブレークポイントに達する度に実行されるコマンドを指定できる。複数のコマンドを指定する場合はセミコロンで区切る
  • [~Thread] bm Module!Symbol ["CommandString"]
    Symbol にブレークポイントを設定する
  • [~Thread] bu Module!Symbol ["CommandString"]
    まだロードされていないモジュールに(既にロードされていてもよい)遅延ブレークポイントを設定する
  • bl
    ブレークポイントの一覧を表示する
  • bc ID [,ID ...]
    ID のブレークポイントを削除する
  • bd ID [,ID ...]
    ID のブレークポイントを無効にする
  • be ID [,ID ...]
    ID のブレークポイントを有効にする
  • ba <Access> <Size> <Address>
    指定したアドレスにアクセス時に中断する。Access には r: 読み取りまたは書き込み w: 書き込み e: 命令を取得 が指定できる

ステップ実行

  • p
    ステップオーバー。1行実行する。関数があった場合関数を実行して次の行に進む。関数の中に入らず飛ばすので「オーバー」
  • t
    ステップイン。デバッガ―がソースモード l+t の時は単一のソース行、アセンブリモード l-t の時は単一のアセンブリ命令を実行する。プライベートシンボルがない場合はアセンブリモードしか使えない
  • g <Address>
    指定されたアドレスに達するまで実行する
  • gu
    現在の関数が完了するまで実行する
  • pc
    次の関数呼び出しまで実行する

変数の表示

  • dv [Pattern]
    パターンが指定された場合、指定したパターンに一致するローカル変数のみをコマンドに表示する
  • dv /i
    シンボルのタイプと変数のタイプも表示する
  • dv /V
    変数が格納されている位置を表示する

型の表示

  • dt ntdll!_HEAP_ENTRY Address
    Address の ntdll モジュールの _HEAP_ENTRY 構造体の内容を表示する

シンボル

  • x module!symbol
    Symbol のアドレスを表示する
  • ln <address>
    指定されたアドレスのまたはその近くにあるシンボルを表示する

アセンブル (unassembly)

  • ub eip L20
    eip のアドレスから逆向きに 20行逆アセンブルする
  • uf <address>
    指定されたアドレスを含む関数全体を逆アセンブルする

レジスタ

メモリ

  • d (メモリの表示)
    • db Address
      バイト値と ASCII 文字
    • dc Address
      4バイト値と ASCII 文字
    • dd Address
      4バイト値
    • du Address
      Unicode 文字列

スタックトレース

  • kp
    スタックトレースで呼び出される各関数のすべてのパラメーターを表示する。完全なシンボル情報が必要
  • kP
    kp と異なるのは 1つのパラメーターにつき 1行を使って表示する
  • kb
    関数に渡された最初の 4つのパラメータを表示する
  • kf
    関数が使ったスタックサイズを最初のカラムに表示する

便利コマンド

  • ? Num
    Num の 10進数、16進数を変換できる
  • * comment
    コメントが書ける
  • version
    デバッガを実行しているコンピュータの OS のバージョン情報、デバッガーおよび読み込まれているすべての拡張 dll に関するバージョン情報を表示する
  • vertarget
    デバッガを実行しているコンピュータの OS のバージョン情報を表示する

メタコマンド (dot コマンド)

シンボル

  • .reload
    ロードされているすべてのモジュールのシンボル情報を破棄し、デバッガを初期状態に戻す

ソース

  • .srcpath[+] [directory [; ...]] ソースファイルの検索パスを設定または表示する
  • .srcnoisy [0|1]
    ソースファイルの読み込みの詳細レベルを制御する

ログ

  • .logopen /t filename
    デバッガ―での操作・出力をログを filename に記録する
  • .logclose
    開いているログファイルをクローズする

例外

  • .lastevent
    デバッガでプログラムが現在停止している原因となった直近のデバッガイベントに関する情報を表示する
  • .exr -1
    最新の例外レコードの内容を表示する
  • .ecxr
    現在の例外に関連付けられているコンテキストレコードを表示する

拡張機能

  • .chain
    読み込まれたすべてのデバッガー拡張機能を既定の検索順序で一覧表示する

ヘルプ

  • .hh <text>
    HTML ヘルプファイルを開く

拡張コマンド (bang コマンド)

シンボル

  • !sym [noisy|quiet]
    .reload コマンドの詳細ログのオン・オフを切り替える
  • !chksym <module>
    ロード済みのシンボルがイメージに対して正しいかチェックする

モジュール

  • !lmi <Module>
    モジュールに関する詳細情報を表示する
  • !dh <module address>
    モジュールのヘッダー情報を表示する

プロセス

  • !peb
    プロセス環境ブロック PEB の情報を表示する

スレッド

  • !teb
    スレッド環境ブロック TEB の情報を表示する
  • !gle
    現在のスレッドの最後のエラー値を表示する。API がエラーを起こした直後に使用する

メモリ

  • !address [-summary]
    プロセスが使用するメモリの情報を表示する
  • !address Address
    Address がどのようなメモリ領域なのか表示する。出力結果の Usage: 行を確認する
  • !heap
    • !heap -s
      ヒープのサマリ情報を表示する
    • !heap -a Address
      指定したヒープのヒープブロックのリストを全て表示する
    • !heap -l
      GC アルゴリズムを使用して、プロセス内のどこからも参照されていないアクティブなアロケーションを検出する
    • !heap -x Address
      指定したアドレスを含むヒープブロックを検索し、ヒープの使用状況を表示する

スタック

  • !uniqstack
    全てのスレッドのスタックを重複を除去して表示する

ロック

ハンドル

  • !htrace
    ハンドルの Open / Close を実行するすべての呼び出しをスタックトレース付きで監視する OS の機能を有効にする

    • !htrace -enable
      ハンドルトレースを有効にし、-diff オプションによって初期状態として使用するハンドル情報の最初のスナップショットを取得する
    • !htrace -diff
      取得したハンドル情報の最後のスナップショットと比較し、削除のスタックがないスタックトレースだけを表示する
    • !htrace -disable
      ハンドルトレースを無効にする
  • !handle [Handle] [Flag] [TypeName]
    プロセスが所有するハンドルに関する情報を表示する

    • Handle0 を指定するか、省略すると全てのハンドルが表示される
    • Flag:表示する情報を指定し、f が一番情報量が多い
    • TypeName:表示するハンドルの種類を指定する。Event、Section、File、Port、Directory、SymbolicLink、Symbolic、WindowStation、Semaphore、Key、Token、Process、Thread、Desktop、IoCompletion、Timer、Job、WaitablePort が指定できる

SOS (Son Of Strike)

SOS.dll (SOS debugging extension)

SOS.dll は、.NET Framework に含まれている拡張機能 DLL。.NET Framework の各バージョン、各プラットフォーム (32/64-bit) 毎に存在する。デバッグ対象のプログラムと同じ .NET Framework のバージョン、同じプラットフォームの SOS.dll をロードする必要がある。

SOS.dll のロード

  • sxe ld:clrjit; g
    clrjit.dll がロードされるまで実行してブレークする
  • .loadby sos clrgit
    clrjit.dll と同じところにある SOS をロードする

ヘルプ

  • !sos.help [<command>]
    コマンドについての詳細なヘルプを表示する

スレッド

  • !threads
    プロセス内のすべてのマネージド スレッドを表示する。先頭の ID は WindDbg 上でのスレッドID、2番目の ID は CLR のスレッド ID、3番目は OS のスレッドID。

ヒープ

  • !dumpheap
    • !dumpheap -stat
      ヒープの使用状況(型ごとのオブジェクトの数とその総サイズの)を表示する
    • !dumpheap -live -mt <MT addr>
      MethodTable(型)から生きているオブジェクトの一覧を出力する
  • !gcroot <Object address>
    指定したオブジェクトの参照元を表示する

スタック

  • !clrstack [-a][-p][-l]
    マネージコードのみのスタックを表示する。-a: -l と -p 両方 p: 引数を表示 l: ローカル変数を表示
  • !sos.dso
    現在のスタックの範囲内で見つかったすべてのマネージドオブジェクトを表示する
  • !eestack [-EE]
    プロセス内の全てのスレッドのスタックトレースを表示する。-EE オプションを付けるとマネージコードのみ表示する。

例外

  • !pe
    • !pe [<Exception object address>]
      指定したアドレスの例外情報を表示する。アドレスが指定されていない場合、現在のスレッドで最後にスローされた例外が表示される。
    • !pe -nested [<Exception object address>]
      内部例外の詳細を表示する

ブレークポイント

  • !bpmd
    • !bpmd -md <MethodDesc>
    • !bpmd <module name> <class name>.<method name>
      まだ JIT されていないメソッドにブレークポイントを設定できる

型情報

  • !dumpmt
    • !dumpmt <MethodTable address>
      型情報を出力する
    • !dumpmt -md <MethodTable address>
      オブジェクトに定義されているすべてのメソッドの一覧も表示される
  • !dumpclass <EEClass address>
    EEClass 構造体に関する情報を表示する

ロック

  • !syncblk -all
    スレッドが所有している SyncBlock 構造体の情報を表示する。SyncBlock は .Net のロック実装に関係する。

モジュール

  • !savemodule <Base address> <Filename>
    メモリ内の指定したアドレスに読み込まれているイメージを指定したファイルに書き込む

MEX (Managed EXtension)

MEX Debugging Extension for WinDbg

  • .load <path to mex.dll>
    mex.dll をロードする
  • !mex.help
    カテゴリ毎に分類されたヘルプが表示される
  • !mex.di
    ダンプ情報を表示する
  • !grep <keyword> !mex.help -all
    MEX のコマンドで <keyword> を含むコマンドを検索する
  • !tasklist [-cpu]
    プロセスの一覧を表示する
  • !us
    ユニークなスタック一覧を表示する
  • !lt
    スレッドの一覧を表示する
  • !mex.us
    同じスレッドスタックをグルーピングしてユニークなスレッドスタックの一覧を表示する

TTD (Time Travel Debugging)

Time Travel Debugging - Overview

  • g-
    逆方向に実行する

Kernel-Mode

メタコマンド

  • .trap [Address]
    トラップフレームの情報を表示する

拡張コマンド

  • !process 0 Flags XXX.exe
    • Flags: 4 - スレッドの一覧を表示する
    • Flags: 6 - スレッドの一覧をスタックトレース付きで表示する

参考