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
カレントスレッドの TIDt0 - 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)
レジスタ
メモリ
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 の情報を表示する
スレッド
メモリ
!address [-summary]
プロセスが使用するメモリの情報を表示する!address Address
Address がどのようなメモリ領域なのか表示する。出力結果のUsage:
行を確認する!heap
スタック
!uniqstack
全てのスレッドのスタックを重複を除去して表示する
ロック
!locks
プロセス内のロックされているクリティカルセクションを一覧表示する
ハンドル
!htrace
ハンドルの Open / Close を実行するすべての呼び出しをスタックトレース付きで監視する OS の機能を有効にする!htrace -enable
ハンドルトレースを有効にし、-diff オプションによって初期状態として使用するハンドル情報の最初のスナップショットを取得する!htrace -diff
取得したハンドル情報の最後のスナップショットと比較し、削除のスタックがないスタックトレースだけを表示する!htrace -disable
ハンドルトレースを無効にする
!handle [Handle] [Flag] [TypeName]
プロセスが所有するハンドルに関する情報を表示するHandle
:0
を指定するか、省略すると全てのハンドルが表示される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
型情報
!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 - スレッドの一覧をスタックトレース付きで表示する